2008-10-01 2 views
36

Как найти XY-координаты элемента HTML (DIV) из JavaScript, если они не были явно заданы?Найти X/Y элемента HTML с JavaScript

+0

закрыт в двух экземплярах в соответствии с http://meta.stackexchange.com/questions/147643/should-i-vote-to- close-a-duplicate-question-even-but-its-much-newer-and-ha – user123444555621 2014-08-25 06:47:38

ответ

8

Это может быть сложно в зависимости от браузера и версии. Я бы предложил использовать jQuery и плагин Position.

+9

Большинство плагинов позиций теперь являются частью ядра jQuery. Таким образом, вы можете просто сделать $ (element) .offset ({relativeTo: "body"}) - и он даст вам верхнюю и левую части объекта относительно тела. – Sugendran 2008-10-01 23:32:43

+0

Отлично, я не скачал jQuery через несколько месяцев, хорошо знаю, что они его закачали. – palehorse 2008-10-02 14:01:21

+0

+1 для смещения jQuery – shan 2014-10-02 08:25:37

-1

Я не уверен, для чего он нужен, и такие вещи всегда относительны (экран, окно, документ). Но когда мне нужно, чтобы понять это, я нашел этот сайт полезным: http://www.mattkruse.com/javascript/anchorposition/source.html

И я также обнаружил, что подсказке плагин кто-то сделал для JQuery были всякие интересные прозрения х, приемы у позиционирования (посмотрите на его видовом класс и базовую поддержку jQuery для него). http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/

5

Вы можете использовать библиотеку, такие как Prototype или JQuery, или вы можете использовать this handy function:

Он возвращает массив.

myPos = findPos(document.getElementById('something')) 
x = myPos[0] 
y = myPos[1] 

function findPos(obj) { 
    var curleft = curtop = 0; 
    if (obj.offsetParent) { 
    curleft = obj.offsetLeft 
    curtop = obj.offsetTop 
    while (obj = obj.offsetParent) { 
     curleft += obj.offsetLeft 
     curtop += obj.offsetTop 
    } 
    } 
    return [curleft,curtop]; 
} 
+0

Вы должны указать атрибуцию quirksmode.org, эта функция выглядит очень знакомой. – pilsetnieks 2008-10-02 00:14:29

31

Вот как я это делаю:

// Based on: http://www.quirksmode.org/js/findpos.html 
var getCumulativeOffset = function (obj) { 
    var left, top; 
    left = top = 0; 
    if (obj.offsetParent) { 
     do { 
      left += obj.offsetLeft; 
      top += obj.offsetTop; 
     } while (obj = obj.offsetParent); 
    } 
    return { 
     x : left, 
     y : top 
    }; 
}; 
3

Для чего это стоит, вот рекурсивная версия:

function findPos(element) { 
    if (element) { 
    var parentPos = findPos(element.offsetParent); 
    return [ 
     parentPos.X + element.offsetLeft, 
     parentPos.Y + element.offsetTop 
    ]; 
    } else { 
    return [0,0]; 
    } 
} 
2

Вы можете добавить два свойства в Element.prototype получить верхний/левый любого элемента.

window.Object.defineProperty(Element.prototype, 'documentOffsetTop', { 
    get: function() { return this.offsetTop + (this.offsetParent ? this.offsetParent.documentOffsetTop : 0); } 
}); 

window.Object.defineProperty(Element.prototype, 'documentOffsetLeft', { 
    get: function() { return this.offsetLeft + (this.offsetParent ? this.offsetParent.documentOffsetLeft : 0); } 
}); 

Вот демо сравнивая результаты с JQuery-х offset().top и .left: http://jsfiddle.net/ThinkingStiff/3G7EZ/

Смежные вопросы