tl; dr: (experimente aqui )
Se você possui o seguinte 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>
então você pode usar o seguinte código 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();
});
Mas isso não funciona!
Isso funcionará desde que o menu e o espaço reservado tenham o mesmo pai de deslocamento. Se não, e você não possui regras CSS aninhadas que importam onde #menu
está o elemento DOM , use:
$(this).append($("#menu"));
logo antes da linha que posiciona o #menu
elemento.
Mas ainda não funciona!
Você pode ter um layout estranho que não funciona com essa abordagem. Nesse caso, basta usar o plug-in de posição do jQuery.ui (como mencionado na resposta abaixo), que lida com todas as eventualidades possíveis. Observe que você precisará show()
do elemento de menu antes de chamar position({...})
; o plug-in não pode posicionar elementos ocultos.
Notas da atualização 3 anos depois em 2012:
(A solução original está arquivada aqui para posteridade)
Então, o método original que eu tinha aqui estava longe de ser o ideal. Em particular, falharia se:
- o pai de deslocamento do menu não é o pai de deslocamento do espaço reservado
- o espaço reservado tem uma borda / preenchimento
Felizmente, o jQuery introduziu métodos ( position()
e outerWidth()
) na versão 1.2.6, que tornam muito mais fácil encontrar os valores corretos no último caso. No primeiro caso, a append
inserção do elemento de menu no espaço reservado funciona (mas quebrará as regras CSS com base no aninhamento).