tl;dr : (essayez-le aquí )
Si vous avez le 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 décalé. Si ce n'est pas le cas, et si vous n'avez pas de règles CSS imbriquées qui tiennent compte de l'emplacement dans le DOM de l'élément de menu et de l'élément de remplacement, vous pouvez utiliser les règles CSS. #menu
l'élément est, l'utilisation :
$(this).append($("#menu"));
juste avant la ligne qui positionne le #menu
élément.
Mais ça ne marche toujours pas !
Il se peut que vous ayez une disposition bizarre qui ne fonctionne pas avec cette approche. Dans ce cas, utilisez simplement Plugin de position de jQuery.ui (comme mentionné dans un 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.
Mise à jour des notes 3 ans plus tard en 2012 :
(La solution originale est archivée aquí 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, elle échouait si :
- le parent décalé du menu n'est pas le parent décalé de l'espace réservé.
- l'espace réservé a une bordure/un bourrelet
Heureusement, jQuery a introduit des méthodes ( position()
y outerWidth()
) dans la version 1.2.6, ce qui facilite grandement la recherche des bonnes valeurs dans le dernier cas. Pour le premier cas, append
L'insertion de l'élément de menu dans l'espace réservé fonctionne (mais elle enfreint les règles CSS basées sur l'imbrication).
1 votes
Jeter un coup d'œil à stackoverflow.com/questions/8400876/ qui traite de beaucoup plus de problèmes qui peuvent survenir
0 votes
Veuillez consulter "Les questions doivent-elles inclure des "tags" dans leurs titres ?" où le consensus est "non, ils ne devraient pas" !
0 votes
@paul Oui, il y a une légère différence dans le style. Le titre initial de cette question était préfixé de jQuery : ce qui n'est pas encouragé. Habituellement, en raison du balisage supplémentaire de la question, qui rend le préfixe inutile. Si le technologie est nécessaire dans le titre, il doit être capturé dans un fichier réel et pas seulement un préfixe, car c'est à cela que servent les balises.