前言
简历中,需要做到这样的效果,当某个元素出现在视口时,动画开始启动,现在来介绍如何获得某个元素在网页上的确切位置,下面教程总结了javascript在网页定位方面的相关知识
网页大小和浏览器窗口大小
- 两个概念
- 网页大小指一张网页的全部面积,通常情况下,网页的大小由内容和css样式表决定。
- 浏览器窗口大小,则是值在浏览器窗口中看到的那部分网页面积,又叫viewport(视口)。
很显然,如果网页的内容能够在浏览器窗口中全部显示(也就是不出现滚动条),那么网页的大小和浏览器窗口的大小是相等的。如果不能全部显示,则滚动浏览器窗口,可以显示出网页的各个部分。
获取网页大小
- clientHeight和clientWidth属性
(图一 clientHeight和clientWidth属性)
因此,document元素的clientHeight
和clientWidht
属性代表网页大小
|
|
getViewport
函数就可以返回浏览器高和宽,需注意
- 这个函数必须在页面加载完成后才能运行,否则document对象还没生成,浏览器会报错。
- 大多数情况下,都是
document.documentElement.clientWidth
返回正确值。但是,在IE6的quirks模式中,document.body.clientWidth
返回正确的值,因此函数中加入了对文档模式的判断。clientWidth
和clientHeight
都是只读属性,不能对它们赋值。
获取网页大小的另一种方法
scrollHeight
和scrollWidth
属性,指包含滚动条在内的视觉面积。document
对象的scrollHeight
和scrollWidth
属性就是网页的大小,意思就是滚动条滚过的所有长度和宽度。
|
|
但是,这个函数有一个问题。如果网页内容能够在浏览器窗口中全部显示,不出现滚动条,那么网页的clientWidth和scrollWidth应该相等。但是实际上,不同浏览器有不同的处理,这两个值未必相等。所以,我们需要取它们之中较大的那个值,因此要对getPagearea()函数进行改写。
|
|
获取网页元素的绝对位置
- 网页元素的绝对位置,指该元素的左上角相当于整张网页左上角的坐标,这个绝对位置需通过计算方能得到。
offsetTop
和offsetLeft
属性,表示该元素左上角与父容器(offsetParent
对象)左上角的距离。所以,只需要将这两个值进行累加,就可以得到该元素的绝对坐标
以下两个函数可以用来获取绝对位置的横坐标和纵坐标
|
|
由于在表格和iframe中,offsetParent对象未必等于父容器,所以上面的函数对于表格和iframe中的元素不适用。
获取网页元素的相对位置
网页元素的相对位置,指该元素左上角相当于浏览器窗口左上角的坐标,有了绝对位置后,获取相对位置就容易了,只要将绝对坐标减去页面的滚动条滚动的距离即可。
document的
scrollTop
属性指的是滚动条滚动的垂直距离。同理scrollLeft
是滚动条滚动的水平距离。
|
|
scrollLeft
和scrollTop
属性是可以赋值的,并且会立即自动滚动网页的相应位置,可以利用他们改变网页的相对位置。element.scrollIntoView()
方法也有类似的这样,可使网页元素出现在浏览器窗口的左上角。
获取元素位置的快速方法
getBoundingClientRect()
,返回一个对象,包含left
,right
,top
,bottom
四个属性,分别对应该元素的左上角和右下角相当于浏览器窗口(viewport)左上角的距离
所以,网页元素的相对位置为
|
|
再加上滚动距离,就可以得到绝对位置
|
|
转载自利用js获取元素位置
滚动事件侦听
window.scroll()
是用于侦听页面滚动的元素
参考链接
以上是储备知识,现在来说一下我在编码中所遇到的困境
困境
在调试的时候,window.scroll()
无法运行,通过stackflow查询到
webkit use
body
for keeping track of scrolling,document.documentElement.scrollTop always returns 0 on chrome
而恰好为了让每个section都占据这个viewport,我将body的height
设成了100%
,所以当我remove这个css之后,window.scroll()
正常运行,现附上代码
|
|