Отримайте позицію тегу div / span


103

Чи може хтось показати мені, як отримати top& leftпозицію divабо spanелемента, коли його не вказано?

тобто:

<span id='11a' style='top:55px;' onmouseover="GetPos(this);">stuff</span>
<span id='12a' onmouseover="GetPos(this);">stuff</span>

У вищесказаному, якщо я це роблю:

document.getElementById('11a').style.top

Значення 55pxповертається. Однак якщо я спробую це для span'12a', нічого не повернеться.

У мене на сторінці є група div/ spans, для якої я не можу вказати top/ leftвластивості, але мені потрібно відображати divбезпосередньо під цим елементом.

Відповіді:


100

Ця функція підкаже вам x, y положення елемента відносно сторінки. По суті, вам потрібно провести циклічну перевірку через батьків усіх елементів і додати їх компенсації разом.

function getPos(el) {
    // yay readability
    for (var lx=0, ly=0;
         el != null;
         lx += el.offsetLeft, ly += el.offsetTop, el = el.offsetParent);
    return {x: lx,y: ly};
}

Однак якщо ви просто хотіли розташування елемента x, y щодо його контейнера, то все, що вам потрібно, це:

var x = el.offsetLeft, y = el.offsetTop;

Щоб розмістити елемент прямо під цим, вам також потрібно буде знати його висоту. Це зберігається у властивості offsetHeight / offsetWidth.

var yPositionOfNewElement = el.offsetTop + el.offsetHeight + someMargin;

5
На жаль, цей метод не працює в Chrome, коли елемент знаходиться всередині таблиці з облямівкою. Він також вийде з ладу в режимі стандартів IE6 через маржу BODY.
— GetFree

1
Просто попередження для користувачів цього коду. Це відносно сторінки, а не вікна. Він повертає те саме значення, якщо користувач прокручує навколо, використовуючи смуги прокрутки. Будь обережний.
— Ісаак Болінджер

дякую @IsaacBolinger щойно помітив це. Чи може хтось сказати мені, як я змушую його змінювати значення, коли розмір вікна змінюється або користувач прокручує?
— Девід Фарінья

@ DavidFariña Я використовував для цього модуль геометрії "dom-geometry" доджо. Я не знаю, як це зробити рідно.
— Ісаак Болінгер

Зменшене - це може бути очевидним для більш досвідчених користувачів, але ви не вказали, що саме потрібно передавати для el (тобто вкажіть вибіркове використання).
— Метт

183

Ви можете викликати метод getBoundingClientRect()за посиланням на елемент. Потім ви можете перевірити top, left, rightі / або bottomвластивості ...

var offsets = document.getElementById('11a').getBoundingClientRect();
var top = offsets.top;
var left = offsets.left;

Якщо ви використовуєте jQuery, ви можете використовувати більш стислий код ...

var offsets = $('#11a').offset();
var top = offsets.top;
var left = offsets.left;

11
+1 для цієї відповіді, getBoundingClientRect()слід використовувати - і це має бути прийнята відповідь! Але вам не потрібен «сучасний браузер» для цієї роботи, побачити список сумісності , який я показав тут: stackoverflow.com/questions/1480133 / ... . Він чудово працює в IE 4.0+ (!), Chrome 1.0+, FF 3.0+, Safari 4.0+ та Opera.
— Sk8erPeter

25
Зауважте, що getBoundingClientRect()повертає значення відносно вікна перегляду, а не документа. Для цього ви хочете чогось подібного top = el.getBoundingClientRect().top + window.pageYOffset - el.ownerDocument.documentElement.clientTop.
— Зак Блум

1
Також врахуйте, що getBoundingClientRectвраховує transform.
— ExpExc

Це не точно, якщо перша дитина, яка не є абсолютно розміщеною, має верхнє поле або поле зліва. На даний момент немає точного рішення на цій сторінці, тому якщо хтось знає, будь ласка, опублікуйте відповідь.
— Кертіс

16

Поки відповідь @ nickf працює. Якщо ви не переймаєтесь старшими браузерами, ви можете використовувати цю чисту версію Javascript. Працює в IE9 + та ін

var rect = el.getBoundingClientRect();

var position = {
  top: rect.top + window.pageYOffset,
  left: rect.left + window.pageXOffset
};

12

Як зазначив Алекс, ви можете використовувати jQuery offset (), щоб отримати положення відносно документообігу. Використовуйте позицію () для своїх координат x, y щодо батьків.

EDIT: Switched document.readyдля window.loadтому , що loadчекає всіх елементів , так що ви отримаєте їх розмір замість того , щоб просто підготувати DOM. З мого досвіду, це loadпризводить до меншої кількості неправильно розміщених Javascript елементів.

$(window).load(function(){ 
  // Log the position with jQuery
  var position = $('#myDivInQuestion').position();
  console.log('X: ' + position.left + ", Y: " + position.top );
});

9

Для тих, хто потребує лише верхньої чи лівої позиції, незначні зміни читного коду @ Nickf роблять трюк.

function getTopPos(el) {
    for (var topPos = 0;
        el != null;
        topPos += el.offsetTop, el = el.offsetParent);
    return topPos;
}

і

function getLeftPos(el) {
    for (var leftPos = 0;
        el != null;
        leftPos += el.offsetLeft, el = el.offsetParent);
    return leftPos;
}

2

Я розумію, що це стара тема, але відповідь @alex потрібно позначати як правильну відповідь

element.getBoundingClientRect() - це точна відповідність jQuery's $(element).offset()

І сумісний з IE4 + ... https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect


Вам потрібно буде включити зміщення прокрутки сторінки
— Бенджамін Інталь
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.