$(obj).width()
与$(obj).height()
:jquery方式获取元素的宽高,不包括滚动条与工具条jquery
$(obj).width() = width $(obj).height() = height
$(window).width()
与$(window).height()
:得到的是屏幕可视区域的宽高,不包括滚动条与工具条。chrome
$(window).width() = width + padding $(window).height() = height + padding
document.documentElement.clientWidt
h与document.documentElement.clientHeight
:得到的是屏幕可视区域的宽高,不包括滚动条与工具条,跟jquery的(window).width()与(window).height()得到的结果是同样的。浏览器
document.documentElement.clientWidth = width + padding document.documentElement.clientHeight = height + padding
window.innerWidth
与window.innerHeight
:得到的是可视区域的宽高,可是window.innerWidth宽度包含了纵向滚动条的宽度,window.innerHeight高度包含了横向滚动条的高度(IE8以及低版本浏览器不支持
)。工具
window.innerWidth = width + padding + border + 纵向滚动条宽度 window.innerHeight = height + padding + border + 横向滚动条高度
window.outerWidth
与window.outerHeight
:得到的是加上工具条与滚动条窗口的宽度与高度。测试
window.outerWidth = width + padding + border + 纵向滚动条宽度 window.outerHeight = height + padding + border + 横向滚动条高度 + 工具条高度
document.body.clientWidth
与document.body.clientHeight
:document.body.clientWidth得到的也是可视区域的宽度,可是document.body.clientHeight得到的是body内容的高度,若是内容只有200px,那么这个高度也是200px,若是想经过它获得屏幕可视区域的宽高,须要样式设置,以下:firefox
body { height: 100%; overflow: hidden; } body, div, p, ul { margin: 0; padding: 0; }
最关键的是:body的height:100%影响document.body.clientHeight的值。body的margin:0,padding:0影响document.body.clientWidth的值。翻译
返回自己的宽高 + padding + border + 滚动条code
全部HTML元素拥有offsetLeft和offsetTop属性来返回元素的X和Y坐标ip
1.相对于已定位元素的后代元素和一些其余元素(表格单元),这些属性返回的坐标是相对于祖先元素
2.通常元素,则是相对于文档,返回的是文档坐标文档
//获取元素的纵坐标(相对于窗口) function getTop(e){ var offset=e.offsetTop; if(e.offsetParent!=null) offset+=getTop(e.offsetParent); return offset; }
//获取元素的横坐标(相对于窗口) function getLeft(e){ var offset=e.offsetLeft; if(e.offsetParent!=null) offset+=getLeft(e.offsetParent); return offset; }
固然上面的代码是在反复调用自身方法,也能够下面这个方法来实现,主要使用while语句:
function getPoint(obj) { //获取某元素以浏览器左上角为原点的坐标 var t = obj.offsetTop; //获取该元素对应父容器的上边距 var l = obj.offsetLeft; //对应父容器的上边距 //判断是否有父容器,若是存在则累加其边距 while (obj = obj.offsetParent) {//等效 obj = obj.offsetParent;while (obj != undefined) t += obj.offsetTop; //叠加父容器的上边距 l += obj.offsetLeft; //叠加父容器的左边距 } alert("top: " + t + " left: " + l); }
怎样理解offsetParent
,人们并无把offsetParent翻译为偏移父级,而是翻译成定位父级,很大缘由是offsetParent与定位有关定位父级offsetParent的定义是:与当前元素最近的通过定位(position不等于static)的父级元素,主要分为下列几种状况 :
【1】元素自身有fixed定位,offsetParent的结果为null
当元素自身有fixed固定定位时,咱们知道固定定位的元素相对于视口进行定位,此时没有定位父级,offsetParent的结果为null
[注意]firefox浏览器有兼容性问题
<div id="test" style="position:fixed"></div> <script> //firefox并无考虑固定定位的问题,返回<body>,其余浏览器都返回null console.log(test.offsetParent); </script>
【2】元素自身无fixed定位,且父级元素都未通过定位,offsetParent的结果为<body>
<div id="test"></div> <script> console.log(test.offsetParent);//<body> </script>
【3】元素自身无fixed定位,且父级元素存在通过定位的元素,offsetParent的结果为离自身元素最近的通过定位的父级元素
<div id="div0" style="position:absolute;"> <div id="div1" style="position:absolute;"> <div id='test'></div> </div> </div> <script> console.log(test.offsetParent); //<div id="div1"> </script>
【4】<body>元素的parentNode是null
console.log(document.body.offsetParent);//null
这两个属性是元素的内容区域加上内边距,在加上任何溢出内容的尺寸.
所以,若是没有溢出时,这些属性与clientWidth和clientHeight是相等的。
指定的是元素的滚动条的位置
scrollLeft和scrollTop都是可写的属性,经过设置它们来让元素中的内容滚动。
获取当前页面滚动条纵坐标的位置:document.body.scrollTop与document.documentElement.scrollTop
获取当前页面滚动条横坐标的位置:document.body.scrollLeft与document.documentElement.scrollLeft
document.documentElement.scrollTop
;window.pageYOffset
或者document.documentElement.scrollTop
window.pageYOffset
与document.body.scrollTop
均可以;window.pageYOffset
或者 document.documentElement.scrollTop
;document.body.scrollTop
;注:标准浏览器是只认识
documentElement.scrollTop
的,但chrome虽然我感受比firefox还标准,但却不认识这个,在有文档声明时,chrome也只认识document.body.scrollTop
.
因为在不一样状况下,document.body.scrollTop与document.documentElement.scrollTop都有可能取不到值,那到底网页的scrollTop值怎么获得呢?难道又要用JavaScript进行判断?
其实没必要。由于document.body.scrollTop与document.documentElement.scrollTop二者有个特色,就是同时只会有一个值生效。好比document.body.scrollTop能取到值的时候,document.documentElement.scrollTop就会始终为0;反之亦然。因此,若是要获得网页的真正的scrollTop值,若是不考虑safari,能够这样
:
var sTop=document.body.scrollTop+document.documentElement.scrollTop;
(可是通常都不这样作的)
这两个值总会有一个恒为0,因此不用担忧会对真正的scrollTop
形成影响。一点小技巧,但很实用。
可使用window.pageYoffset
Window pageXOffset
和 pageYOffset
属性其定义:pageXOffset
设置或返回当前页面相对于窗口显示区左上角的 X 位置。pageYOffset
设置或返回当前页面相对于窗口显示区左上角的 Y 位置。全部主流浏览器都支持 pageXOffset
和 pageYOffset
属性。
注意: IE 8 及 更早 IE 版本不支持该属性,但可使用 "
document.documentElement.scrollLeft
" 和 "document.documentElement.scrollTop
" 属性 。因为谷歌兼容问题,可使用
document.body.scrollLeft
和document.body.scrollTop
或者window.pageXoffset
与window.pageYoffset
。
最终兼容作法:
var heightTop = document.documentElement.scrollTop || document.body.scrollTop; console.log(heightTop);
jQuery实现方式:
var top = $('.btn').offset().top; console.log(top); //2080
JS实现方式:
function getPoint(obj) { //获取某元素以浏览器左上角为原点的坐标 var t = obj.offsetTop; //获取该元素对应父容器的上边距 var l = obj.offsetLeft; //对应父容器的上边距 //判断是否有父容器,若是存在则累加其边距 while (obj = obj.offsetParent) { t += obj.offsetTop; //叠加父容器的上边距 l += obj.offsetLeft; //叠加父容器的左边距 } return { x:l, y:t } } var top2 = getPoint(document.getElementsByClassName('btn')[0]); console.log(top2.y); //2080
实现思路:获取当前监听元素距离文档的左上角的top距离;根据这个距离和当前可视区域的高度+文档滚动距离
进行比较,即scrollTop <= top <= document.documentElement.clientHeight + scrollTop
jquery实现方式:
$(function(){ var top = $("#btn").offset().top; //距离文档顶部的距离 var windowHeight = document.documentElement.clientHeight; //可视区域的高度 $(window).scroll(function(){ var scrollTop = $(window).scrollTop(); if(top >= scrollTop && top <= windowHeight + scrollTop){ console.log('在可视区域了'); } }); })
JS实现方式:
function getPoint(obj) { //获取某元素以浏览器左上角为原点的坐标 var t = obj.offsetTop; //获取该元素对应父容器的上边距 var l = obj.offsetLeft; //对应父容器的上边距 //判断是否有父容器,若是存在则累加其边距 while (obj = obj.offsetParent) { t += obj.offsetTop; //叠加父容器的上边距 l += obj.offsetLeft; //叠加父容器的左边距 } return { x:l, y:t } } window.onload = function(){ var top = getPoint(document.getElementById('btn')).y; //距离文档顶部的距离 var windowHeight = document.documentElement.clientHeight; //可视区域的高度 window.onscroll = function(){ var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; if(top >= scrollTop && top <= windowHeight + scrollTop){ console.log('在可视区域了'); } } }
1.window innerWidth 和 innerHeight 属性与outerWidth和outerHeight属性IE8以及如下不支持。
2.测试浏览器IE,火狐,谷歌,360浏览器,Safari都支持document.documentElement.clientWidth与document.documentElement.clientHeight。
获取屏幕的可视区域的宽高可以使用jquery的方式得到,也可使用原生js得到,即:
document.documentElement.clientWidth与document.documentElement.clientHeight