tl; dr: (thử ở đây )
Nếu bạn có HTML sau:
<div id="menu" style="display: none;">
<!-- menu stuff in here -->
<ul><li>Menu item</li></ul>
</div>
<div class="parent">Hover over me to show the menu here</div>
sau đó bạn có thể sử dụng mã JavaScript sau:
$(".parent").mouseover(function() {
// .position() uses position relative to the offset parent,
var pos = $(this).position();
// .outerWidth() takes into account border and padding.
var width = $(this).outerWidth();
//show the menu directly over the placeholder
$("#menu").css({
position: "absolute",
top: pos.top + "px",
left: (pos.left + width) + "px"
}).show();
});
Nhưng nó không hoạt động!
Điều này sẽ hoạt động miễn là menu và trình giữ chỗ có cùng cha mẹ bù. Nếu họ không và bạn không có các quy tắc CSS lồng nhau, quan tâm đến #menu
phần tử trong DOM , hãy sử dụng:
$(this).append($("#menu"));
ngay trước dòng định vị #menu
phần tử.
Nhưng nó vẫn không hoạt động!
Bạn có thể có một số bố cục kỳ lạ không hoạt động với phương pháp này. Trong trường hợp đó, chỉ cần sử dụng plugin vị trí của jQuery.ui (như được đề cập trong câu trả lời bên dưới), xử lý mọi tình huống có thể hiểu được. Lưu ý rằng bạn sẽ phải vào show()
phần tử menu trước khi gọi position({...})
; các plugin không thể định vị các yếu tố ẩn.
Cập nhật ghi chú 3 năm sau vào năm 2012:
(Giải pháp ban đầu được lưu trữ ở đây cho hậu thế)
Vì vậy, nó chỉ ra rằng phương pháp ban đầu tôi có ở đây là xa lý tưởng. Cụ thể, nó sẽ thất bại nếu:
- cha mẹ bù của menu không phải là cha mẹ bù của giữ chỗ
- trình giữ chỗ có đường viền / phần đệm
May mắn thay, jQuery đã giới thiệu các phương thức ( position()
và outerWidth()
) trở lại trong 1.2.6, giúp cho việc tìm kiếm các giá trị phù hợp trong trường hợp sau ở đây dễ dàng hơn rất nhiều. Đối với trường hợp trước, append
ing phần tử menu để giữ chỗ hoạt động (nhưng sẽ phá vỡ các quy tắc CSS dựa trên lồng nhau).