展开收起功能加平滑动画

 

<template>
  <div class="panelMain">
    <div class="panel">
      <!-- body -->
      <transition
        name="panel-fade"
        @enter="enter"
        @before-leave="beforeLeave"
        @leave="leave"
      >
        <div class="panel__body" v-show="ifShowBody" ref="panel__body_height">
          <slot>
               <div class="box"></div>
          </slot>
        </div>
      </transition>
      <!-- footer -->
      <div class="panel__footer" @click="iconClick">{{ifShowBody? '收起': '更多'}}</div>
    </div>
    <slot name="main">
        <div class="main" ref="main"></div>
    </slot>
  </div>
</template>
<script>
import velocity from "velocity-animate";
 
export default {
  name: "panel",
  props: {},
  data() {
    return {
      bodyHeight: 0,
      ifShowBody: true
    };
  },
  computed: {},
  mounted(){
       this.$refs.main.style.height = "calc(100% - "+ (this.$refs.panel__body_height.offsetHeight * 2 ) +"px)"; 
  },
  methods: {
    iconClick() {
      this.ifShowBody = !this.ifShowBody;
    },
    enter(el, done) {
      var self = this;
      velocity(
        el,
        { height: self.bodyHeight + "px" },
        { duration: 500, complete: done }
      );
       this.$refs.main.style.height = "calc(100% -  "+ (self.bodyHeight * 2) +"px)";
    },
    beforeLeave(el, done) {
      this.bodyHeight = el.clientHeight;
       this.$refs.main.style.height = "calc(100% -  "+ el.clientHeight +"px)";
    },
    leave(el, done) {
      el.style.height = el.clientHeight + "px";
      velocity(el, { height: "0px" }, { duration: 500, complete: done });
    }
  }
};
</script>
<style scoped>
.box {
  width: 100%;
  height: 100px;
  background-color: rgb(232, 238, 175);
}
.panel__body {
  overflow: hidden;
}
.panel__footer {
  width: 100%;
  height: 15px;
  text-align: center;
  font-size: 12px;
  background-color: paleturquoise;
  color: #000;
  cursor: pointer;
}
.main {
  width: 100%;
  background-color: palevioletred;
  margin: 10px auto;
  transition: all .8s ease;
}
.panelMain {
  width: 100%;
  height: 100%;
}
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值