JS中各种宽度距离小结
js中获取各种宽度和距离,常常让我们混淆,各种浏览器的不兼容让我们很头疼,现在就在说说js中有哪些宽度和距离。
1、名词解释
- screen:屏幕。这一类取到的是关于屏幕的宽度和距离,与浏览器无关,应该是获取window对象的属性。
 - client:使用区、客户区。指的是客户区,当然是指浏览器区域。
 - offset:偏移。指的是目标甲相对目标乙的距离。
 - scroll:卷轴、卷动。指的是包含滚动条的的属性。
 - inner:内部。指的是内部部分,不含滚动条。
 - avail:可用的。可用区域,不含滚动条,易与inner混淆。
 
2、window
2.1、window.innerWidth/innerHeight
描述:浏览器可见区域的内宽度、高度(不含浏览器的边框,但包含滚动条)。
兼容:ie9/10、chrome、firefox。
示例(缩放浏览器的宽度为1000px,高度为500px):
alert(window.innerWidth);
// chrome/firefox/ie9/10=>1000
// ie6/7/8=>undefined
alert(window.innerHeight);
// chrome/firefox/ie9/10=>500
// ie6/7/8=>undefined
2.2、window.outerWidth/outerHeight
描述:浏览器外宽度(包含浏览器的边框,因各个浏览器的边框边一样,得到的值也是不一样的)。
兼容:ie9/10、chrome、firefox。
示例(缩放浏览器的宽度为1000px,高度为500px):
alert(window.outerWidth);
// chrome/firefox/ie9/10=>1002
// ie6/7/8=>undefined
alert(window.outerHeight);
// chrome/firefox/ie9/10=>502
// ie6/7/8=>undefined
注意:没有window.width属性。
2.3、window.screenLeft/screenTop
描述:浏览器的位移,表示:
- ie浏览器的内边缘距离屏幕边缘的距离。
 - chrome浏览器的外边缘距离屏幕边缘的距离。
 
如图:

兼容:ie6/7/8/9/10、chrome。
示例:
alert(window.screenLeft);// ie=>87// chrome=>86// firefox=>undefinedalert(window.screenTop);// ie=>87// chrome=>86// firefox=>undefined
2.4、window.screenX/screenY
描述:浏览器的位移,表示:
- ie9/10浏览器的外边缘距离屏幕边缘的距离。
 - chrome浏览器的外边缘距离屏幕边缘的距离。
 
由此可知,chrome的screenLeft和screenX是相等的(其目的是为了兼容ie和firefox,两个属性都兼备了,但更趋向于firefox,chrome的这种做法不止这一处,还有很多,其实这种做法便于开发者移植,但对开发者的开发过程产生了一定的混淆),ie9/10的screenLeft是大于screenX的,如图:
【图】
兼容:ie9/10、chrome、firefox。
示例:
- alert(window.screenX);
 - // chrome/firefox=>86
 - // ie9/10=>79
 - // ie6/7/8=>undefined
 - alert(window.screenY);
 - // chrome/firefox=>86
 - // ie9/10=>79
 - // ie6/7/8=>undefined
 
2.5、window.pageXOffset/pageYOffset
描述:表示浏览器X轴(水平)、Y轴(垂直)滚动条的偏移距离。
兼容:ie9/10、chrome、firefox。
示例:
document.onclick=function(){alert(window.pageXOffset);// chrome=>200// firefox=>200// ie9/10=>200// ie6/7/8=>undefinedalert(window.pageYOffset);// chrome=>200// firefox=>200// ie9/10=>200// ie6/7/8=>undefined};
2.6、window.scrollX/scrollY
描述:表示浏览器X轴(水平)、Y轴(垂直)滚动条的偏移距离。由此可知,在chrome和firefox中window.pageXOffset和window.scrollX是相等的,具体为什么会出现两个相等的属性值,不得而知。
兼容:chrome、firefox。
示例:
- document.onclick=function(){
 - alert(window.scrollX);
 - // chrome=>200
 - // firefox=>200
 - // ie6/7/8/9/10=>undefined
 - alert(window.scrollY);
 - // chrome=>200
 - // firefox=>200
 - // ie6/7/8/9/10=>undefined
 - };
 
3、screen
3.1、screen.width/height
描述:屏幕的宽度、高度(指的是屏幕的分辨率,单位为像素)。
兼容性:ie6/7/8/9/10、chrome、firefox。
示例(屏幕的分辨率为1440×900):
alert(screen.width);// chrome/firefox/ie6/7/8/9/10=>1440alert(screen.height);// chrome/firefox/ie6/7/8/9/10=>900
注意:此处必须是screen.width,而不是screenWidth,与接下来要说的各种宽度有所区别。
3.2、screen.availWidth/availHeight
描述:屏幕的可用宽度、高度(通常与屏幕的宽度、高度一致)。
兼容性:ie6/7/8/9/10、chrome、firefox。
示例:
- alert(screen.availWidth);
 - // chrome/firefox/ie6/7/8/9/10=>1440
 - alert(screen.availHeight);
 - // chrome/firefox/ie6/7/8/9/10=>900
 
4、element
元素的宽度、位移、距离以元素的盒模型为content-box为例。即:
box-sizing: content-box;
其他盒模型计算会有差异,请勿对号入座。
4.1、elment.clientWidth/clientHeight
描述:计算如下,
- 有滚动条时:clientWidth=元素左内边距宽度+元素宽度+元素右内边距宽度-元素垂直滚动条宽度
 - 无滚动条时:clientWidth=元素左内边距宽度+元素宽度+元素右内边距宽度
 
使用该特性可以计算出的滚动条宽度(即设置元素的内容宽度超过元素宽度,然后分别设置是否超过隐藏,两次的clientWidth差值就是滚动条的宽度)。
兼容:chrome、firefox、ie6/7/8/9/10。
示例(宽度和高度都为100px,边框为50px,内边距为60px,外边距为70px,左、上位移为80px,滚动条的宽度因系统不同而不同):

- // 有滚动条=>paddingLeftWidth+width+paddingRightWidth-scrollYWidth
 - // 无滚动条=>paddingLeftWidth+width+paddingRightWidth
 - alert(oDemo.clientWidth);
 - // 有滚动条=>60+100+60-17=203
 - // 无滚动条=>60+100+60=220
 - // 有滚动条=>paddingTopWidth+height+paddingBottomWidth-scrollYHeight
 - // 无滚动条=>paddingTopWidth+height+paddingBottomWidth
 - alert(oDemo.clientHeight);
 - // 有滚动条=>60+100+60-17=203
 - // 无滚动条=>60+100+60=220
 
4.2、element.clientLeft/clientTop
描述:clientLeft为左边框宽度,clientTop为上边框宽度。
兼容:chrome、firefox、ie6/7/8/9/10。
示例(宽度和高度都为100px,边框为50px,内边距为60px,外边距为70px,左、上位移为80px,滚动条的宽度因系统不同而不同):

// borderLeftWidthalert(oDemo.clientLeft);// =>50// borderTopWidthalert(oDemo.clientTop);// =>50
4.3、element.offsetWidth/offsetHeight
描述:offsetWidth=元素左边框宽度+元素左内边距宽度+元素宽度+元素右内边距宽度+元素右边框宽度。
兼容:chrome、firefox、ie6/7/8/9/10。
示例(宽度和高度都为100px,边框为50px,内边距为60px,外边距为70px,左、上位移为80px,滚动条的宽度因系统不同而不同):
- // borderLeftWidth+paddingLeftWidth+width+paddingRightWidth+borderRightWidth
 - alert(oDemo.offsetWidth);
 - // =>50+60+100+60+50=320
 - // borderTopWidth+paddingLeftWidth+width+paddingRightWidth+borderRightWidth
 - alert(oDemo.offsetWidth);
 - // =>50+60+100+60+50=320
 
4.4、element.offsetLeft/offsetTop
描述:表示该元素相对于最近的定位祖先元素的距离,
chrome:offsetLeft=定位祖先左边框宽度+定位祖先元素左内边距宽度+左位移+左外边距宽度
ie6/7/8/9/10、firefox:offsetLeft=定位祖先元素左内边距宽度+左位移+左外边距宽度。
chrome比其他浏览器多计算了定位祖先元素的边框。offsetTop同理。
兼容:chrome、firefox、ie6/7/8/9/10。
示例(宽度和高度都为100px,边框为50px,内边距为60px,外边距为70px,左、上位移为80px,滚动条的宽度因系统不同而不同):
// 以最近的定位祖先元素为准// 谷歌=>parentBorderLeftWidth+parentPaddingLeftWidth+left+marginLeft// 其他=>parentPaddingLeftWidth+left+marginLeftalert(oDemo.offsetLeft);// chrome=>20+10+80+70=180// ie6/7/8/9/10/firefox=>160// 以最近的定位祖先元素为准// 谷歌=>parentBorderTopWidth+parentPaddingTopWidth+left+marginLeft// 其他=>parentBorderTopWidth+left+marginLeftalert(oDemo.offsetLeft);// chrome=>20+10+80+70=180// ie6/7/8/9/10/firefox=>160
4.5、element.scrollWidth/scrollHeight
描述:计算方法如,
- 有滚动条时:
- chrome、firefox、ie8/9/10:左内边距宽度+内容宽度。
 - ie6/7:左内边距宽度+内容宽度+右内边距宽度(是由CSS的BUG引起)。
 
 - 无滚动条时:左内边距宽度+宽度+右内边距宽度。
 
兼容:chrome、firefox、ie8/9/10、ie6/7(半兼容)。
示例(宽度和高度都为100px,边框为50px,内边距为60px,外边距为70px,左、上位移为80px,滚动条的宽度因系统不同而不同,内容宽度和高度都为200px):
- // 有滚动条=paddingLeftWidth+contentWidth
 - // 有滚动条(ie6/7)=paddingLeftWidth+contentWidth+paddingRightWidth
 - // 无滚动条=paddingLeftWidth+width+paddingRightWidth
 - alert(oDemo.scrollWidth);
 - // 有滚动条=>200+60=260
 - // 有滚动条(ie6/7)=>200+60+60=320
 - // 无滚动条=>100+60+60=220
 - // 有滚动条=paddingTopWidth+contentWidth
 - // 有滚动条(ie6/7)=paddingTopWidth+contentWidth+paddingBottomWidth
 - // 无滚动条=paddingTopWidth+width+paddingBottomWidth
 - alert(oDemo.scrollHeight);
 - // 有滚动条=>60+200=260
 - // 有滚动条(ie6/7)=>60+200+60=320
 - // 无滚动条=>60+100+60=220
 
4.6、element.scrollLeft/scrollTop
描述:获得水平、垂直滚动条的距离。
兼容:chrome、firefox、ie6/7/8/9/10。
示例(宽度和高度都为100px,边框为50px,内边距为60px,外边距为70px,左、上位移为80px,滚动条的宽度因系统不同而不同):
- document.onclick=function(){
 - // 水平滚动条左距离
 - alert(oDemo.scrollLeft);
 - // 垂直滚动条上距离
 - alert(oDemo.scrollTop);
 - }
 
5、总结
因为document.documentElement就是浏览器的html标签,所以获取浏览器的相关属性,也可以用该对象来获取。
屏幕宽度:window.screen.width。
浏览器内宽度:window.innerWidth || document.documentElement.clientWidth。
元素内容宽度:element.clientWidth。
元素占位宽度:element.offsetWidth。
元素相对位置:无。
JS中各种宽度距离小结的更多相关文章
- 20190430-screen、client、offset、scroll等JS中各种宽度距离
		
参考文献: JavaScript概念之screen/client/offset/scroll/inner/avail的width/left
 - JS中各种宽度、高度、位置、距离总结
		
1.window.screen 浏览器与屏幕的距离,screenX(screenLeft),screenY(screenTop) 2.window.scrollTo(x,y) 将纵向滚动条移动到相对于 ...
 - js中各种宽度高度总结
		
offsetWidth 是对象的可见宽度,包滚动条等边线,会随窗口的显示大小改变 IE6.0.FF1.06+:offsetWidth = width + padding + borderoffsetH ...
 - Js 中一系列宽度和高度的学习
		
在学习元素一系列宽度和高度之前,我们先来看一个平时开发中几乎不会遇到的问题,那就是html文档声明<!DOCTYPE html> 确实会对元素的宽高产生影响.几乎不会遇到,是因为我们在写h ...
 - js中document的用法小结
		
document常用属性: document.title//设置文档标题,与HTNL中的title标签等价 document.bgColor//设置页面背景颜色 document.fgColor//设 ...
 - js中 的这些距离你知道吗?
 - js,jQuery数组常用操作小结
		
一.js中数组常用操作小结 (1) shift:删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift() ...
 - js中高度与宽度的获取
		
JS获取各种宽度.高度的简单介绍: scrollHeight: 获取对象的滚动高度. scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 scrollTop:设置或获 ...
 - js中对arry数组的各种操作小结  瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据  web前端url传递值 js加密解密  HTML中让表单input等文本框为只读不可编辑的方法  js监听用户的键盘敲击事件,兼容各大主流浏览器  HTML特殊字符
		
js中对arry数组的各种操作小结 最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...
 
随机推荐
- ansible基础-优化
			
简介 当管理集群达到一定规模时,ansible达到性能瓶颈是难以避免的,此时我们可以通过一定手段提高ansible的执行效率和性能. 笔者虽未管理过超大规模服务器,但也通过查找资料和咨询大神了解了一些 ...
 - dubbo-springboot入门级demo
			
1. dubbo-springboot入门级demo 1.1. 前言 最后一个做运维的朋友和我提起,他们公司想做个dubbo灰度发布的功能,而这个功能落到了他头上.在我的印象里,dubbo应该可以通过 ...
 - 构造方法、This关键字、静态与封装的特性与作用
			
1.构造方法 构造方法是一种特殊的方法,专门用于构造/实例化对象. 构造方法根据是否有参数分为无参构造方法和有参构造方法. 1.1无参构造方法 无参构造方法就是构造方法没有任何参数.无参构造方法在创建 ...
 - Identity Server 4 预备知识 -- OpenID Connect 简介
			
我之前的文章简单的介绍了OAuth 2.0 (在这里: https://www.cnblogs.com/cgzl/p/9221488.html), 还不是很全. 这篇文章我要介绍一下 OpenID C ...
 - 【Android Studio安装部署系列】二十四、Android studio中Gradle插件版本和Gradle版本关系
			
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 在从Android Studio3.0.0版本升级到Android Studio3.0.1版本的时候,出现了一个问题,需要升级Gra ...
 - 《HelloGitHub》第 28 期
			
<HelloGitHub>第 28 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程. ...
 - 微信小程序开发07-列表页面怎么做
			
接上文:微信小程序开发06-一个业务页面的完成 github地址:https://github.com/yexiaochai/wxdemo 我们首页功能基本完成,我对比了下实际工作中的需求,完成度有7 ...
 - Selenium的发展历史及原理
			
目录 1. selenium1.0的产生 2. webdriver的产生 3. selenium和webdriver的合并 4. selenium3.0的产生 1. selenium1.0的产生 为什 ...
 - k8s网络之Flannel网络
			
k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 简介 Flannel是CoreOS团队针对Kubernetes设计的一个网络规划 ...
 - 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU开发那些事 - 索引
			
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是飞思卡尔i.MX RT系列微控制器相关知识. 飞思卡尔半导体(现恩智浦半导体)于2017年开始推出的i.MX RT系列开启了高性能MC ...