最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js獲取隱藏元素寬高的實現(xiàn)方法

 更新時間:2016年05月19日 09:49:29   投稿:jingxian  
下面小編就為大家?guī)硪黄猨s獲取隱藏元素寬高的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

網(wǎng)上有一些js獲取隱藏元素寬高的方法,但是可能會存在某些情況獲取不了。

例如:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
  <title>test</title>
</head>
<body>
<div id="test" style="display:none">
   我有一壺酒,足以慰風(fēng)塵。盡傾江海里,贈飲天下人。
</div>
<div id="test2" style="display:none">
   <div style="display:none">
     <div id="test2_child">
        我有一壺酒,足以慰風(fēng)塵。盡傾江海里,贈飲天下人。
     </div>
   </div>
</div>
<div id="test3">
   <div>
     <div id="test3_child">
        我有一壺酒,足以慰風(fēng)塵。盡傾江海里,贈飲天下人。
     </div>
   </div>
</div>
</div>
</body>
</html>


test獲取得了,但是test2_child是獲取不到的。鑒于這種情況,于是自己寫了一個方法解決。

解決思路:

1. 獲取元素(拿寬高那個)所有隱藏的祖先元素直到body元素,包括自己。

2. 獲取所有隱藏元素的style的display、visibility 屬性,保存下來。

3. 設(shè)置所有隱藏元素為 visibility:hidden;display:block !important;(之所以要important是避免優(yōu)先級不夠)。

4. 獲取元素(拿寬高那個)的寬高。

5. 恢復(fù)所有隱藏元素的style的display、visibility 屬性。

6. 返回元素寬高值。

代碼實現(xiàn):

function getSize(id){
   var width,
     height,
     elem = document.getElementById(id),
     noneNodes = [],
     nodeStyle = [];
   getNoneNode(elem); //獲取多層display:none;的元素
   setNodeStyle();
   width = elem.clientWidth;
   height = elem.clientHeight;
   resumeNodeStyle();
  
   return {
     width : width,
     height : height
   }

   function getNoneNode(node){
     var display = getStyles(node).getPropertyValue('display'),
        tagName = node.nodeName.toLowerCase();
     if(display != 'none'
        && tagName != 'body'){
        getNoneNode(node.parentNode);
     } else {
        noneNodes.push(node);
        if(tagName != 'body')
          getNoneNode(node.parentNode);
     }
   }
  
   //這方法才能獲取最終是否有display屬性設(shè)置,不能style.display。
   function getStyles(elem) {

     // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
     // IE throws on elements created in popups
     // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
     var view = elem.ownerDocument.defaultView;

     if (!view || !view.opener) {
        view = window;
     }
     return view.getComputedStyle(elem);
   };
  
  
   function setNodeStyle(){
     var i = 0;
     for(; i < noneNodes.length; i++){
        var visibility = noneNodes[i].style.visibility,
        display = noneNodes[i].style.display,
        style = noneNodes[i].getAttribute("style");
        //覆蓋其他display樣式
        noneNodes[i].setAttribute("style", "visibility:hidden;display:block !important;" + style);
        nodeStyle[i] = {
          visibility :visibility,
          display : display
        }
     }       
   }
  
   function resumeNodeStyle(){
     var i = 0;
     for(; i < noneNodes.length; i++){
        noneNodes[i].style.visibility = nodeStyle[i].visibility;
        noneNodes[i].style.display = nodeStyle[i].display;
     }  

   }
}

例子演示:

var testSize = getSize('test');
console.log("test-> width:" + testSize.width + " height:" + testSize.height);

var test2ChildSize2 = getSize('test2_child');
console.log("test2Child2-> width:" + test2ChildSize2.width + " height:" + test2ChildSize2.height);

var test3ChildSize = getSize('test3_child');
console.log("test3_child-> width:" + test3ChildSize.width + " height:" + test3ChildSize.height);   
 
//打印值如下
test-> width:417 height:18
test2Child2-> width:417 height:18
test3_child-> width:417 height:18

注意事項:

1. 打開顯示所有隱藏祖先元素,然后獲取元素的寬高值,可能在某些情況下獲取值是不正確的。

PS:不過這個不用擔(dān)心,真正出錯時再hack方法就行。

2. 之所以要保存隱藏祖先元素display、visibility 屬性,是為了后面可以設(shè)置回來,不影響其本身。

3. 另外getStyles方法是從jquery源碼中摘取出來,這方法才能獲取最終是否有display屬性設(shè)置。

PS:不能從style.display獲取。

以上這篇js獲取隱藏元素寬高的實現(xiàn)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 利用JavaScript實現(xiàn)簡單全選和全不選的思路和方法

    利用JavaScript實現(xiàn)簡單全選和全不選的思路和方法

    最近開始練習(xí)js的基本操作,常常因為一些小疏忽導(dǎo)致頁面效果無法實現(xiàn),下面這篇文章主要給大家介紹了關(guān)于利用JavaScript實現(xiàn)簡單全選和不全選的思路和方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • xWin之JS版(2-26更新)

    xWin之JS版(2-26更新)

    xWin之JS版(2-26更新)...
    2007-01-01
  • 微信小程序textarea層級過高的解決方法

    微信小程序textarea層級過高的解決方法

    這篇文章主要給大家介紹了關(guān)于微信小程序textarea層級過高問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 通過bootstrap全面學(xué)習(xí)less

    通過bootstrap全面學(xué)習(xí)less

    這篇文章主要為大家詳細介紹了如何通過bootstrap學(xué)習(xí)less,LESS CSS是一種動態(tài)樣式語言,屬于CSS預(yù)處理語言的一種,感興趣的朋友可以參考下
    2016-11-11
  • 深入了解JavaScript 防抖和節(jié)流

    深入了解JavaScript 防抖和節(jié)流

    這篇文章主要介紹了JavaScript 防抖和節(jié)流,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • ES6 javascript中Class類繼承用法實例詳解

    ES6 javascript中Class類繼承用法實例詳解

    這篇文章主要介紹了ES6 javascript中Class類繼承用法,結(jié)合實例形式較為詳細的分析了ES6繼承的基本用法、相關(guān)屬性、方法與使用技巧,需要的朋友可以參考下
    2017-10-10
  • 按下回車鍵指向下一個位置的一個函數(shù)代碼

    按下回車鍵指向下一個位置的一個函數(shù)代碼

    本篇文章主要是對按下回車鍵指向下一個位置的一個函數(shù)代碼進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-03-03
  • ES6頂層對象、global對象實例分析

    ES6頂層對象、global對象實例分析

    這篇文章主要介紹了ES6頂層對象、global對象,結(jié)合實例形式分析了ES6頂層對象與global對象的概念、原理、用法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-06-06
  • javascript延時重復(fù)執(zhí)行函數(shù) lLoopRun.js

    javascript延時重復(fù)執(zhí)行函數(shù) lLoopRun.js

    javascript延時重復(fù)執(zhí)行函數(shù) lLoopRun.js...
    2007-06-06
  • BOM操作querySelector?querySeletorAll獲取標簽對象

    BOM操作querySelector?querySeletorAll獲取標簽對象

    這篇文章主要為大家介紹了BOM操作querySelector?querySeletorAll獲取標簽對象步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11

最新評論

固镇县| 湖州市| 丰镇市| 南投县| 繁昌县| 靖边县| 双柏县| 德庆县| 石狮市| 交城县| 和田县| 无锡市| 黄龙县| 金沙县| 营口市| 体育| 天峻县| 全州县| 耿马| 微山县| 土默特左旗| 循化| 扎兰屯市| 平远县| 固原市| 常州市| 宁安市| 桂阳县| 韶关市| 祁门县| 大邑县| 东平县| 呼和浩特市| 通州市| 页游| 宁安市| 南皮县| 汾阳市| 错那县| 云阳县| 仁怀市|