tl; dr: (essayez-le ici )
Si vous avez le code HTML suivant:
<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>
alors vous pouvez utiliser le code JavaScript suivant:
$(".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();
});
Mais ça ne marche pas!
Cela fonctionnera tant que le menu et l'espace réservé auront le même parent de décalage. Si ce n'est pas le cas et que vous n'avez pas de règles CSS imbriquées qui se soucient de l'endroit où se trouve l' #menu
élément DOM , utilisez:
$(this).append($("#menu"));
juste avant la ligne qui positionne l' #menu
élément.
Mais ça ne marche toujours pas!
Vous pourriez avoir une disposition étrange qui ne fonctionne pas avec cette approche. Dans ce cas, utilisez simplement le plugin de position de jQuery.ui (comme mentionné dans une réponse ci-dessous), qui gère toutes les éventualités imaginables. Notez que vous devrez show()
l'élément de menu avant d'appeler position({...})
; le plugin ne peut pas positionner les éléments cachés.
Notes de mise à jour 3 ans plus tard en 2012:
(La solution originale est archivée ici pour la postérité)
Il s'avère donc que la méthode originale que j'avais ici était loin d'être idéale. En particulier, il échouerait si:
- le parent de décalage du menu n'est pas le parent de décalage de l'espace réservé
- l'espace réservé a une bordure / un rembourrage
Heureusement, jQuery a introduit des méthodes ( position()
et outerWidth()
) depuis 1.2.6 qui facilitent beaucoup la recherche des bonnes valeurs dans ce dernier cas. Dans le premier cas, append
l'élément de menu dans l'espace réservé fonctionne (mais enfreindra les règles CSS basées sur l'imbrication).