JS获取display为none的隐藏元素的宽度和高度的解决方案

Posted studyshufei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS获取display为none的隐藏元素的宽度和高度的解决方案相关的知识,希望对你有一定的参考价值。

有时候,我们一进入页面,就需要获取display为none元素的物理尺寸(宽高),或获取display为none元素的子元素的物理尺寸(宽高),本篇文章就如何解决以上问题给出自己的解决方案

获取display为none元素的子元素的物理尺寸
方案一思路:

1、利用给元素添加行内样式:display:block;position:absolute;z-index:-1000
2、让隐藏元素变成block同时利用定位带出可视区,再获取下面元素的物理尺寸后
3、再给它还原成display为none,最后返回结果

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>获获取display为none元素的子元素的物理尺寸 :解决方案一</title>
 6 </head>
 7 <body>
 8     <div class="wrap"  style="display: none;">
 9         <ul>
10             <li>
11                 <p>前端技术</p>
12                 <p>前端技术</p>
13                 <p>前端技术</p>
14                 <p>前端技术</p>
15                 <p>前端技术</p>
16             </li>
17             <li>
18                 <p>前端技术</p>
19                 <p>前端技术</p>
20                 <p>前端技术</p>
21                 <p>前端技术</p>
22                 <p>前端技术</p>
23                 <p>前端技术</p>
24                 <p>前端技术</p>
25                 <p>前端技术</p>
26                 <p>前端技术</p>
27             </li>
28             <li>
29                 <p>前端技术</p>
30                 <p>前端技术</p>
31                 <p>前端技术</p>
32             </li>
33         </ul>
34     </div>
35 </body>
36 <script>
37 
38 //  获取display为none元素下的子元素的高度
39 function getHeight(parentSelector,childSelector)
40     let wrap =  document.querySelector(parentSelector);
41     let  aLi =  wrap.querySelectorAll(childSelector);
42     let  arr =  [];
43     wrap.style.cssText = `display:block;position:absolute;z-index:-1000;`
44     for (var i = 0; i < aLi.length; i++) 
45         arr.push(aLi[i].offsetHeight)
46     
47     wrap.style.cssText = "display:none;"
48     return arr
49 
50 console.log(getHeight(.wrap,li))
51 </script>
52 </html>

方案二思路:不推荐
1、这个方法需要用户事件触发让隐藏元素显示出来
2、开启一个定时器,间隔判断隐藏元素是否显示了
3、如果显示了,清除定时器,拿到结果再去操作

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>获获取display为none元素的子元素的物理尺寸 :解决方案二</title>
 6 </head>
 7 <body>
 8     <div class="wrap"  style="display: none;">
 9         <ul>
10             <li>
11                 <p>前端技术</p>
12                 <p>前端技术</p>
13                 <p>前端技术</p>
14                 <p>前端技术</p>
15                 <p>前端技术</p>
16             </li>
17             <li>
18                 <p>前端技术</p>
19                 <p>前端技术</p>
20                 <p>前端技术</p>
21                 <p>前端技术</p>
22                 <p>前端技术</p>
23                 <p>前端技术</p>
24                 <p>前端技术</p>
25                 <p>前端技术</p>
26                 <p>前端技术</p>
27             </li>
28             <li>
29                 <p>前端技术</p>
30                 <p>前端技术</p>
31                 <p>前端技术</p>
32             </li>
33         </ul>
34     </div>
35 
36     <button class="btn">按钮</button>
37 </body>
38 <script>
39 
40 //  获取display为none元素下的子元素的高度
41 
42 let wrap =  document.querySelector(.wrap);
43 let  aLi =  wrap.querySelectorAll(li);
44 let  arr =  [];
45 let timer=null;
46 timer = setInterval(function()
47     // 用户操作后 让隐藏隐藏元素显示了 则获取结果 清除定时器
48     if(wrap.offsetHeight > 0)
49         for (var i = 0; i < aLi.length; i++) 
50             arr.push(aLi[i].offsetHeight)
51         
52         clearInterval(timer)
53 
54         console.log(arr)
55     
56 ,1000)
57     
58 document.querySelector(.btn).onclick=function()
59     wrap.style.cssText = "display:block;"
60 
61 </script>
62 </html>

获取display为none元素的物理尺寸
解决思路:

1、利用给元素添加行内样式:visibility:hidden
2、让隐藏元素变成有物理尺寸存在,但不可见
3、再给它还原成display为none,最后返回结果

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>获取display为none元素的物理尺寸解决方案</title>
</head>
<body>
    <div class="container" style="display: none;">
        <p>前端技术</p>
        <p>前端技术</p>
        <p>前端技术</p>
    </div>
</body>
<script>

//  获取display为none元素的高度
function getSizeAttr(elementSelector,attrName)
    let oDiv =  document.querySelector(elementSelector);
    oDiv.style.cssText = `visibility:hidden`
    let attr = 
        height: oDiv.offsetHeight,
        width: oDiv.offsetWidth,
        offsetLeft: oDiv.offsetLeft,
        offsetTop: oDiv.offsetTop
    
    oDiv.style.cssText = `display:none`;
    return attr[attrName]

console.log(getSizeAttr(.container,width))
console.log(getSizeAttr(.container,height))
console.log(getSizeAttr(.container,offsetLeft))
console.log(getSizeAttr(.container,offsetTop))
</script>
</html>

小结:利用先把所有隐藏元素变成可以获取物理尺寸,获取完毕再给它变成隐藏,再返回我们需求的物理尺寸是关键。

转自http://moxiaofei.com/2019/07/13/getsize/

以上是关于JS获取display为none的隐藏元素的宽度和高度的解决方案的主要内容,如果未能解决你的问题,请参考以下文章

jQuery无法获取隐藏元素(display:none)宽度(width)和高度(height)的新解决方案

请问JS怎么获取隐藏div的高度,div设置为display=“none”。谢谢

js中display:none是显示为无,能隐藏的意思,为啥在js中再用display:block又可以让他显示出来呢?不

js获取元素显示隐藏的当前状态

js 判断元素的display是否为block或者none

display:none的使用注意事项