JavaScript获取浏览器视口与页面尺寸的工具类封装

作者:页面旅途时间:2026-10-26 16:44:28浏览:388

本文介绍如何利用JavaScript封装获取浏览器视口、页面及窗口尺寸的工具类。通过统一处理document.body与document.documentElement在不同兼容模式下的差异,解决跨浏览器获取scrollTop、scrollWidth等属性不一致的问题,并提供将元素居中显示的实战示例。

获取浏览器尺寸信息的必要性

当用户在长页面中点击按钮显示DIV层时,若未处理滚动位置,层可能显示在页面顶部而非用户当前可视区域,导致交互失效。因此,准确获取用户当前的浏览位置信息至关重要。在实现此功能前,先梳理JavaScript中可用于获取相关信息的工具:

常用DOM尺寸属性梳理

网页可见区域宽:document.body.clientWidth; 网页可见区域高:document.body.clientHeight; 网页可见区域宽(含边线和滚动条):document.body.offsetWidth; 网页可见区域高(含边线):document.body.offsetHeight; 网页正文全文宽:document.body.scrollWidth; 网页正文全文高:document.body.scrollHeight; 网页被卷去的高(Firefox):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 + " 像素/英寸"。

 

页面、窗口与视口的概念区分

这些资料多源自网络,面对大量相似且易混淆的概念,直接记忆极为困难。经过梳理与抽象,可将这些属性归纳为三个核心对象:页面(Page)、窗口(Window)和视口(ViewPort)。通过理解这三个对象的含义,可以更清晰地处理各类尺寸信息。

浏览器三层

对这三个概念的具体解释如下:

页面(Page):指网页内容的整体抽象。其高度通常大于浏览器可视高度,宽度通常小于或等于浏览器宽度。

浏览器窗口(Window):指浏览器应用程序本身的抽象,包含菜单栏、工具栏、书签栏、状态栏及页面显示区等。因此,窗口高度必然大于或等于视口高度,宽度必然大于或等于视口宽度。

视口(ViewPort):指浏览器中实际显示网页内容的区域。

JavaScript尺寸获取工具类实现

基于上述概念,我们可以编写一个小类库来获取这些“对象”的高度和宽度等信息。

具体实现代码如下:

 
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、Firefox、Safari)一致,支持使用window.innerHeight、window.innerWidth、window.outerHeight、window.outerWidth这四个属性获取浏览器窗口及视口的宽度和高度信息。但在IE9以前的IE版本中,这些属性不可用,因此在此类情况下,代码将视口和窗口的概念等同处理。


3、虽然window对象提供了宽度和高度信息,但这不一定是真正浏览器窗口的完整尺寸。因为某些浏览器返回的结果中可能不包含菜单栏、工具栏等的高度信息。


实例:使DIV保持在视口中心

实例演示:


在一个垂直内容过多的页面中,使一个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";
} 

测试时,可以通过改变窗口大小来验证效果。


时间不早了,晚安!


源代码下载查看

作者最新文章