tl; dr: ( burada deneyin )
Aşağıdaki HTML'niz varsa:
<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>
aşağıdaki JavaScript kodunu kullanabilirsiniz:
$(".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();
});
Ama işe yaramıyor!
Bu, menü ve yer tutucu aynı ofset üst öğesine sahip olduğu sürece çalışır. Bunlar yoksa ve #menuöğenin DOM'sinde nerede olduğunu önemseyen iç içe CSS kurallarınız yoksa şunları kullanın:
$(this).append($("#menu"));
#menuöğeyi konumlandıran çizgiden hemen önce .
Ama yine de çalışmıyor!
Bu yaklaşımla çalışmayan garip bir düzeniniz olabilir. Bu durumda, akla gelebilecek her olasılığı ele alan jQuery.ui'nin pozisyon eklentisini ( aşağıdaki cevapta belirtildiği gibi) kullanmanız yeterlidir . show()Aramadan önce menü öğesine ihtiyacınız olduğunu unutmayın position({...}); eklenti gizli öğeleri konumlandıramaz.
2012'de 3 yıl sonra notları güncelleyin:
(Orijinal çözüm burada gelecek nesiller için arşivlenmiştir )
Yani, burada sahip olduğum orijinal yöntemin idealden uzak olduğu ortaya çıktı. Özellikle, aşağıdaki durumlarda başarısız olur:
- menünün ofset ebeveyni yer tutucunun ofset ebeveyni değil
- yer tutucunun bir kenarlığı / dolgusu var
Neyse ki, jQuery, 1.2.6'da buradaki ikinci durumda doğru değerleri bulmayı çok daha kolay hale getiren yöntemler ( position()ve outerWidth()) geri getirdi . Önceki durum appendiçin, menü öğesini yer tutucuya eklemek çalışır (ancak iç içe geçmeye dayalı CSS kurallarını kırar).