ТЛ; др: (попробуйте here)
Если у вас есть следующий 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's position plugin (как указано ниже в answer), который обрабатывает все возможные возможности. Обратите внимание, что перед вызовом position({...})
вам нужно будет show()
; плагин не может размещать скрытые элементы.
Update отмечает 3 года спустя в 2012 году:
(Оригинальное решение архивируется here для потомков)
Таким образом, получается, что оригинальный метод, который я был здесь был далек от идеала. В частности, было бы ошибкой, если:
- родительского смещения в меню для не заполнителем-х смещение родителю
- заполнитель имеет границу/обивка
К счастью, JQuery Введенный методы (position()
и outerWidth()
) обратно в 1.2.6, что делает поиск правильных значений в последнем случае здесь намного проще. В первом случае append
элемент меню на местозаполнитель работает (но будет нарушать правила CSS, основанные на вложенности).
посмотреть на http://stackoverflow.com/questions/8400876/jquery-position-element-next -to-each-other-on-mouse-over-with-fix-of-scroll, который адресует гораздо больше проблем, которые могут возникнуть. – Toskan 2011-12-06 14:34:46
См. [«Если вопросы включают« теги »в их названиях?»] (http: /meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), где консенсус «нет, они не должны»! – 2015-11-03 08:17:31
@paul Да, в стиле есть небольшая разница. Первоначальное название этого вопроса было префикс * jQuery: *, что не рекомендуется. Обычно, из-за дополнительной маркировки вопроса, что делает префиксы бесполезными. Если в названии требуется * технология *, она должна быть записана в ** реальном ** предложении, а не только в префиксе, потому что для этого используются теги. – 2015-11-03 09:29:15