vue中js钩子函数实现动画过渡

  • Post author:
  • Post category:vue


今天看了vue中js钩子函数实现动画,照着敲了一遍发现只有enter的淡入能实现,淡出没有动画效果,即使在leave()中移入done用settimeout延迟也仅仅是延迟的触发时间,并没有出现动画效果。后来经过搜索发现是enter()中缺少了一行代码 el.offsetWidth ,关于这行代码的作用参考文档里的大佬有解释,本人还不是很明白就不乱解释了,原文章链接:

vue动画过渡 javascript钩子函数详解_V v vae的博客-CSDN博客_过渡动画钩子函数

最终实现的代码如下:

<template>
  <div>
      <!-- :css="false" 可以指定不加载css样式 -->
      <transition  @before-leave="beforeLeave" @leave="leave" @after-leave="afterLeave" @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter" :css="false">
          <p v-if="isshow">显示或隐藏</p>
      </transition>
      <button @click="isshow=!isshow">点击</button>
  </div>
</template>

<script>
export default {
  data () {
    return {
      isshow: true
    }
  },
  methods: {
    beforeLeave: function (el) {
      console.log('离开前')
      el.style.opacity = 1
    },
    leave: function (el, done) {
      console.log('离开进行中')
      el.style.transition = 'all 3s'
      el.style.opacity = 0
      setTimeout(done, 3000)
    },
    afterLeave: function (el) {
      console.log('离开结束')
    },
    beforeEnter: function (el) {
      console.log('进入前')
      el.style.opacity = 0
    },
    enter: function (el, done) {
      // el.offsetWidth引起浏览器的重回
      // eslint-disable-next-line no-unused-expressions
      el.offsetWidth
      el.style.transition = 'all 3s'
      console.log('进入过程中')
      el.style.opacity = 1
      setTimeout(done, 3000)
    },
    afterEnter: function (el) {
      console.log('进入结束')
    }
  }
}
</script>

<style scoped>
p{
    width: 200px;
    height: 200px;
    background: greenyellow;
}
</style>



版权声明:本文为qq_44361943原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。