tl; dr: (versuche es hier )
Wenn Sie folgenden HTML-Code haben:
<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>
Dann können Sie den folgenden JavaScript-Code verwenden:
$(".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();
});
Aber es funktioniert nicht!
Dies funktioniert so lange, wie das Menü und der Platzhalter denselben übergeordneten Versatz haben. Wenn dies nicht der Fall #menuist und Sie keine verschachtelten CSS-Regeln haben, die sich darum kümmern, wo sich das Element im DOM befindet, verwenden Sie:
$(this).append($("#menu"));
kurz vor der Linie, die das #menuElement positioniert .
Aber es funktioniert immer noch nicht!
Möglicherweise haben Sie ein seltsames Layout, das mit diesem Ansatz nicht funktioniert. Verwenden Sie in diesem Fall einfach das Positions-Plugin von jQuery.ui (wie in einer Antwort unten erwähnt), das alle denkbaren Eventualitäten behandelt. Beachten Sie, dass Sie show()vor dem Aufruf das Menüelement aufrufen müssen position({...}). Das Plugin kann keine versteckten Elemente positionieren.
Update Notizen 3 Jahre später im Jahr 2012:
(Die ursprüngliche Lösung ist hier für die Nachwelt archiviert )
Es stellt sich also heraus, dass die ursprüngliche Methode, die ich hier hatte, alles andere als ideal war. Insbesondere würde es scheitern, wenn:
- Das übergeordnete Element des Menüs ist nicht das übergeordnete Element des Platzhalters
- Der Platzhalter hat einen Rand / Abstand
Glücklicherweise hat jQuery bereits in 1.2.6 Methoden ( position()und outerWidth()) eingeführt, die es im letzteren Fall viel einfacher machen, die richtigen Werte zu finden. Im ersteren Fall appendfunktioniert das Einfügen des Menüelements in den Platzhalter (verstößt jedoch gegen CSS-Regeln, die auf der Verschachtelung basieren).