原文地址:http://caibaojian.com/js-name.html

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=>undefined alert(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=>undefined
alert(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=>1440
alert(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,滚动条的宽度因系统不同而不同):

// borderLeftWidth
alert(oDemo.clientLeft);
// =>50 // borderTopWidth
alert(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+marginLeft
alert(oDemo.offsetLeft);
// chrome=>20+10+80+70=180
// ie6/7/8/9/10/firefox=>160 // 以最近的定位祖先元素为准
// 谷歌=>parentBorderTopWidth+parentPaddingTopWidth+left+marginLeft
// 其他=>parentBorderTopWidth+left+marginLeft
alert(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。

元素相对位置:无。

JavaScript概念之screen/client/offset/scroll/inner/avail的width/left 分类: JavaScript HTML+CSS 2015-05-27 16:42 635人阅读 评论(0) 收藏的更多相关文章

  1. js函数 标签: javascript 2016-08-12 16:48 56人阅读 评论(0) 收藏

    函数实际上是对象,函数名实际上也是一个指向函数对象的指针. 使用不带圆括号的函数名是访问函数指针,而非调用函数. 函数声明和函数表达式: alert(test(2,3)); function test ...

  2. JavaScript中的一些细节 分类: C1_HTML/JS/JQUERY 2014-08-05 16:45 384人阅读 评论(0) 收藏

    1.设置id / class等属性 用 setAttribute 设置一些常规属性如 id ,className 的时候经常不起作用,只能用 object.id = value 这样来设置 news_ ...

  3. JavaScript、Ajax与jQuery的关系 分类: C1_HTML/JS/JQUERY 2014-07-31 10:15 3388人阅读 评论(0) 收藏

    简单总结: 1.JS是一门前端语言. 2.Ajax是一门技术,它提供了异步更新的机制,使用客户端与服务器间交换数据而非整个页面文档,实现页面的局部更新. 3.jQuery是一个框架,它对JS进行了封装 ...

  4. Javascript图片预加载详解 分类: JavaScript HTML+CSS 2015-05-29 11:01 768人阅读 评论(0) 收藏

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  5. 【C#小知识】C#中一些易混淆概念总结(六)---------解析里氏替换原则,虚方法 分类: C# 2014-02-08 01:53 1826人阅读 评论(0) 收藏

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  6. 【C#小知识】C#中一些易混淆概念总结(五)---------继承 分类: C# 2014-02-06 22:05 1106人阅读 评论(0) 收藏

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  7. javascript中0级DOM和2级DOM事件模型浅析 分类: C1_HTML/JS/JQUERY 2014-08-06 15:22 253人阅读 评论(0) 收藏

    Javascript程序使用的是事件驱动的设计模式,为一个元素添加事件监听函数,当这个元素的相应事件被触发那么其添加的事件监听函数就被调用: <input type="button&q ...

  8. javascript的全局变量 分类: C1_HTML/JS/JQUERY 2014-08-07 11:03 562人阅读 评论(0) 收藏

    javascipt是一门面向对象的编程语言.由于存在一些全局属性及全局函数,因此可以认为存在一个全局变量,这些全局属性及全局函数均是其属性或函数. 在js核心中,并没有定义一个具体的全局变量,因此,j ...

  9. 百度地图-省市县联动加载地图 分类: Demo JavaScript 2015-04-26 13:08 530人阅读 评论(0) 收藏

    在平常项目中,我们会遇到这样的业务场景: 客户希望把自己的门店绘制在百度地图上,通过省.市.区的选择,然后加载不同区域下的店铺位置. 先看看效果图吧: 实现思路: 第一步:整理行政区域表: 要实现通过 ...

随机推荐

  1. 第12章:MongoDB-CRUD操作--文档--查询--游标详解

    ①是什么游标 游标不是查询结果,可以理解为数据在遍历过程中的内部指针,其返回的是一个资源,或者说数据读取接口. 客户端通过对游标进行一些设置就能对查询结果进行有效地控制,如可以限制查询得到的结果数量. ...

  2. ThinkPHP5 <= 5.0.22 远程代码执行高危漏洞

    漏洞描述 由于ThinkPHP5框架对控制器名没有进行足够的安全检测,导致在没有开启强制路由的情况下,黑客构造特定的请求,可直接GetWebShell. 漏洞评级 严重 影响版本 ThinkPHP 5 ...

  3. ArcMap等值面

    先说一下题目,ArcMap中没有由栅格直接生成等值面的功能,但由栅格直接生成等值线的功能存在,可通过如下方式得到等值面: 1.提取等值线 由dem直接提取等值线:Spatial Analyst Too ...

  4. 如何比较两个xml 的异同

    http://www.xmlunit.org/ <dependency>     <groupId>org.xmlunit</groupId>     <ar ...

  5. (转)可伸缩性最佳实践:来自eBay的经验

    转自:http://www.infoq.com/cn/articles/ebay-scalability-best-practices 在eBay,可伸缩性是我们每天奋力抵抗的一大架构压力.我们所做的 ...

  6. _编程语言_C语言_C++_时间

    C++ 标准库没有提供日期类型,使用C预压的日期和事件操作. 使用时引入头文件  <ctime> . 四个和事件相关的函数: clock_t // 系统时间和日期表示为某种整数time_t ...

  7. 【python-ini】python读写ini文件

    [python-ini]python读写ini文件 本文实例讲述了Python读写ini文件的方法.分享给大家供大家参考.具体如下: 比如有一个文件update.ini,里面有这些内容:   1 2 ...

  8. noip第2课作业

    1.    大象喝水 [问题描述] 一只大象口渴了,要喝20升水才能解渴,但现在只有一个深h厘米,底面半径为r厘米的小圆桶(h和r都是整数).问大象至少要喝多少桶水才会解渴. 输入:输入有一行,包行两 ...

  9. 《mysql必知必会》学习_第13章_20180803_欢

    第13章:分组过滤. P83 select count(*) as num_prods from products where vend_id=1003; #返回vend_id=1003的产品数目总值 ...

  10. hdu 2227

    和之前的hdu3030都快一样了 可以参考之前的题解 #include <iostream> #include <cstdio> #include <cstdlib> ...