JS学习笔记——数据未加载时,内容高度不确定的展开收起按钮显隐问题

今天同事问了我一个问题,有一个“展开—收起”的按钮,如果数据部分高度超过某个临界值,就展示这个按钮;如果数据部分高度没有超过某个临界高度,就不展示。但是最开始页面加载时,数据还没有请求回来,无法得知具体高度。

而在日常开发中,我们也经常会遇到有些区块内容可以展开收起的需求,例如以下这两种:

固定高度式:
在这里插入图片描述
对于内容固定,高度固定的情况,很好实现,可以一开始就显示展开/收起按钮,点击切换区块的高度即可

非固定高度式:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

而对于内容多少不固定,最终高度也不一定的情况,则稍显复杂,难点在于:

  • 内容未超出规定高度时,展开/收起按钮不显示
  • 内容超出规定高度时,显示展开/收起按钮
  • 由于内容高度不一定,当点击展开按钮时,无法确定显示高度

对于这种情况,现介绍以下实现方案:

<div class="box">
   <div class="container" id="container">
   	...
   </div>
   <div id="button" class="button">
   	<span>
   		展开
   	</span>
   </div>
</div>

首先,内容区块不设置高度,由内容自然撑开,但是为了在超出一定高度后隐藏超出的内容,需要设置最大高度和超出隐藏:

.container {
   max-height: 90px; // 规定最高90像素
   overflow: hidden; // 超出部分隐藏
}

展开/收起按钮 则和 内容区 同级

.button {
   	position: relative;
      top:0;
       text-align: center;
       width: 100%;
       height: 20px;
       cursor: pointer;
   	display: none;
}

在数据加载完成后,使用以下方法获取到内容区的真实高度

getHeightUnfold(dom) {
     var fakeNode = dom.cloneNode(true);
      fakeNode.style.maxHeight = '1000px';
      dom.parentNode.insertBefore(fakeNode, dom);
      fakeNode.style.height = 'auto';
      fakeNode.style.visibility = 'hidden';
      var height = fakeNode.getBoundingClientRect().height;
      dom.parentNode.removeChild(fakeNode);
     return height;
}

该方法实际上是

  • 将内容区DOM复制了一份,然后改变了它的最大高度,并且设置为不可见

  • 然后插入到了内容区DOM的前面,通过将不可见的副本的高度设置为auto,就可以使用getBoundingClientRect() API 获取到它的真实高度,也就是内容区DOM的真实高,

  • 获取到高度后,从DOM中移除副本

拿到真实高度后,就可以用这个高度和内容区收起时的高度(这个高度是固定的)进行对比,如果该高度大于它,则显示展开/收起按钮,否则就隐藏

let dom = document.getElementById('container');
let button = document.getElementById('button');
let domHeight = getHeightUnfold(dom);
if (domHeight > 90) {
	button.style.display: 'block';
} else {
	button.style.display: 'none';
}

当点击展开/收起按钮时,则改变内容区DOM 的 max-height值就可以了,比较简单,不再赘述


原博客链接:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要根据div的高度来判断是否示"更多"按钮,您可以使用JavaScript来实现。下面是一个示例代码: ```javascript var divContainer = document.getElementById('divContainer'); var showMoreButton = document.getElementById('showMoreButton'); var maxHeight = 400; // 设置最大高度 function checkDivHeight() { if (divContainer.scrollHeight > maxHeight) { showMoreButton.style.display = 'block'; // 示"更多"按钮 } else { showMoreButton.style.display = 'none'; // 藏"更多"按钮 } } // 在窗口大小改变重新检查div高度 window.addEventListener('resize', checkDivHeight); // 在div内容发生改变重新检查div高度(如果需要) divContainer.addEventListener('DOMSubtreeModified', checkDivHeight); // 初始化检查div高度 checkDivHeight(); ``` 上述代码中,我们定义了一个`checkDivHeight`函数,用于检查div容器的内容高度是否超过了最大高度。如果超过了最大高度,则示"更多"按钮,否则藏它。 通过监听窗口大小改变事件和div内容改变事件,可以在这些情况下重新检查div的高度。最后,在初始化调用一次`checkDivHeight`函数,以确保初始状态正确。 请注意,上述代码假设您已经有一个id为"divContainer"的div容器和id为"showMoreButton"的"更多"按钮。您可以根据自己的需求修改相应的选择器和最大高度值。另外,确保在DOM完成后再执行此代码,以确保目标元素已经存在。 这样,"更多"按钮将根据div的高度来判断是否示或藏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值