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 #menu
ist 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 #menu
Element 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 append
funktioniert das Einfügen des Menüelements in den Platzhalter (verstößt jedoch gegen CSS-Regeln, die auf der Verschachtelung basieren).