用js小类库获取浏览器的高度和宽度信息


Posted in Javascript onJanuary 15, 2012

因此当用户在一个较长内容的网页中点击某一个按钮显示DIV层会发现没有任何效果(其实已经在页面的顶部显示了),因此,我们需要准备的知道用户当前的浏览的位置的信息。在实现这个要求之前,先来看看在js中有哪些工具可以让我们使用:

网页可见区域宽: document.body.clientWidth;
网页可见区域高: document.body.clientHeight;
网页可见区域宽: document.body.offsetWidth + " (包括边线和滚动条的宽)";
网页可见区域高:document.body.offsetHeight + " (包括边线的宽)";
网页正文全文宽:document.body.scrollWidth;
网页正文全文高:document.body.scrollHeight;
网页被卷去的高(ff): document.body.scrollTop;
网页被卷去的高(ie):document.documentElement.scrollTop;
网页被卷去的左:document.body.scrollLeft;
网页正文部分上: window.screenTop;
网页正文部分左: window.screenLeft;
屏幕分辨率的高: window.screen.height;
屏幕分辨率的宽: window.screen.width;
屏幕可用工作区高度: window.screen.availHeight;
屏幕可用工作区宽度: window.screen.availWidth;
你的屏幕设置是  window.screen.colorDepth +" 位彩色";
你的屏幕设置  window.screen.deviceXDPI +" 像素/英寸";

 

这段资料来源于网络,看到这么多的相似的概念时我已经疯掉了,但处于技术人的执着,我还是顽强的看完了并做了一些理解。经过自己的理解和吸收之后,我觉得如果我每次想获取一个高度或者宽度信息时我会抓狂的,因此,我对浏览器的这些属性做了一些整理和抽象,按照这样的三个对象来剥离这么多的相似的属性,第一个是页面,第二是窗口,第三个是视口。来看图片理解我的这三个对象的含义吧:

用js小类库获取浏览器的高度和宽度信息

对这三个概念做一个解释:

页面:就是我们制作出来的网页的页面的一个抽象,他的高度通常比我们的浏览器的高度要高,宽度通常是小于等于我们的浏览器宽度

浏览器窗口:就是我们使用的浏览器的一个抽象,他包含了菜单栏、工具栏、书签栏、状态栏、页面显示区等。因此他的高度绝对大于等于视口的高度,宽度绝对大于等于视口的宽度

视口:就是浏览器中显示页面的区域

有了这三个概念铺底,我们来写个小类库,获取这个“对象”的高度和宽度等信息吧:

var Browser = { 
}; 
//页面 
Browser.Page = (function () { 
return { 
scrollTop: function () { 
return Math.max(document.body.scrollTop, document.documentElement.scrollTop); 
}, 
scrollLeft: function () { 
return Math.max(document.body.scrollLeft, document.documentElement.scrollLeft); 
}, 
height: function () { 
var _height; 
if (document.compatMode == "CSS1Compat") { 
_height = document.documentElement.scrollHeight; 
} else { 
_height = document.body.scrollHeight; 
} 
return _height; 
}, 
width: function () { 
var _width; 
if (document.compatMode == "CSS1Compat") { 
_width = document.documentElement.scrollWidth; 
} else { 
_width = document.body.scrollWidth; 
} 
return _width; 
} 
}; 
})(); 
//窗口: 
Browser.Window = (function () { 
return { 
outerHeight: function () { 
var _hei = window.outerHeight; 
if (typeof _hei != "number") { 
_hei = Browser.ViewPort.outerHeight(); 
} 
return _hei; 
}, 
outerWidth: function () { 
var _wid = window.outerWidth; 
if (typeof _wid != "number") { 
_wid = Browser.ViewPort.outerWidth(); 
} 
return _wid; 
}, 
innerHeight: function () { 
var _hei = window.innerHeight; 
if (typeof _hel != "number") { 
_hei = Browser.ViewPort.innerHeight(); 
} 
return _hei; 
}, 
innerWidth: function () { 
var _wid = window.innerWidth; 
if (typeof _wid != "number") { 
_wid = Browser.ViewPort.innerWidth(); 
} 
return _wid; 
}, 
height: function () { 
return Browser.Window.innerHeight(); 
}, 
width: function () { 
return Browser.Window.innerWidth(); 
} 
} 
})(); 
//视口: 
Browser.ViewPort = (function () { 
return { 
innerHeight: function () { 
var _height; 
if (document.compatMode == "CSS1Compat") { 
_height = document.documentElement.clientHeight; 
} else { 
_height = document.body.clientHeight; 
} 
return _height; 
}, 
innerWidth: function () { 
var _width; 
if (document.compatMode == "CSS1Compat") { 
_width = document.documentElement.clientWidth; 
} else { 
_width = document.body.clientWidth; 
} 
return _width; 
}, 
outerHeight: function () { 
var _height; 
if (document.compatMode == "CSS1Compat") { 
_height = document.documentElement.offsetHeight; 
} else { 
_height = document.body.offsetHeight; 
} 
return _height; 
}, 
outerWidth: function () { 
var _width; 
if (document.compatMode == "CSS1Compat") { 
_width = document.documentElement.offsetWidth; 
} else { 
_width = document.body.offsetWidth; 
} 
return _width; 
}, 
width: function () { 
return Browser.ViewPort.innerWidth(); 
}, 
height: function () { 
return Browser.ViewPort.innerHeight(); 
} 
} 
})();

做几点说明:
1、已经能支持获取多浏览器的内部的视口的宽度和高度信息
2、在IE 9中已经和其他的浏览器(Opera、Chrome、FirFox、Safari)一样,已经能支持用window.innerHeight、window.innerWidth、window.outerHeight、window.outerWidth这四个属性获取浏览器的窗口、视口的宽度高度信息,但是IE9以前的IE版本是没有这些属性的,因此在这样的情况下,我将视口和窗口的概念等同起来了。
2、虽然window有宽度和高度信息,但是不一定是真正浏览器窗口的真正的宽度和高度信息。因为有些浏览器返回的结果中就不含菜单栏、工具栏等的高度信息。
实例演示:
在一个垂直内容过多的页面中,使一个DIV总能保持在视口的中心位置(非精确中心位置):
代码:
window.onload = window.onresize = function () { 
var top = Math.round(Browser.Page.scrollTop() + (Browser.ViewPort.height() / 2) - (parseInt(document.getElementById("divCenter").style.height) / 2)); 
var left = Math.round(Browser.Page.scrollLeft() + (Browser.ViewPort.width() / 2) - (parseInt(document.getElementById("divCenter").style.width) / 2)); 
document.getElementById("divCenter").style.top = top + "px"; 
document.getElementById("divCenter").style.left = left + "px"; 
}

大家测试时可以采用改变窗口大小的方式来查看。
时间不早了,晚安!
源代码下载查看
Javascript 相关文章推荐
Javascript Throttle & Debounce应用介绍
Mar 19 Javascript
js获取IFRAME当前的URL的方法
Nov 13 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
Dec 31 Javascript
jQuery实现首页图片淡入淡出效果的方法
Jun 10 Javascript
javascript使用输出语句实现网页特效代码
Aug 06 Javascript
基于JS实现Android,iOS一个手势动画效果
Apr 27 Javascript
基于Bootstrap3表格插件和分页插件实例详解
May 17 Javascript
jQuery的extend方法【三种】
Dec 14 Javascript
利用Javascript实现简单的转盘抽奖
Feb 13 Javascript
不得不看之JavaScript构造函数及new运算符
Aug 21 Javascript
原生JS写Ajax的请求函数功能
Dec 22 Javascript
微信小程序实现选项卡效果
Nov 06 Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
Jan 15 #Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
Jan 13 #Javascript
20个最新的jQuery插件
Jan 13 #Javascript
JSON 数据格式介绍
Jan 13 #Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
Jan 13 #Javascript
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
Jan 13 #Javascript
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
Jan 13 #Javascript
You might like
小偷PHP+Html+缓存
2006/11/25 PHP
mysql总结之explain
2012/02/27 PHP
JavaScript OOP面向对象介绍
2010/12/02 Javascript
单击浏览器右上角的X关闭窗口弹出提示的小例子
2013/06/12 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
检测一个函数是否是JavaScript原生函数的小技巧
2015/03/13 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
JS通过Cookie判断页面是否为首次打开
2016/02/05 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
详解Node.js access_token的获取、存储及更新
2017/06/20 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
微信小程序之选项卡的实现方法
2017/09/29 Javascript
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
[01:12:08]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.24
2019/09/10 DOTA
python复制文件的方法实例详解
2015/05/22 Python
详解python Todo清单实战
2018/11/01 Python
Django如何自定义model创建数据库索引的顺序
2019/06/20 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
Django中ORM找出内容不为空的数据实例
2020/05/20 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
建筑设计所实习生自我鉴定
2013/09/25 职场文书
制冷与电控专业应届生求职信
2013/11/11 职场文书
厂长助理岗位职责
2013/12/27 职场文书
酒吧创业计划书
2014/01/18 职场文书
好的旅游活动方案
2014/08/19 职场文书
2015初一年级组工作总结
2015/07/24 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书