tl; dr: (coba di sini )
Jika Anda memiliki HTML berikut:
<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>
maka Anda dapat menggunakan kode JavaScript berikut:
$(".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();
});
Tapi itu tidak berhasil!
Ini akan berfungsi selama menu dan placeholder memiliki orangtua offset yang sama. Jika tidak, dan Anda tidak memiliki aturan CSS bersarang yang peduli dengan #menu
elemen DOM , gunakan:
$(this).append($("#menu"));
tepat sebelum garis yang memposisikan #menu
elemen.
Tapi tetap saja tidak berhasil!
Anda mungkin memiliki beberapa tata letak aneh yang tidak berfungsi dengan pendekatan ini. Dalam hal ini, cukup gunakan plugin posisi jQuery.ui (sebagaimana disebutkan dalam jawaban di bawah), yang menangani setiap kemungkinan kejadian . Perhatikan bahwa Anda harus ke show()
elemen menu sebelum memanggil position({...})
; plugin tidak dapat memposisikan elemen tersembunyi.
Perbarui catatan 3 tahun kemudian pada tahun 2012:
(Solusi asli diarsipkan di sini untuk anak cucu)
Jadi, ternyata metode asli yang saya miliki di sini jauh dari ideal. Secara khusus, itu akan gagal jika:
- orang tua offset menu bukan orang tua pengganti placeholder
- placeholder memiliki perbatasan / padding
Untungnya, jQuery memperkenalkan metode ( position()
dan outerWidth()
) jalan kembali ke 1.2.6 yang membuat menemukan nilai yang tepat dalam kasus terakhir di sini jauh lebih mudah. Untuk kasus sebelumnya, append
memasukkan elemen menu ke placeholder works (tetapi akan melanggar aturan CSS berdasarkan nesting).