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