2011-09-13 27 views
6

Tôi đã viết tập lệnh sau để hiển thị phần tử ẩn, sau đó sửa vị trí của nó thành tâm của trang.offsetHeight và offsetWidth tính sai trên sự kiện onclick đầu tiên, không phải thứ hai

function popUp(id,type) { 
var popUpBox = document.getElementById(id); 

popUpBox.style.position = "fixed"; 
popUpBox.style.display = "block"; 

popUpBox.style.zIndex = "6"; 

popUpBox.style.top = "50%"; 
popUpBox.style.left = "50%"; 

var height = popUpBox.offsetHeight; 
var width = popUpBox.offsetWidth; 
var marginTop = (height/2) * -1; 
var marginLeft = (width/2) * -1; 

popUpBox.style.marginTop = marginTop + "px"; 
popUpBox.style.marginLeft = marginLeft + "px"; 
} 

Khi chức năng này được gọi bởi sự kiện onclick, offsetHeight và offsetWidth được tính không chính xác, do đó không căn giữa phần tử một cách chính xác. Nếu tôi nhấp vào yếu tố onclick lần thứ hai, offsetHeight và offsetWidth tính toán chính xác.

Tôi đã thử thay đổi thứ tự theo mọi cách tôi có thể tưởng tượng và điều này khiến tôi phát điên! Bất kỳ giúp đỡ được rất nhiều đánh giá cao!

+0

Hmm, mã của bạn có vẻ hoạt động tốt cho tôi? http://jsfiddle.net/mrtsherman/SdTEf/1/ – mrtsherman

+3

@mtrsherman, CẢM ƠN BẠN. Bạn đang jsfiddle cho tôi thấy lỗi của cách của tôi. Hãy lưu ý: nếu bạn không xác định chiều cao và chiều rộng cho phần tử bạn muốn xác định chiều cao và chiều rộng, bạn sẽ không nhận được chiều cao và chiều rộng chính xác bằng cách sử dụng offsetHeight và offsetWidth. – saoyr5

+0

Yay. Vui vì bạn đã giải quyết nó. Vấn đề như thế này, nơi mọi thứ xuất hiện ổn, nhưng không phải - làm cho đầu tôi muốn nổ tung! – mrtsherman

Trả lời

1

Tôi đoán chiều cao và chiều rộng của bạn không được xác định trên cấp độ gốc. Xem fiddle này, nơi nó hoạt động tốt. Cậu bé thông minh. http://jsfiddle.net/mrtsherman/SdTEf/1/

Câu trả lời cũ Tôi nghĩ điều này có thể được thực hiện đơn giản hơn rất nhiều. Bạn đang thiết lập các thuộc tính trên cùng và bên trái đến 50%. Điều này sẽ đặt yếu tố cố định nhẹ ra khỏi trung tâm. Tôi nghĩ rằng bạn đang cố gắng kéo nó trở lại vị trí chính xác bằng cách sử dụng lợi nhuận tiêu cực. Thay vào đó - chỉ cần tính toán các giá trị trên cùng/trái chính xác ngay từ đầu và đừng lo lắng về lợi nhuận. Đây là một giải pháp jQuery, nhưng nó có thể dễ dàng thích nghi với js đồng bằng. Tôi cũng nghĩ rằng mã hiện tại của bạn sẽ không hoạt động nếu cửa sổ đã được cuộn ở tất cả.

//this code will center the following element on the screen 
$('#elementid').click(function() { 
    $(this).css('position','fixed'); 
    $(this).css('top', (($(window).height() - $(this).outerHeight())/2) + $(window).scrollTop() + 'px'); 
    $(this).css('left', (($(window).width() - $(this).outerWidth())/2) + $(window).scrollLeft() + 'px'); 
}); 
+0

Bạn đúng, bạn sẽ làm việc (tôi đã kiểm tra nó để đảm bảo offsetHeight và offsetWidth là chính xác), ngoại trừ việc bạn không thể thay đổi kích thước cửa sổ và có div nằm ở vị trí trung tâm hoàn hảo. Tôi đang tìm kiếm. Tôi thực sự quan tâm nhất tại sao offsetHeight và offsetWidth của tôi không cho tôi con số chính xác, vì tôi sử dụng kỹ thuật css này mọi lúc và nó luôn mang lại cho tôi hiệu quả mong muốn. – saoyr5

+0

Ahh, tôi hiểu rồi. Tôi upvoted câu hỏi của bạn để hy vọng ai đó giúp bạn có được một câu trả lời tốt hơn. Bạn có thể ràng buộc ở trên với sự kiện '$ (window) .resize()', nhưng phương thức của bạn chắc chắn là thanh lịch hơn. – mrtsherman

Các vấn đề liên quan