用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 相关文章推荐
ExtJS Ext.MessageBox.alert()弹出对话框详解
Apr 02 Javascript
javascript 窗口加载蒙板 内嵌网页内容
Nov 19 Javascript
js对象转json数组的简单实现案例
Feb 28 Javascript
JavaScript定义类和对象的方法
Nov 26 Javascript
JQuery日历插件My97DatePicker日期范围限制
Jan 20 Javascript
性能优化之代码优化页面加载速度
Mar 01 Javascript
老生常谈combobox和combotree模糊查询
Apr 17 Javascript
微信小程序开发图片拖拽实例详解
May 05 Javascript
详解html-webpack-plugin用法全解
Jan 22 Javascript
Jquery获取radio选中值实例总结
Jan 17 jQuery
微信小程序实现打开并下载服务器上面的pdf文件到手机
Sep 20 Javascript
google广告之另类js调用实现代码
Aug 22 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 读取shell管道传输过来的内容
2010/03/01 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
2015/10/15 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
JavaScript动态修改网页元素内容的方法
2015/03/21 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
javascript简单实现类似QQ头像弹出效果的方法
2015/08/03 Javascript
表单验证正则表达式实例代码详解
2015/11/09 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
jQuery实现简单日期格式化功能示例
2017/09/19 jQuery
Fetch超时设置与终止请求详解
2019/05/18 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
Python中的生成器和yield详细介绍
2015/01/09 Python
Python 实现一个颜色色值转换的小工具
2016/12/06 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
python opencv进行图像拼接
2020/03/27 Python
如何理解python对象
2020/06/21 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
科颜氏美国官网:Kiehl’s美国
2017/01/31 全球购物
C# .NET面试题
2015/11/28 面试题
银行员工辞职信范文
2014/01/20 职场文书
森林病虫害防治方案
2014/06/02 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
单位委托书格式范本
2014/09/29 职场文书
2015年新教师工作总结
2015/04/28 职场文书
从零开始在Centos7上部署SpringBoot项目
2022/04/07 Servers
Spring Cloud OpenFeign模版化客户端
2022/06/25 Java/Android