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