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 相关文章推荐
在第一个input框内输入内容.textarea自动得到第一个文件框的值的javascript代码
Apr 20 Javascript
jQuery内置的AJAX功能和JSON的使用实例
Jul 27 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
Mar 02 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
Jun 10 Javascript
vue下拉列表功能实例代码
Apr 08 Javascript
angular6.0开发教程之如何安装angular6.0框架
Jun 29 Javascript
vue中子组件的methods中获取到props中的值方法
Aug 27 Javascript
解决vue-cli webpack打包后加载资源的路径问题
Sep 25 Javascript
Vuex的基本概念、项目搭建以及入坑点
Nov 04 Javascript
微信小程序实现卡片层叠滑动效果
Jun 21 Javascript
微信小程序静默登录的实现代码
Jan 08 Javascript
jquery实现上传图片功能
Jun 29 jQuery
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
MySql中正则表达式的使用方法描述
2008/07/30 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
javascript里的条件判断
2007/02/27 Javascript
jquery对单选框,多选框,文本框等常见操作小结
2014/01/08 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
实例分析javascript中的call()和apply()方法
2014/11/28 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
2015/02/27 Javascript
JS+CSS实现美化的下拉列表框效果
2015/08/11 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
jquery表单提交带错误信息提示效果
2017/03/09 Javascript
JavaScript数组_动力节点Java学院整理
2017/06/26 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
npm 常用命令详解(小结)
2019/01/17 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
Javascript如何实现扩充基本类型
2020/08/26 Javascript
Vant 中的Toast设置全局的延迟时间操作
2020/11/04 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
详解Django中的过滤器
2015/07/16 Python
详解Django框架中用户的登录和退出的实现
2015/07/23 Python
python二分查找算法的递归实现方法
2016/05/12 Python
python 文件操作删除某行的实例
2017/09/04 Python
Python3 处理JSON的实例详解
2017/10/29 Python
Python列表对象实现原理详解
2019/07/01 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
全球知名旅游社区巴西站点:TripAdvisor巴西
2016/07/21 全球购物
养殖行业的创业计划书
2014/01/05 职场文书
资源工程专业毕业生求职信
2014/02/27 职场文书
绿化工程实施方案
2014/03/17 职场文书
解放思想演讲稿
2014/09/11 职场文书
内勤岗位职责范本
2015/04/13 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书
导游词之京东大峡谷旅游区
2019/10/29 职场文书