javascript獲取隱藏元素(display:none)的高度和寬度的方法
js獲取可見(jiàn)元素的尺寸還是比較方便的,這個(gè)可以直接使用這個(gè)方法:
function getDefaultStyle(obj,attribute){ // 返回最終樣式函數(shù),兼容IE和DOM,設(shè)置參數(shù):元素對(duì)象、樣式特性
return obj.currentStyle?obj.currentStyle[attribute]:document.defaultView.getComputedStyle(obj,false)[attribute];
}
但是如果這個(gè)元素是隱藏(display:none)的,尺寸又是未知自適應(yīng)的,哪有上面的方法就不行了!因?yàn)閐isplay:none的元素是沒(méi)有物理尺寸的! 悲劇就這樣發(fā)生了!
幸好css中還有visibility:hidden,不可見(jiàn)屬性,他和display:none最大的區(qū)別就是visibility:hidden有物理尺寸。有物理尺寸就可以通過(guò)上面的方法獲取尺寸,但是將display:none改成visibility:hidden后頁(yè)面就有一塊空白在那里,即使在你獲取尺寸后在馬上將visibility:hidden改成display:none頁(yè)面那部分還是會(huì)抖動(dòng)一下。那么最好的辦法就是將這個(gè)隱藏的元素移出屏幕或者脫離文檔流( position: absolute)。這樣似乎非常完美了,但是悲劇又發(fā)生了,如果你要再顯示這個(gè)元素的時(shí)侯這個(gè)元素是不可見(jiàn)的,位置也不對(duì),因?yàn)檫@是這個(gè)元素visibility:hidden;position: absolute。所以在獲取尺寸后還要將樣式還原回去。就是將position和visibility屬性設(shè)回原來(lái)的樣式。
這就是js獲取隱藏元素的尺寸基本實(shí)現(xiàn)方式,大家有興趣可以看看《精通javascript》這本書上的方法。
我這里也做了個(gè)簡(jiǎn)單的demo,大家可以看看源代碼:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>js獲取隱藏元素的尺寸</title>
<style type="text/css">
</style>
<script type="text/javascript" src="http://www.css88.com/tool/css3Preview/jquery-1.4.2.min.js"></script>
</head>
<body>
<div id="test_display_block" style="display:none; border:10px solid #CDCDCD; margin-left: 100px">這是test容器,可見(jiàn)容器<br />這是test容器,可見(jiàn)容器<br />這是test容器,可見(jiàn)容器<br />這是test容器,可見(jiàn)容器<br />這是test容器,<br />這是test容器,<br />這是test容器,<br />這是test容器,<br />這是test容器,<br /></div>
<div id="test_display_none" style="display:none; border:10px solid #CDCDCD">這是test容器,這是test容器,<br />這是test容器,<br />這是test容器,<br />這是test容器,<br />這是test容器,<br />這是test容器,<br /></div>
<div id="test_display_click">點(diǎn)我</div>
<script type="text/javascript">
//判斷對(duì)象類型
function getType(o){
var _t;
return ((_t = typeof(o)) == "object" ? o==null && "null" || Object.prototype.toString.call(o).slice(8,-1):_t).toLowerCase();
}
//獲取元素樣式
function getStyle(el, styleName) {
return el.style[styleName] ? el.style[styleName] : el.currentStyle ? el.currentStyle[styleName] : window.getComputedStyle(el, null)[styleName];
}
function getStyleNum(el, styleName) {
return parseInt(getStyle(el, styleName).replace(/px|pt|em/ig,''));
}
function setStyle(el, obj){
if (getType(obj) == "object") {
for (s in obj) {
var cssArrt = s.split("-");
for (var i = 1; i < cssArrt.length; i++) {
cssArrt[i] = cssArrt[i].replace(cssArrt[i].charAt(0), cssArrt[i].charAt(0).toUpperCase());
}
var cssArrtnew = cssArrt.join("");
el.style[cssArrtnew] = obj[s];
}
}
else
if (getType(obj) == "string") {
el.style.cssText = obj;
}
}
function getSize(el) {
if (getStyle(el, "display") != "none") {
return { width: el.offsetWidth || getStyleNum(el, "width"), height: el.offsetHeight || getStyleNum(el, "height") };
}
var _addCss = { display: "", position: "absolute", visibility: 'hidden' };
var _oldCss = {};
for (i in _addCss) {
_oldCss[i] = getStyle(el, i);
}
setStyle(el, _addCss);
var _width = el.clientWidth || getStyleNum(el, "width");
var _height = el.clientHeight || getStyleNum(el, "height");
for (i in _oldCss) {
setStyle(el, _oldCss);
}
return { width: _width, height: _height };
}
var dd=document.getElementById("test_display_block");
alert(getSize(dd).height);
document.getElementById("test_display_click").onclick=function(){
dd.style.display="block";
document.getElementById("test_display_none").style.display="block";
}
alert($("#test_display_none").height());
</script>
</body>
</html>
題外話:一般js的框架,庫(kù)都已經(jīng)封裝了這個(gè)方法,比如jQ,我們可以直接使用 height()和width()方法獲取隱藏元素的尺寸。
相關(guān)文章
js立即執(zhí)行函數(shù): (function ( ){})( ) 與 (function ( ){}( )) 有什么區(qū)別?
這篇文章主要介紹了js立即執(zhí)行函數(shù): (function ( ){})( ) 與 (function ( ){}( )) 有什么區(qū)別,需要的朋友可以參考下2015-11-11關(guān)于JS判斷圖片是否加載完成且獲取圖片寬度的方法
本篇文章小編為大家介紹,關(guān)于JS判斷圖片是否加載完成且獲取圖片寬度的方法,有需要的朋友可以參考一下2013-04-04G6?TreeGraph樹(shù)圖節(jié)點(diǎn)懶加載使用場(chǎng)景示例
這篇文章主要為大家介紹了G6?TreeGraph樹(shù)圖節(jié)點(diǎn)懶加載使用場(chǎng)景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10layui 數(shù)據(jù)表格 點(diǎn)擊分頁(yè)按鈕 監(jiān)聽(tīng)事件的實(shí)例
今天小編就為大家分享一篇layui 數(shù)據(jù)表格 點(diǎn)擊分頁(yè)按鈕 監(jiān)聽(tīng)事件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09JS跳出循環(huán)的方法區(qū)別對(duì)比分析(break,continue,return)
面向?qū)ο缶幊陶Z(yǔ)法中我們會(huì)碰到break ,continue, return這三個(gè)常用的關(guān)鍵字,那么關(guān)于這三個(gè)關(guān)鍵字的使用具體的操作是什么呢?接下來(lái)通過(guò)本文給大家講解JS跳出循環(huán)的方法區(qū)別對(duì)比分析(break,continue,return),感興趣的朋友一起看看吧2023-02-02