vue实现折叠面板展开与收缩效果

vue中展开与缩放动画,网上大多都是通过监测max-height属性来实现,亲测了一下,有卡顿现象,效果并不理想,最后发现可以通过css+js的方式,通过高度height变化来实现动画。

html代码:

<div class="collapse-item" v-for="(item,index) in linkList" :key="item.name">
  <div class="collapse-tab" @click="onTabChange(item,index)">
     {{item.name}}     
  </div>
  <div class="collapse-content" ref="collapse_content">
    <!--子链接列表-->
    <div class="collapse-content-item" v-for="cell in item.children" :key="cell.name">
      <a :href="cell.url" :title="cell.name" target="_blank"
          >{{ cell.name }}</a>
    </div>
  </div>
</div>

关键处css样式:

a {
  display: inline-block;
    color: white;
    text-decoration: none;
    white-space: nowrap;
    padding: 10px 0;
    margin-left: 12px;
    cursor: pointer;
    &:hover {
      color: #00ffb6;
    }
 }
.collapse-content {
  display: flex;
  display: -webkit-flex;
  display: -moz-box;
  display: -ms-flexbox;
  flex-wrap: wrap;
  height: 0;//默认是收缩时设置,默认展开不需要设置
  transition: height .3s linear;//设置动画
  overflow: hidden;
  .collapse-content-item {
    width: 33%;
    font-size: 18px;
    text-align: left;
  }
}

js相关代码:

 默认是收缩状态:


    onTabChange(item, index) {
        if(tabItem.open == undefined){
          tabItem.open = true;
        }else{
          tabItem.open = !tabItem.open;
        }
        this.$set(this.linkList,index,tabItem);
//由此网上是为了三角箭头显示效果增加的,在这里不必要
        const contentref = this.$refs.collapse_content[index]
        let height = contentref.offsetHeight;
        if (height === 0) { // 由收缩状态展开
          contentref.style.height = 'auto';
          height = contentref.offsetHeight;
          contentref.style.height = '0px';
          let f = document.body.offsetHeight // 必加
          contentref.style.height = height + 'px';
        } else { // 收缩
          contentref.style.height = '0px';
        }
    }

默认是展开状态时:

1.将展开的高度保存到item项中,下次再展开时赋值

onTabChange(item, index) {
        if(tabItem.open == undefined){
          tabItem.open = true;
        }else{
          tabItem.open = !tabItem.open;
        }
        this.$set(this.linkList,index,tabItem);
        const contentref = this.$refs.collapse_content[i];
        var height = contentref .offsetHeight;  //liCon.getBoundingClientRect().height
        if(item.open){
          contentref .style.height = item.height + 'px';
        }else{
          item.height = height;
          contentref .style.height = height + 'px';
          var f = document.body.offsetHeight;
          contentref .style.height = '0px';
        }
    }

2.此方法第一次测试的时候展开无动画,后来又正常了,不知道是不是缓存的问题

 const contentref = this.$refs.collapse_content[i];
let height = contentref.offsetHeight;
  if (height === 0) { // 展开
    contentref.style.height = 'auto';
    height = contentref.offsetHeight;
    contentref.style.height = 0 + 'px';
    let f = document.body.offsetHeight; // 必加,否则展开无动画
    contentref.style.height = height + 'px';
  } else { // 收缩
    contentref.style.height = height + 'px';
     var f = document.body.offsetHeight;
    contentref.style.height = 0 + 'px';

  }

参考资料:点这里

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue 3 中实现折叠展开组件可以使用 v-if 或 v-show 指令来控制元素的显示和隐藏。 方法1:使用 v-if 指令 在模板中使用 v-if 指令来判断是否显示折叠内容。当某个状态满足需要折叠时,对应的元素会被删除或添加到 DOM 中。 ```html <template> <div> <button @click="toggleCollapse">折叠/展开</button> <div v-if="isCollapsed"> <!-- 折叠内容 --> </div> </div> </template> <script> export default { data() { return { isCollapsed: false } }, methods: { toggleCollapse() { this.isCollapsed = !this.isCollapsed; } } } </script> ``` 方法2:使用 v-show 指令 与 v-if 指令不同的是,v-show 指令不会删除或添加 DOM 元素,而是通过 CSS 控制元素的显示和隐藏。使用 v-show 时,模板中的折叠内容始终存在于 DOM 中,只是通过设置 display 属性来控制其显示和隐藏。 ```html <template> <div> <button @click="toggleCollapse">折叠/展开</button> <div v-show="isCollapsed"> <!-- 折叠内容 --> </div> </div> </template> <script> export default { data() { return { isCollapsed: false } }, methods: { toggleCollapse() { this.isCollapsed = !this.isCollapsed; } } } </script> ``` 以上两种方法都可以用于实现折叠展开组件。使用 v-if 指令可以在不需要展示的时候彻底删除 DOM 元素,适用于折叠内容较多且不经常切换状态的场景;而使用 v-show 指令则适用于折叠内容频繁切换展示状态的场景,因为元素始终存在于 DOM 中,不需要频繁创建和销毁。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值