Положение Div относительно верхней части видового экрана
Мне интересно, как я могу получить количество пикселей (или измерение в целом) от div до верхней части окна в Javascript. Я не ищу смещение y по отношению к документу, просто к верхней части, где отображается браузер. Я попробовал" ответное " решение здесь: Можно ли получить положение div в окне просмотра браузера? Не в рамках документа. В окне , но, по крайней мере, в Safari, я сталкиваюсь с проблемой, где он возвращает то же самое номер независимо от того, где на самом деле находятся div.
Спасибо за любую помощь!
5 ответов:
Существующие ответы теперь устарели. Метод
getBoundingClientRect()
существует уже довольно давно и делает именно то, что требует этот вопрос. Кроме того, он поддерживается во всех браузерах.Из этой страницы MDN:
возвращаемое значение представляет собой объект TextRectangle, который содержит доступные только для чтения свойства left, top, right и bottom, описывающие поле border-box, в пикселях, с верхним левым относительно верхнего левого края видового экрана .
Вы используете его вот так:
var viewportOffset = el.getBoundingClientRect(); // these are relative to the viewport var top = viewportOffset.top; var left = viewportOffset.left;
/ / сначала получите правильную геометрию для браузера
(function(){ Run= window.Run || {}; if(window.pageYOffset!= undefined){ Run.topLeftScroll= function(hoo){ var wo= [window.pageXOffset, window.pageYOffset] if(hoo && hoo.nodeType== 1){ hoo= mr(hoo); var T= 0, L= 0; while(hoo){ L+= hoo.offsetLeft; T+= hoo.offsetTop; hoo= hoo.offsetParent; } wo= [L, T, wo[0], wo[1]]; } return wo; } } else if(document.body.scrollTop!== undefined){ Run.topLeftScroll= function(hoo){ var B= document.body; var D= document.documentElement; D= (D.clientHeight)? D: B; wo= [D.scrollLeft, D.scrollTop]; if(hoo && hoo.nodeType== 1){ hoo= mr(hoo); var T= 0, L= 0; while(hoo){ L+= hoo.offsetLeft; T+= hoo.offsetTop; hoo= hoo.offsetParent; } wo= [L, T, wo[0], wo[1]]; } return wo; } } })()
/ / Функция быстрого доступа
if(window.Run && Run.topLeftScroll){ Run.getPosition= function(who, wch){ var A= Run.topLeftScroll(who); if(!wch) return A; switch(wch.toUpperCase()){ case 'X': return A[0];// element Left in document case 'Y': return A[1];// element Top in document case 'L': return A[0]-A[2];// Left minus scroll case 'T': return A[1]-A[3];// Top minus scroll case 'SL': return A[2];// scroll Left case 'ST': return A[3];// scroll Top default: return 0; } // all returns are integers (pixels) } }
Проверьте, что могут предложить фреймворки JS. В основном, они проработали все - или, по крайней мере, большинство-специфических проблем и специальностей браузера.
В прототипе есть функции scrollOffset () . Я недостаточно знаком с JQuery, чтобы указать вам на нужную страницу руководства, но здесь - это вопрос, который, кажется, идет в правильном направлении.
Я немного подстригся и нашел вот что:
function getOffsetPosition(el_id, side){ element = document.getElementById(el_id); newNode = document.createElement("div"); newNode.innerHTML = "<div style=\"height: 12px;\"></div>"; element.insertBefore(newNode, element.firstChild); iVal = 0; oObj = element; var sType = "oObj.offset"+side; while (oObj && oObj.tagName != "html") { iVal += eval(sType); oObj = oObj.offsetParent; } element.removeChild(newNode); return iVal; }
Если это может вам помочь ^^