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 相关文章推荐
如何用js控制css中的float的代码
Aug 16 Javascript
JScript中使用ADODB.Stream判断文件编码的代码
Jun 09 Javascript
JQuery的Ajax跨域请求原理概述及实例
Apr 26 Javascript
固定背景实现的背景滚动特效示例分享
May 19 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
Sep 03 Javascript
JavaScript 匿名函数和闭包介绍
Apr 13 Javascript
javascript实现捕捉键盘上按下的键
May 05 Javascript
比较常见的javascript中定义函数的区别
Nov 09 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
Dec 25 Javascript
动态内存分配导致影响Javascript性能的问题
Dec 18 Javascript
node.js的http.createServer过程深入解析
Jun 06 Javascript
JS实现躲避粒子小游戏
Jun 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
农民C键的运用技巧
2020/03/04 星际争霸
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
php读取excel文件的简单实例
2013/08/26 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
php对关联数组循环遍历的实现方法
2015/03/13 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
用JavaScript调用WebService的示例
2008/04/07 Javascript
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
javascript实现可拖动变色并关闭层窗口实例
2015/05/15 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
js仿微博实现统计字符和本地存储功能
2015/12/22 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
微信浏览器禁止页面下拉查看网址实例详解
2017/06/28 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
2015/05/20 Python
python实时分析日志的一个小脚本分享
2017/05/07 Python
使用pandas读取csv文件的指定列方法
2018/04/21 Python
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
java判断三位数的实例讲解
2019/06/10 Python
pymysql的简单封装代码实例
2020/01/08 Python
python与pycharm有何区别
2020/07/01 Python
python 读取.nii格式图像实例
2020/07/01 Python
Django用内置方法实现简单搜索功能的方法
2020/12/18 Python
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
西安夏日科技有限公司Java笔试题
2013/01/11 面试题
营销与策划应届生求职信
2013/11/04 职场文书
新闻专业本科生的自我评价分享
2013/11/20 职场文书
运动会领导邀请函
2014/01/10 职场文书
活动志愿者自荐信
2014/01/27 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
生日宴会祝酒词
2015/08/10 职场文书
Python利器openpyxl之操作excel表格
2021/04/17 Python
Python中常见的导入方式总结
2021/05/06 Python