1. window对象的宽高
window 对象包含 screen、document 对象,使用 window 对象的属性或者方法时可以省略 window。
浏览器窗口内宽高 window.innerWidth、window.innerHeight
浏览器窗口整个的宽高 window.outerWidth、window.outerHeight
浏览器窗口已滚动的坐标:window.scrollX、window.scrollY
1.1 innerHeight 和 outerHeight的区别
window.innerHeight 是浏览器窗口内的宽高,只包含文档页面的高度,随浏览器的窗口大小而改变window.outerHeight 包含有浏览器菜单栏、控制台等的整个高度,随浏览器的窗口大小而改变
即:outerHeight = innerHeight + 地址栏高度 +工具栏高度 +….
1.2 innerWidth 和 outerWidth
在浏览器全屏状态以及Mac系统中,两者是一样的。
在不是全屏的状态下,outerWidth 比 innerWidth 多出滚动条的宽度
1.3 兼容性
innerHeight 和 outerHeight 是有兼容性的,IE9 以下不支持
1.4 scrollX 和 scrollY
获取窗口滚动的 x、y 坐标,通常用来获取整个页面的已滚动高度和宽度
与下面用法是一致的:
window.scrollX === document.documentElement.scrollLeftwindow.scrollY === document.documentElement.scrollTop
2. screen 对象的宽高
屏幕分辨率的宽高 screen.width、screen.height
屏幕分辨率的可用宽高 screen.availWidth、screen.availHeight
注意:screen 下的宽高是不会改变的,不会随浏览器窗口大小而改变。由电脑的屏幕分辨率决定。无兼容性问题
2.1、screen.height 和 screen.availHeight
在windows系统中,availHeight 减少了底部任务栏的高度
在mac系统中,减少了顶部菜单栏的高度
2.2、screen.width 和 screen.availWidth
跟前面的区别一样。windows 系统可以把任务栏设置到上下左右
2.3、screenTop 和 screenLeft
浏览器距离屏幕顶部及左侧的距离,会随浏览器的移动而改变
3. 盒子和 document 的宽高
盒子的宽高主要分为,client、offset、scroll。
其中除了 offsetParent,其他都是数字
只有 scrollTop 和 scrollLeft 是可以修改的
分清楚:
document.documentElement=>htmldocument.body=>bodydocument.documentElement.childNodes[2]=>document.body
document 包含 document.documentElementdocument.documentElement 包含 document.body
浏览器兼容性,都需要两个同时使用
document.documentElement || document.body
3.1 有关 client 的宽高(解析一致)
(1)clientWidth、clientHeight
是指元素可见区域的宽高。即 padding + content(width/height)
clientWidth:盒子宽度 + 左右 paddingclientHeight:盒子高度 + 上下 padding
- 无滚动条
clientWidth / Height = 设定的宽高 + padding*2(左右或者上下)
- 有滚动条、且滚动条显示(Mac系统下滚动条不显示)
clientWidth / Height = 设定的宽高 + padding*2 - 滚动条宽度
(2)clientTop、clientLeft
用于读取 border 的宽度
clientLeft:盒子左边框的宽度clientTop:盒子上边框的宽度
结合 client 和 offset 我们可以求出元素的右边框和下边框的宽度:
//=> 左边框clientRight = Div.offsetWidth - Div.clientWidth - Div.clientLeft//=> 下边框clientBottom = Div.offsetHeight - Div.clientHeight - Div.clientTop
3.2 有关 offset 的宽高
(1)offsetWidth、offsetHeight
是指元素自身的宽高。即 padding + content(width/height)+ border
- 无滚动条
offsetWidth/Height = 设定的宽高 + padding*2(左右或者上下)+ border*2offsetWidth/Height = clientWidth/Height + border*2
- 有滚动条、且滚动条显示(Mac 系统下滚动条不显示)
//=> 实际上就是 client 减少滚动条宽高,offset 不变offsetWidth/Height = 设定的宽高 + padding*2 + border*2offsetWidth/Height = clientWidth/Height + 滚动条宽度 + border*2
兼容问题:获取整个页面的宽高
var w= document.documentElement.offsetWidth|| document.body.offsetWidth;var h= document.documentElement.offsetHeight|| document.body.offsetHeight;
(2)offsetTop、offsetLeftoffsetLeft:元素的外边框距离 offsetParent 元素的内边框的 left 值offsetTop:元素的外边框距离 offsetParent 元素的内边框的 top 值
offsetParent 是一个元素对象
- 如果当前元素的祖先元素没有进行定位,则
offsetParent为body - 如果有定位,
offsetParent取最近的设置定位的祖先元素,从最近的父节点开始,一层层向上找,直到body。 - 在
table便签中,需要注意特殊情况td的offsetParent是tabletd里面的标签的offsetParent是这个td(里面的标签没有设置定位时)
IE 6/7
offsetLeft = ( offsetParent 的 padding - left ) + ( 当前元素的 margin-left )
IE 8/9 及Chrome
offsetLeft = ( offsetParent 的 margin-left ) + ( offsetParent 的 border-left-width ) + ( offsetParent 的 padding-left )+ ( 当前元素的 margin-left )
Firefox
offsetLeft = ( offsetParent 的 margin-left ) + ( offsetParent 的 padding-left )+ ( 当前元素的 margin-left )
3.3 有关 scroll 的宽高
(1)scrollWidth、scrollHeightscrollHeight:获取对象的滚动高度scrollWidth:获取对象的滚动宽度
- 无溢出
scrollWidth/Height = clientWidth/Height
- 有溢出
//=> 没有设置 overflowscrollWidth/Height = 实际内容宽高 + 上或左 padding//=> 设置了 overflowscrollWidth/Height = 实际内容宽高 + 上下或左右 padding
即 scrollWidth/Height >= clientWidth/Height
兼容问题:获取整个网页的全文宽高
var w=document.documentElement.scrollWidth || document.body.scrollWidth;var h=document.documentElement.scrollHeight || document.body.scrollHeight;
(2)scrollTop、scrollLeftscrollTop:被卷去的高度,就是手动往下滚动的距离scrollLeft:被卷曲的宽度,就是手动往右滚动的距离
即滚动条距离顶部或者左侧的距离
event.clientX + document.documentElement.scrollTop 相对文档的水平座标+垂直方向滚动的量document.documentElement.scrollTop 垂直方向滚动的值
要获取当前页面的滚动条纵坐标位置,用:
document.documentElement.scrollTop;
而不是:
document.body.scrollTop;
4. 实战
获取可视区域的宽高
var w= document.documentElement.clientWidth || document.body.clientWidth;var h= document.documentElement.clientHeight|| document.body.clientHeight;
原因:
有 <!DOCTYPE html> 这个文档声明的时候,document.documentElement 是准确的
没有 <!DOCTYPE html> 时:document.body 是准确的
监听可视窗口的变化
利用 window 或者 document.body 的 onresize 事件
window.onresize = function () {console.log(document.documentELement.clientWidth || document.body.clientWidth);}documnet.body.onresize = function () {console.log(document.documentELement.clientWidth || document.body.clientWidth);}
获取整个文档的高度
document.documentElement.scrollHeight || document.body.scrollHeight;
获取某个元素距离 body 的距离
页面结构:
<div id="div1">珠峰培训</div><div id="outer">outer<div id="center">center<div id="inner">inner</div></div></div>
思路:
- 利用
offsetLeft获取某个元素外边框与上一级参照内边框的距离 - 利用
clientLeft获取上一级参照的边框宽度 - 利用
offsetParent获取上一级参照,直到body
function offset(ele) {var left = ele.offsetLeft;var parent = ele.offsetParent;while (parent && parent !== document.body) {left += (parent.clientLeft + parent.offsetLeft);parent = parent.offsetParent;}return left;}
优化:获取上边和左边的距离
function offset(ele) {var left = ele.offsetLeft;var top = ele.offsetTop;var parent = ele.offsetParent;while (parent && parent !== document.body) {left += (parent.clientLeft + parent.offsetLeft);top += (parent.clientTop + parent.offsetTop);parent = parent.offsetParent;}return {left,top};}
获取元素可滚动的高度
获取元素整个高度,减去当前元素的可视区高度,就得到其可滚动的高度
var max = box.scrollTop - box.clientHeight;
