部分摘录自阮一峰老师博客:
一张网页的所有面积,就是它的大小。一般状况下,网页的大小由内容和CSS样式表决定。
浏览器窗口的大小,则是指在浏览器窗口中看到的那部分网页面积,又叫作viewport(视口)。
注意事项浏览器
const getViewport = () =>{ return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight } }
若是网页内容可以在浏览器窗口中所有显示,不出现滚动条,那么网页的clientWidth和scrollWidth应该相等。可是实际上,不一样浏览器有不一样的处理,这两个值未必相等。因此,咱们须要取它们之中较大的那个值
const getPageArea = () =>{ return { width: Math.max(document.documentElement.scrollWidth, document.documentElement.clientWidth), height: Math.max(document.documentElement.scrollHeight, document.documentElement.clientHeight) } }
指该元素的左上角相对于整张网页左上角的坐标。这个绝对位置要经过计算才能获得。
不断累加offsetParent的offsetTop和offsetLeft属性函数
因为在表格和iframe中,offsetParent对象未必等于父容器,因此上面的函数对于表格和iframe中的元素不适用。this
function getElementLeft(element){ var actualLeft = element.offsetLeft; var current = element.offsetParent; while (current !== null){ actualLeft += current.offsetLeft; current = current.offsetParent; } return actualLeft; } function getElementTop(element){ var actualTop = element.offsetTop; var current = element.offsetParent; while (current !== null){ actualTop += current.offsetTop; current = current.offsetParent; } return actualTop; }
利用getBoundingClientRect
方法code
此方法其中包含了left、right、top、bottom四个属性,分别对应了该元素的左上角和右下角相对于浏览器窗口(viewport)左上角的距离.(其实也就是网页元素的相对位置)对象
var X= this.getBoundingClientRect().left+document.documentElement.scrollLeft; var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
网页元素的相对位置,指该元素左上角相对于浏览器窗口左上角的坐标。
有了绝对位置之后,得到相对位置就很容易了,只要将绝对坐标减去页面的滚动条滚动的距离就能够了 也就是减去document.documentElement.scrollLeft|scrollTop
事件
//快捷方法 var X= this.getBoundingClientRect().left; var Y =this.getBoundingClientRect().top;
返回当前页面的滚动位置。请使用pageXOffset和pageYOffset, 若是已定义,不然使用scrollLeft和scrollTop。你能够省略el来使用窗口的默认值。pageXOffset是scrollY的别名(event.pageX是鼠标活动事件的属性)element
const getScrollPosition = (el = window) =>{ return ({x: (el.pageXOffset !== undefined) ? el.pageXOffset : el.scrollLeft, y: (el.pageYOffset !== undefined) ? el.pageYOffset : el.scrollTop}); } // getScrollPosition() -> {x: 0, y: 200}
const scrollToTop = () =>{ const distance = document.documentElement.scrollTop if(distance > 0){ window.requestAnimationFrame(scrollToTop) window.scrollTo(0, distance - distance/8) } }