vue 手风琴效果(高度不确定and高度确定)

高度不确定

 第一步:

// // collapse-transition.js
const elTransition = '0.3s height ease-in-out, 0.3s padding-top ease-in-out, 0.3s padding-bottom ease-in-out'
const Transition = {
  beforeEnter(el) {
    el.style.transition = elTransition
    if (!el.dataset) el.dataset = {}

    el.dataset.oldPaddingTop = el.style.paddingTop
    el.dataset.oldPaddingBottom = el.style.paddingBottom

    el.style.height = 0
    el.style.paddingTop = 0
    el.style.paddingBottom = 0
  },

  enter(el) {
    el.dataset.oldOverflow = el.style.overflow
    if (el.scrollHeight !== 0) {
      el.style.height = el.scrollHeight + 'px'
      el.style.paddingTop = el.dataset.oldPaddingTop
      el.style.paddingBottom = el.dataset.oldPaddingBottom
    } else {
      el.style.height = ''
      el.style.paddingTop = el.dataset.oldPaddingTop
      el.style.paddingBottom = el.dataset.oldPaddingBottom
    }

    el.style.overflow = 'hidden'
  },

  afterEnter(el) {
    el.style.transition = ''
    el.style.height = ''
    el.style.overflow = el.dataset.oldOverflow
  },

  beforeLeave(el) {
    if (!el.dataset) el.dataset = {}
    el.dataset.oldPaddingTop = el.style.paddingTop
    el.dataset.oldPaddingBottom = el.style.paddingBottom
    el.dataset.oldOverflow = el.style.overflow

    el.style.height = el.scrollHeight + 'px'
    el.style.overflow = 'hidden'
  },

  leave(el) {
    if (el.scrollHeight !== 0) {
      el.style.transition = elTransition
      el.style.height = 0
      el.style.paddingTop = 0
      el.style.paddingBottom = 0
    }
  },

  afterLeave(el) {
    el.style.transition = ''
    el.style.height = ''
    el.style.overflow = el.dataset.oldOverflow
    el.style.paddingTop = el.dataset.oldPaddingTop
    el.style.paddingBottom = el.dataset.oldPaddingBottom
  }
}

export default {
  name: 'collapseTransition',
  functional: true,
  render(h, { children }) {
    const data = {
      on: Transition
    }
    return h('transition', data, children)
  }
}

第二步:


<script>
  import CollapseTransition from './collapse-transition'; 
 
  export default {
    components: {
      'collapse-transition': CollapseTransition,
    },
  };
</script>

第三步:

<collapse-transition>
   <section v-show="fold">
       <div class="line"  v-for="item in 10">
           <div class="key">
              <span>{{ key }}</span>
           </div>
           <div class="value">
               <span>{{ value }}</span>    
         </div>
      </div>         
   </section>
</collapse-transition>

高度确定

第一步:

<transition name="collapse">
   <section v-show="fold">
       <div class="line" v-for"item in 10">
           <div class="key">
               <span>{{ key }}</span>
           </div>
            <div class="value">
               <span>{{ value }}</span>
           </div>
       </div>
    </section>
</transition>

第二步:

折叠盒子的总高度
.collapse-leave-active,
.collapse-enter-active {
  transition: max-height 0.3s;
}
.collapse-enter,
.collapse-leave-to {
  // opacity: 0;
  max-height: 0;
  overflow: hidden;
}
.collapse-enter-to,
.collapse-leave {
  max-height: 3rem;
}

侵权必删

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值