tl; dr: (spróbuj tutaj )
Jeśli masz następujący kod 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>
możesz użyć następującego kodu 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();
});
Ale to nie działa!
Działa to tak długo, jak menu i symbol zastępczy mają ten sam element nadrzędny przesunięcia. Jeśli nie, i nie masz zagnieżdżonych reguł CSS, które dbają o to, gdzie w DOM #menujest element, użyj:
$(this).append($("#menu"));
tuż przed linią pozycjonującą #menuelement.
Ale to wciąż nie działa!
Możesz mieć dziwny układ, który nie działa z tym podejściem. W takim przypadku wystarczy użyć wtyczki jQuery.ui (jak wspomniano w odpowiedzi poniżej), która obsługuje każdą możliwą sytuację . Pamiętaj, że będziesz musiał przejść show()do elementu menu przed wywołaniem position({...}); wtyczka nie może pozycjonować ukrytych elementów.
Aktualizuj uwagi 3 lata później w 2012 roku:
(Oryginalne rozwiązanie jest tutaj archiwizowane dla potomności)
Okazuje się więc, że oryginalna metoda, którą tu zastosowałem, była daleka od ideału. W szczególności upadłby, gdyby:
- element nadrzędny przesunięcia menu nie jest elementem nadrzędnym elementu zastępczego elementu zastępczego
- symbol zastępczy ma ramkę / wypełnienie
Na szczęście jQuery wprowadził metody ( position()i outerWidth()) już w 1.2.6, które znacznie ułatwiają znalezienie właściwych wartości w tym drugim przypadku. W pierwszym przypadku appendwstawienie elementu menu do symbolu zastępczego działa (ale złamie reguły CSS oparte na zagnieżdżaniu).