Получить позицию тега div / span

Может ли кто-нибудь показать мне, как получить позицию 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 / span на странице, для которой я не могу указать свойства top / left, но мне нужно отобразить div непосредственно под этим элементом.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
108
0
304 163
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Эта функция сообщит вам позицию 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;

К сожалению, этот метод не работает в Chrome, когда элемент находится внутри таблицы с рамкой. Он также не будет работать в стандартном режиме IE6 из-за полей BODY.

GetFree 18.07.2012 01:17

Просто предупреждение для пользователей этого кода. Это относится к странице, а не к окну. Он возвращает то же значение, если пользователь выполняет прокрутку с помощью полос прокрутки. Будь осторожен.

Isaac Bolinger 26.02.2014 00:07

спасибо @IsaacBolinger только что заметил это. Может ли кто-нибудь сказать мне, как я могу заставить его изменять значения при изменении размера окна или при прокрутке пользователем?

David Fariña 14.01.2016 17:32

@ DavidFariña Для этого я использовал геометрический модуль "dom-geometry" додзё. Я не знаю, как это сделать изначально.

Isaac Bolinger 17.01.2016 20:40

Проголосовано против - это может быть очевидно для более опытных пользователей, но вы не указали, что именно нужно передать для el (т.е. укажите пример использования).

Matt 19.12.2017 23:47

Вы можете вызвать метод 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;

+1 для этого ответа следует использовать getBoundingClientRect() - и это должен быть принятый ответ! Но для этого вам не нужен "современный браузер", см. Список совместимости, который я показал здесь: stackoverflow.com/questions/1480133/…. Он отлично работает в IE 4.0+ (!), Chrome 1.0+, FF 3.0+, Safari 4.0+ и Opera.

Sk8erPeter 18.05.2013 21:16

Обратите внимание, что getBoundingClientRect() возвращает значения относительно области просмотра, а не документа. Для этого вам понадобится что-то вроде top = el.getBoundingClientRect().top + window.pageYOffset - el.ownerDocument.documentElement.clientTop.

Zack Bloom 17.01.2014 09:11

Также обратите внимание, что getBoundingClientRect учитывает transform.

ExpExc 29.02.2016 09:56

Это неверно, если у первого дочернего элемента с неабсолютным позиционированием есть верхнее или левое поле. В настоящее время на этой странице нет точного решения, поэтому, если кто-нибудь знает, отправьте ответ.

Curtis 18.04.2018 00:44

Как заметил Алекс, вы можете использовать jQuery offset () для получения позиции относительно потока документов. Используйте position () для его координат x, y относительно родителя.

Обновлено: переключено document.ready на window.load, потому что load ожидает всех элементов, поэтому вы получаете их размер, а не просто готовите DOM. По моему опыту, load приводит к меньшему количеству элементов, неправильно позиционированных в Javascript.

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

Для тех, кому нужно только верхнее или левое положение, небольшие изменения в читаемом коде @ 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;
}

Я понимаю, что это старая ветка, но ответ @alex необходимо пометить как правильный.

element.getBoundingClientRect() - точное соответствие $(element).offset() jQuery.

И он совместим с IE4 + ... https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect

Вам нужно будет указать смещение прокрутки страницы

Benjamin Intal 20.06.2015 04:32

Хотя ответ @nickf работает. Если вам не нравятся старые браузеры, вы можете использовать эту чистую версию Javascript. Работает в IE9 + и др.

var rect = el.getBoundingClientRect();

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

Другие вопросы по теме