用js小類庫(kù)獲取瀏覽器的高度和寬度信息
網(wǎng)頁(yè)可見區(qū)域?qū)挘?document.body.clientWidth;
網(wǎng)頁(yè)可見區(qū)域高: document.body.clientHeight;
網(wǎng)頁(yè)可見區(qū)域?qū)挘?document.body.offsetWidth + " (包括邊線和滾動(dòng)條的寬)";
網(wǎng)頁(yè)可見區(qū)域高:document.body.offsetHeight + " (包括邊線的寬)";
網(wǎng)頁(yè)正文全文寬:document.body.scrollWidth;
網(wǎng)頁(yè)正文全文高:document.body.scrollHeight;
網(wǎng)頁(yè)被卷去的高(ff): document.body.scrollTop;
網(wǎng)頁(yè)被卷去的高(ie):document.documentElement.scrollTop;
網(wǎng)頁(yè)被卷去的左:document.body.scrollLeft;
網(wǎng)頁(yè)正文部分上: window.screenTop;
網(wǎng)頁(yè)正文部分左: window.screenLeft;
屏幕分辨率的高: window.screen.height;
屏幕分辨率的寬: window.screen.width;
屏幕可用工作區(qū)高度: window.screen.availHeight;
屏幕可用工作區(qū)寬度: window.screen.availWidth;
你的屏幕設(shè)置是 window.screen.colorDepth +" 位彩色";
你的屏幕設(shè)置 window.screen.deviceXDPI +" 像素/英寸";
這段資料來源于網(wǎng)絡(luò),看到這么多的相似的概念時(shí)我已經(jīng)瘋掉了,但處于技術(shù)人的執(zhí)著,我還是頑強(qiáng)的看完了并做了一些理解。經(jīng)過自己的理解和吸收之后,我覺得如果我每次想獲取一個(gè)高度或者寬度信息時(shí)我會(huì)抓狂的,因此,我對(duì)瀏覽器的這些屬性做了一些整理和抽象,按照這樣的三個(gè)對(duì)象來剝離這么多的相似的屬性,第一個(gè)是頁(yè)面,第二是窗口,第三個(gè)是視口。來看圖片理解我的這三個(gè)對(duì)象的含義吧:
對(duì)這三個(gè)概念做一個(gè)解釋:
頁(yè)面:就是我們制作出來的網(wǎng)頁(yè)的頁(yè)面的一個(gè)抽象,他的高度通常比我們的瀏覽器的高度要高,寬度通常是小于等于我們的瀏覽器寬度
瀏覽器窗口:就是我們使用的瀏覽器的一個(gè)抽象,他包含了菜單欄、工具欄、書簽欄、狀態(tài)欄、頁(yè)面顯示區(qū)等。因此他的高度絕對(duì)大于等于視口的高度,寬度絕對(duì)大于等于視口的寬度
視口:就是瀏覽器中顯示頁(yè)面的區(qū)域
有了這三個(gè)概念鋪底,我們來寫個(gè)小類庫(kù),獲取這個(gè)“對(duì)象”的高度和寬度等信息吧:
var Browser = {
};
//頁(yè)面
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();
}
}
})();
做幾點(diǎn)說明:
1、已經(jīng)能支持獲取多瀏覽器的內(nèi)部的視口的寬度和高度信息
2、在IE 9中已經(jīng)和其他的瀏覽器(Opera、Chrome、FirFox、Safari)一樣,已經(jīng)能支持用window.innerHeight、window.innerWidth、window.outerHeight、window.outerWidth這四個(gè)屬性獲取瀏覽器的窗口、視口的寬度高度信息,但是IE9以前的IE版本是沒有這些屬性的,因此在這樣的情況下,我將視口和窗口的概念等同起來了。
2、雖然window有寬度和高度信息,但是不一定是真正瀏覽器窗口的真正的寬度和高度信息。因?yàn)橛行g覽器返回的結(jié)果中就不含菜單欄、工具欄等的高度信息。
實(shí)例演示:
在一個(gè)垂直內(nèi)容過多的頁(yè)面中,使一個(gè)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";
}
大家測(cè)試時(shí)可以采用改變窗口大小的方式來查看。
時(shí)間不早了,晚安!
源代碼下載查看
- 一實(shí)用的實(shí)現(xiàn)table排序的Javascript類庫(kù)
- javascript拖拽上傳類庫(kù)DropzoneJS使用方法
- JavaScript人臉識(shí)別技術(shù)及臉部識(shí)別JavaScript類庫(kù)Tracking.js
- 5個(gè)最佳的Javascript日期處理類庫(kù)分享
- 寫自已的js類庫(kù)需要的核心代碼
- stream.js 一個(gè)很小、完全獨(dú)立的Javascript類庫(kù)
- ECMAScript 創(chuàng)建自己的js類庫(kù)
- js插件類庫(kù)組織與管理(基于asp.net管理)
- JavaScript 應(yīng)用類庫(kù)代碼
- JS開發(fā)自己的類庫(kù)實(shí)例分析
相關(guān)文章
JavaScript與jQuery中文檔就緒函數(shù)的區(qū)別
這篇文章主要介紹了JavaScript與jQuery中文檔就緒函數(shù)的區(qū)別,文章內(nèi)容介紹詳細(xì),具有一的的參考價(jià)值,需要的小伙伴可以參考一下2022-03-03另一個(gè)javascript小測(cè)驗(yàn)(代碼集合)
共25道題,測(cè)試內(nèi)容包括運(yùn)算符,表達(dá)式,語句,javascript語言特性,JSON語法,數(shù)組,正則等。2011-07-07Javascript腳本實(shí)現(xiàn)靜態(tài)網(wǎng)頁(yè)加密實(shí)例代碼
這篇文章介紹了Javascript腳本實(shí)現(xiàn)靜態(tài)網(wǎng)頁(yè)加密實(shí)例代碼,有需要的朋友可以參考一下2013-11-11原生javascript實(shí)現(xiàn)DIV拖拽并計(jì)算重復(fù)面積
這篇文章主要介紹了使用原生javascript實(shí)現(xiàn)DIV拖拽并計(jì)算重復(fù)面積的方法及示例代碼分享,效果十分漂亮,需要的朋友可以參考下2015-01-01IE6背景圖片不緩存問題解決方案及圖片使用策略多個(gè)方法小結(jié)
最近發(fā)現(xiàn)的Web項(xiàng)目在IE6下出現(xiàn)背景圖片不緩存的問題,在網(wǎng)上搜索了一番,發(fā)現(xiàn)已經(jīng)是眾所周知的BUG,這里就總結(jié)一下各種解決辦法2012-05-05如何用CocosCreator實(shí)現(xiàn)射擊小游戲
這篇文章主要介紹了如何用CocosCreator實(shí)現(xiàn)射擊小游戲,此游戲難度不大,僅作為入門的練手小游戲,一小時(shí)就能完成,里面用到的知識(shí)很常用,喜歡游戲的同學(xué),可以參考下2021-04-04js實(shí)現(xiàn)簡(jiǎn)單排列組合的方法
這篇文章主要介紹了js實(shí)現(xiàn)簡(jiǎn)單排列組合的方法,可實(shí)現(xiàn)數(shù)學(xué)上排列組合算法功能,涉及JavaScript數(shù)組與字符串操作技巧,需要的朋友可以參考下2016-01-01