tl; dr: (попробуйте здесь )
Если у вас есть следующий 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>
тогда вы можете использовать следующий код 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();
});
Но это не работает!
Это будет работать до тех пор, пока у меню и заполнителя будет один и тот же родительский элемент смещения. Если нет, и у вас нет вложенных правил CSS, которые заботятся о том, где находится #menuэлемент DOM , используйте:
$(this).append($("#menu"));
прямо перед строкой, которая позиционирует #menuэлемент.
Но это все еще не работает!
У вас может быть странный макет, который не работает с этим подходом. В этом случае просто используйте плагин позиции jQuery.ui (как упомянуто в ответе ниже), который обрабатывает все возможные варианты. Обратите внимание, что вам придется до show()элемента меню перед вызовом position({...}); плагин не может позиционировать скрытые элементы.
Обновление заметки через 3 года в 2012 году:
(Оригинальное решение заархивировано здесь для потомков)
Итак, получается, что оригинальный метод, который я здесь использовал, был далек от идеала. В частности, он потерпит неудачу, если:
- родительский элемент смещения меню не является родителем смещения заполнителя
- заполнитель имеет границы / отступы
К счастью, в 1.2.6 jQuery представил методы ( position()и outerWidth()), которые значительно упрощают поиск правильных значений в последнем случае. В первом случае appendиспользование элемента меню в качестве заполнителя работает (но нарушает правила CSS, основанные на вложенности).