tl; dr: (ลองที่นี่ )
หากคุณมี HTML ดังต่อไปนี้:
<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>
จากนั้นคุณสามารถใช้รหัส JavaScript ต่อไปนี้:
$(".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();
});
แต่มันไม่ทำงาน!
สิ่งนี้จะทำงานตราบใดที่เมนูและตัวยึดมีพาเรนต์เดียวกัน หากไม่มีและคุณไม่มีกฎ CSS ที่ซ้อนกันซึ่งดูแลว่า#menu
องค์ประกอบอยู่ใน DOM ใดให้ใช้:
$(this).append($("#menu"));
ก่อนหน้าบรรทัดที่วางตำแหน่ง#menu
องค์ประกอบ
แต่มันก็ยังใช้งานไม่ได้!
คุณอาจมีเลย์เอาต์แปลก ๆ ที่ไม่สามารถใช้กับวิธีนี้ได้ ในกรณีนี้ให้ใช้ปลั๊กอินตำแหน่งของ jQuery.ui (ดังที่ได้กล่าวไว้ในคำตอบด้านล่าง) ซึ่งจัดการเหตุการณ์ที่เป็นไปได้ทุกอย่าง โปรดทราบว่าคุณจะต้องshow()
องค์ประกอบเมนูก่อนที่จะโทรposition({...})
; ปลั๊กอินไม่สามารถวางตำแหน่งองค์ประกอบที่ซ่อนอยู่
อัพเดทบันทึก 3 ปีต่อมาในปี 2012:
(โซลูชันดั้งเดิมถูกเก็บถาวรที่นี่เพื่อลูกหลาน)
ดังนั้นกลับกลายเป็นว่าวิธีดั้งเดิมที่ฉันมีที่นี่นั้นยังห่างไกลจากอุดมคติ โดยเฉพาะอย่างยิ่งมันจะล้มเหลวหาก:
- parent offset ของเมนูไม่ใช่ parent offset ของตัวแทน
- ตัวยึดตำแหน่งมีเส้นขอบ / ช่องว่างภายใน
โชคดีที่ jQuery ได้แนะนำวิธีการ ( position()
และouterWidth()
) ย้อนกลับไปใน 1.2.6 ที่ทำให้การค้นหาค่าที่ถูกต้องในกรณีหลังนี้ง่ายขึ้นมาก สำหรับกรณีก่อนหน้านี้append
การใช้อิลิเมนต์เมนูกับตัวยึดตำแหน่ง (แต่จะทำลายกฎ CSS ตามการซ้อน)