Получение абсолютной позиции элемента относительно браузера - PullRequest
11 голосов
/ 14 октября 2010

У меня есть div, установленный для класса css с плавающей точкой:

.float {
display:block; 
position:fixed; 
top: 20px;
left: 0px;
z-index: 1999999999;
}
* html .float {position:absolute;}

Этот класс заставляет элемент оставаться в фиксированной позиции на странице (часть html должна заставить его работать в IE). Я использую JavaScript для смещения положения элемента по горизонтали и вертикали.

Мне нужно получить абсолютную позицию div относительно окна браузера в javascript (сколько пикселей сверху и слева от окна браузера div). Прямо сейчас я использую следующее:

pos_left = document.getElementById('container').offsetLeft;
pos_top = document.getElementById('container').offsetTop;

Приведенный выше код работает для IE, Chrome и FF, но в Opera он возвращает 0 для обоих. Мне нужно решение, которое работает для всех этих браузеров. Есть идеи?

Кстати: отслеживание изменений, внесенных javascript, возможно, но это не решение, которое я ищу из-за соображений производительности. Также я не использую jquery.

Ответы [ 5 ]

12 голосов
/ 18 января 2013

У меня раньше был похожий вопрос, и, просматривая блоги, веб-сайты и это решение из stackoverflow, я понял, что одного решения, подходящего для всех, нигде не найти! Итак, без дальнейших церемоний, вот то, что я собрал, чтобы получить x, y любого элемента через любой родительский узел, включая iframes, прокрутку div и прочее! Вот и я:

function findPos(obj) {
    var curleft = 0;
    var curtop = 0;
    if(obj.offsetLeft) curleft += parseInt(obj.offsetLeft);
    if(obj.offsetTop) curtop += parseInt(obj.offsetTop);
    if(obj.scrollTop && obj.scrollTop > 0) curtop -= parseInt(obj.scrollTop);
    if(obj.offsetParent) {
        var pos = findPos(obj.offsetParent);
        curleft += pos[0];
        curtop += pos[1];
    } else if(obj.ownerDocument) {
        var thewindow = obj.ownerDocument.defaultView;
        if(!thewindow && obj.ownerDocument.parentWindow)
            thewindow = obj.ownerDocument.parentWindow;
        if(thewindow) {
            if(thewindow.frameElement) {
                var pos = findPos(thewindow.frameElement);
                curleft += pos[0];
                curtop += pos[1];
            }
        }
    }

    return [curleft,curtop];
}
6 голосов
/ 26 сентября 2013

Вариант ответа пользователя 1988451, который я тестировал кросс-браузер.Я обнаружил, что их ответ не касается ширины прокрутки (поэтому я добавил проверку для obj.scrollLeft) и вел себя по-разному в FF и Chrome, пока не добавил проверки для thewindow.scrollY и thewindow.scrollX.Протестировано в Chrome, IE, Safari, Opera, FF, IE 9-10 и IE9 с режимами 8 и 7.Обратите внимание, что я не проверял его поведение с помощью iframes:

function findPos(obj, foundScrollLeft, foundScrollTop) {
    var curleft = 0;
    var curtop = 0;
    if(obj.offsetLeft) curleft += parseInt(obj.offsetLeft);
    if(obj.offsetTop) curtop += parseInt(obj.offsetTop);
    if(obj.scrollTop && obj.scrollTop > 0) {
        curtop -= parseInt(obj.scrollTop);
        foundScrollTop = true;
    }
    if(obj.scrollLeft && obj.scrollLeft > 0) {
        curleft -= parseInt(obj.scrollLeft);
        foundScrollLeft = true;
    }
    if(obj.offsetParent) {
        var pos = findPos(obj.offsetParent, foundScrollLeft, foundScrollTop);
        curleft += pos[0];
        curtop += pos[1];
    } else if(obj.ownerDocument) {
        var thewindow = obj.ownerDocument.defaultView;
        if(!thewindow && obj.ownerDocument.parentWindow)
            thewindow = obj.ownerDocument.parentWindow;
        if(thewindow) {
            if (!foundScrollTop && thewindow.scrollY && thewindow.scrollY > 0) curtop -= parseInt(thewindow.scrollY);
            if (!foundScrollLeft && thewindow.scrollX && thewindow.scrollX > 0) curleft -= parseInt(thewindow.scrollX);
            if(thewindow.frameElement) {
                var pos = findPos(thewindow.frameElement);
                curleft += pos[0];
                curtop += pos[1];
            }
        }
    }

    return [curleft,curtop];
}
1 голос
/ 01 августа 2013

Я использую это для растеризации PhantomJS:

function getClipRect(obj) {
  if (typeof obj === 'string')
    obj = document.querySelector(obj);

  var curleft = 0;
  var curtop = 0;

  var findPos = function(obj) {
    curleft += obj.offsetLeft;
    curtop += obj.offsetTop;
    if(obj.offsetParent) {
      findPos(obj.offsetParent);
    }
  }
  findPos(obj);

  return {
    top: curtop,
    left: curleft,
    width: obj.offsetWidth,
    height: obj.offsetHeight
  };
}
1 голос
/ 14 октября 2010

Вы можете найти подсказки здесь: http://code.google.com/p/doctype/wiki/ArticlePageOffset Но я думаю, вам нужно добавить смещения родителей, чтобы иметь правильное значение.

1 голос
/ 14 октября 2010

Если вы можете использовать элемент стиля элементов;

<div id="container" style="top: 20px;left: 0px;z-index: 1999999999;">

Вы можете получить его с атрибутом стиля элемента;

var top = parseInt(document.getElementById('container').style.top.split('px')[0], 10); // This row returns 20

Вы можете использовать top, left, width,высота и т.д ...

...