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

更新日期: 2019-07-17 阅读: 5.1k 标签: 高度

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


方案一:

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

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

//  获取display为none元素下的子元素的高度
function getHeight(parentSelector,childSelector){
    let wrap =  document.querySelector(parentSelector);
    let  aLi =  wrap.querySelectorAll(childSelector);
    let  arr =  [];
    wrap.style.cssText = `display:block;position:absolute;z-index:-1000;`
    for (var i = 0; i < aLi.length; i++) {
        arr.push(aLi[i].offsetHeight)
    }
    wrap.style.cssText = "display:none;"
    return arr
}
console.log(getHeight('.wrap','li'))
</script>
</html>


方案二:不推荐

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

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

    <button class="btn">按钮</button>
</body>
<script>

//  获取display为none元素下的子元素的高度

let wrap =  document.querySelector('.wrap');
let  aLi =  wrap.querySelectorAll('li');
let  arr =  [];
let timer=null;
timer = setInterval(function(){
    // 用户操作后 让隐藏隐藏元素显示了 则获取结果 清除定时器
    if(wrap.offsetHeight > 0){
        for (var i = 0; i < aLi.length; i++) {
            arr.push(aLi[i].offsetHeight)
        }
        clearInterval(timer)

        console.log(arr)
    }
},1000)
    
document.querySelector('.btn').onclick=function(){
    wrap.style.cssText = "display:block;"
}
</script>
</html>


方案三:

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>


小结:

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

本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!

链接: https://fly63.com/article/detial/4237

CSS 使用calc()获取当前可视屏幕高度

先了解一下CSS3的相对长度单位:相对长度单位指定了一个长度相对于另一个长度的属性。对于不同的设备相对长度更适用,通过vh / vw 我们可以获得当前屏幕的视窗宽度

CSS解决高度塌陷

给高度塌陷的元素设置overflow:hidden;原理:因为overflow:hidden;触发了一个BFC,BFC布局规则:计算BFC高度的时候,里面的浮动元素也参与计算。弊端:定位在当前元素外面的内容会被隐藏。

高度自适应

高度不去设置,或者高度设置auto 内容撑开父元素的高度。内容撑开父元素的高度 -> 最小高度的设置 min-height,浮动元素添加高度自适应 -> 添加浮动元素的父元素没有高度,会出现高度塌陷

css解决高度塌陷问题

父元素在文档流中高度默认是被子元素撑开的,当子元素脱离文档流以后,将无法撑起父元素的高度,也就会导致父元素的高度塌陷,父元素的高度一旦塌陷所有元素的位置将会上移

如何动态监听 DOM 元素高度变化?

在我们的网页中有一个固定区域,这个区域会用于渲染从后端拉取的含有图片等资源的富文本字符串。他需要在内容不超过一个最大高度的时候完全显示所有内容,超过最大内容后仅展示最大高度范围内的内容

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!