Получить позицию элемента по javascript
Я видел дюжину script, которые могут поймать позицию x и y элемента/объекта на странице. Но у меня всегда возникают проблемы с улавливанием x и y, когда веб-страница использует поля в теле или другие элементы, абсолютные/относительные элементы, такие как.
Есть ли решение, которое обеспечивает точное положение, независимо от того, какие поля или прокладки используются.
:)
Ответы
Ответ 1
Я использую следующий код, чтобы переместить поле div, чтобы следовать курсору в этом веб-сайте IME
function xy(x) {
o = document.getElementById(x);
var l =o.offsetLeft; var t = o.offsetTop;
while (o=o.offsetParent)
l += o.offsetLeft;
o = document.getElementById(x);
while (o=o.offsetParent)
t += o.offsetTop;
return [l,t];
}
Возвращает массив [left, top],
Ответ 2
Получение точной позиции - это просто вопрос о смещении offsetLefts и offsetTops в offsetParents:
function getPos(ele){
var x=0;
var y=0;
while(true){
x += ele.offsetLeft;
y += ele.offsetTop;
if(ele.offsetParent === null){
break;
}
ele = ele.offsetParent;
}
return [x, y];
}
Btw, это решение, вероятно, будет работать в два раза быстрее, чем другое решение выше, поскольку мы только зацикливаем один раз.
Ответ 3
offsetParent
и другие функции смещения старые... используйте getBoundingClientRect
функция... используйте это:
function getAbsPosition(element) {
var rect = element.getBoundingClientRect();
return {x:rect.left,y:rect.top}
}
теперь вы можете использовать его как это
<div style="margin:50px;padding:50px;" id="myEl">lol</div>
<script type="text/javascript">
var coords = getAbsPosition( document.getElementById('myEl') );
alert( coords.x );alert( coords.y );
</script>
Не волнуйтесь... независимо от того, сколько маржи или позиции или дополнения элемент имеет, он всегда работает
Ответ 4
ВАС код совершенно плохой, и у меня есть некоторые улучшения в Pacerier, чтобы дать, поэтому я отправлю свой собственный ответ:
function getPos(el, rel)
{
var x=0, y=0;
do {
x += el.offsetLeft;
y += el.offsetTop;
el = el.offsetParent;
}
while (el != rel)
return {x:x, y:y};
}
Если используется только как getPos(myElem)
, возвращается глобальная позиция. Если второй элемент включен как аргумент (т.е. getPos(myElem, someAncestor)
), который является предком/родителем первого (по крайней мере, где-то вверх по цепочке), то он будет давать позицию относительно этого предка. Если rel
не задано (т.е. остается undefined
), то он целенаправленно использует !=
вместо !==
, потому что он должен остановиться, когда el
получает значение null
и rel
равно undefined
как хорошо, поэтому нестрогое равенство целеустремленно, не меняйте его. Он также возвращает объект, так как это немного читаемо в использовании, чем массив (и поэтому вы можете сделать что-то вроде getPos().x
).
Это происходит из решения Pacerier, поэтому, если вы хотите повысить его, подумайте о его продолжении.