tl; dr: (provalo qui )
Se hai il seguente 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>
quindi è possibile utilizzare il seguente codice 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();
});
Ma non funziona!
Funzionerà finché il menu e il segnaposto avranno lo stesso genitore offset. In caso contrario, e non hai regole CSS nidificate che si preoccupano della posizione nel DOM #menu
dell'elemento, usa:
$(this).append($("#menu"));
appena prima della linea che posiziona l' #menu
elemento.
Ma non funziona ancora!
Potresti avere un layout strano che non funziona con questo approccio. In tal caso, basta usare il plug-in di posizione di jQuery.ui (come menzionato in una risposta di seguito), che gestisce ogni possibile eventualità. Nota che show()
prima di chiamare dovrai accedere all'elemento del menu position({...})
; il plugin non può posizionare elementi nascosti.
Note di aggiornamento 3 anni dopo nel 2012:
(La soluzione originale è archiviata qui per i posteri)
Quindi, risulta che il metodo originale che avevo qui era tutt'altro che ideale. In particolare, fallirebbe se:
- il genitore offset del menu non è il genitore offset del segnaposto
- il segnaposto ha un bordo / imbottitura
Fortunatamente, jQuery ha introdotto metodi ( position()
e outerWidth()
) nella versione 1.2.6 che rendono molto più facile trovare i valori giusti in quest'ultimo caso. Nel primo caso, append
il passaggio al segnaposto dall'elemento di menu funziona (ma infrange le regole CSS in base all'annidamento).