js获取浏览器的可视区域尺寸的实现代码


Posted in Javascript onNovember 30, 2011

测试例子:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
<title></title> 
<style type="text/css"> 
*{ margin: 0; padding: 0;} 
body{ border: 10px solid red;} 
#inner{width: 2000px; height: 2000px; border: 5px solid blue;} 
</style> 
</head> 
<body> 
<div id="inner"></div> 
</body> 
</html>

结果:

chrome:

js获取浏览器的可视区域尺寸的实现代码

FF

js获取浏览器的可视区域尺寸的实现代码

OPERA:

js获取浏览器的可视区域尺寸的实现代码

SAFARI:

js获取浏览器的可视区域尺寸的实现代码

IE9:

js获取浏览器的可视区域尺寸的实现代码

IE8

js获取浏览器的可视区域尺寸的实现代码

IE7:

js获取浏览器的可视区域尺寸的实现代码

IE6

js获取浏览器的可视区域尺寸的实现代码

说明:

Chrome/FF/Safari/opera
对这些浏览器而言,window有个属性innerWidth/innerHeight包含的是整个文档的可视区域尺寸,注意,这个尺寸是包含滚动条大小的。
如果我们不计滚动条的影响,就可以直接使用这两个属性。
如果滚动条会影响(比如最大化弹出框),那么应该想另外的办法。Document对象是每个DOM树的根,但是它并不代表树中的一个HTML元素,document.documentElement属性引用了作为文档根元素的html标记,document.body属性引用了body标记
我们这里获取常见的三个值(scrollWidth、offsetWidth和clientwidth)来比较一下
document.documentElement.scrollWidth返回整个文档的宽度
document.documentElement.offsetWidth返回整个文档的可见宽度
document.documentElement.clientwidth返回整个文档的可见宽度(不包含边框),clientwidth = offsetWidth - borderWidth
不过一般来说,我们不会给document.documentElement来设置边框,所以这里的clientwidth 与 offsetWidth一致
document.body.scrollWidth返回body的宽度
注意,这里的scrollWidth有个不一致的地方,基于webkit的浏览器(chrome和safari)返回的是整个文档的宽度,也就是和document.documentElement.scrollWidth一致,
opera和FF返回的就是标准的body 的scrollWidth,个人觉得opera和FF算是比较合理的。
document.body.offsetWidth返回body的offsetWidth
document.body.clientwidth返回body的clientwidth(不包含边框),clientwidth = offsetWidth - borderWidth
我们看上面的例子,会发现body和documentElement的有些值是相等的,这并不是表示他们是等同的。而是因为当我们没有给body设置宽度的时候,document.body默认占满整个窗口宽度,于是就有:
document.body.scrollWidth = document.documentElement.scrollWidth
document.body.offsetWidth = document.documentElement.offsetWidth
document.body.clientwidth = document.documentElement.clientwidth - document.body.borderWidth(body的边框宽度)
当我们给body设置了一个宽度的时候,区别就出来了。
IE9/IE8
这两个差不多,唯一的区别是IE9包含window.innerWidth属性,而IE8不包含window.innerWidth属性。
document.documentElement.scrollWidth返回整个文档的宽度,和FF等浏览器一致
document.documentElement.offsetWidth返回整个文档的可见宽度(包含滚动条,值和innerWidth一致),注意,这里和FF等浏览器又有点区别。
document.documentElement.clientwidth返回整个文档的可见宽度(不包含边框),和FF等浏览器一致。clientwidth = offsetWidth - 滚动条宽度
document.body.scrollWidth返回body的宽度,注意,这里的scrollWidth和FF等浏览器有点区别,这里并不包括body本身的border宽度。
因此例子中,相比FF少了10px。
document.body.offsetWidth返回body的offsetWidth,和FF等浏览器一致
document.body.clientwidth返回body的clientwidth(不包含边框),和FF等浏览器一致,clientwidth = offsetWidth - borderWidth
IE7
IE7与IE9/IE8的主要区别是
第一、document.documentElement.offsetWidth的返回值不一样,
参见上面说的,IE9/IE8的document.documentElement.offsetWidth包含滚动条,但是,IE7的document.documentElement.offsetWidth不包含滚动条。
第二、document.documentElement.scrollWidth返回整个文档的宽度,注意,这里和IE9/IE8、FF等浏览器又有不一致,对于IE9/IE8、FF等浏览器,scrollWidth最小不会小于窗口的宽度,但是在IE下没有这个限制,文档有多小,这个就有多小
其他倒是挺一致的。
最后是IE6了
IE6的document.documentElement返回值与IE9/IE8没有区别(由此可见,对于document.documentElement,IE7就是个奇葩)。
话说回来,IE的document.body就是个奇葩,当没有给body设置宽度的时候,body是默认占满整个文档的(注意,其他的浏览器都是占满整个窗口),当然,最小值是整个窗口的大小,就是说body指向了根元素。
因此,在算上IE6在解析width方面的bug,和其他的浏览器的区别就淋漓尽致了。
document.body.scrollWidth返回body的宽度,和IE9/IE8/IE7一致
document.body.offsetWidth返回body的offsetWidth,注意,由于body的不同,这里的offsetWidth = scrollWidth + borderWidth
document.body.clientwidth返回body的clientwidth(不包含边框)clientwidth = offsetWidth - borderWidth
另外,有一点和IE7同样,就是document.documentElement.scrollWidth没有最小宽度限制。

总结一下,在标准模式下,我们获取文档可见区域的方法如下:

function getViewSizeWithoutScrollbar(){//不包含滚动条 
return { 
width : document.documentElement.clientWidth, 
height: document.documentElement.clientHeight 
} 
} 
function getViewSizeWithScrollbar(){//包含滚动条 
if(window.innerWidth){ 
return { 
width : window.innerWidth, 
height: window.innerHeight 
} 
}else if(document.documentElement.offsetWidth == document.documentElement.clientWidth){ 
return { 
width : document.documentElement.offsetWidth, 
height: document.documentElement.offsetHeight 
} 
}else{ 
return { 
width : document.documentElement.clientWidth + getScrollWith(), 
height: document.documentElement.clientHeight + getScrollWith() 
} 
} 
}

getScrollWith()是获取滚动条尺寸,参见
https://3water.com/article/29036.htm
有什么错误欢迎指出
Javascript 相关文章推荐
你可能不知道的JavaScript的new Function()方法
Apr 17 Javascript
Node.js与PHP、Python的字符处理性能对比
Jul 06 Javascript
jQuery将多条数据插入模态框的示例代码
Sep 25 Javascript
JS建造者模式基本用法实例分析
Jun 30 Javascript
JS+Canvas绘制时钟效果
Aug 20 Javascript
jQuery实现jQuery-form.js实现异步上传文件
Apr 28 jQuery
使用jquery+iframe做一个ajax上传效果(实例)
Aug 24 jQuery
Angular4表单验证代码详解
Sep 03 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
Mar 02 Javascript
Angular 利用路由跳转到指定页面的指定位置方法
Aug 31 Javascript
jQuery控制input只能输入数字和两位小数的方法
May 16 jQuery
使用JS来动态操作css的几种方法
Dec 18 Javascript
js取滚动条的尺寸的函数代码
Nov 30 #Javascript
window.event快达到全浏览器支持了,以后使用就方便了
Nov 30 #Javascript
图片在浏览器中底部对齐 解决方法之一
Nov 30 #Javascript
用Javascript评估用户输入密码的强度实现代码
Nov 30 #Javascript
用Javascript评估用户输入密码的强度(Knockout版)
Nov 30 #Javascript
Ubuntu 11.10 安装Node.js的方法
Nov 30 #Javascript
JavaScript中数组的排序、乱序和搜索实现代码
Nov 30 #Javascript
You might like
php防止恶意刷新与刷票的方法
2014/11/21 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
Smarty模板引擎缓存机制详解
2016/05/23 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
JavaScript延迟加载
2021/03/09 Javascript
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
javascript 清除输入框中的数据
2009/04/13 Javascript
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
JavaScript splice()方法详解
2020/09/22 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
用原生JS对AJAX做简单封装的实例代码
2016/07/13 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
BootStrap Fileinput初始化时的一些参数
2016/12/30 Javascript
js实现文字跑马灯效果
2017/02/23 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
Angularjs根据json文件动态生成路由状态的实现方法
2017/04/17 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
JavaScript变量作用域_动力节点Java学院整理
2017/06/27 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
英国现代市场:ARKET
2019/04/10 全球购物
临床护士自荐信
2014/01/31 职场文书
实名检举信范文
2015/03/02 职场文书
工程项目合作意向书
2015/05/08 职场文书
2016年小学生新年寄语
2015/08/18 职场文书
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python