Vue学习笔记9:vue3动画

97 阅读2分钟

1.过渡动画:transition内置组件

对单个dom或者组件使用动画时,可以使用transition内置组件

app.vue

<template>
  <div>
    <button @click="isShow = !isShow">显示/隐藏</button>
    <transition name="wjm">
      <div v-if="isShow">
        {{message}}
      </div>
    </transition>
  </div>
</template>

style.css

.wjm-enter-from,
.wjm-leave-to{
  opacity: 0;
}

.wjm-enter-to,
.wjm-leave-from{
  opacity: 1;
}

.wjm-enter-active,
.wjm-leave-active{
  transition: opacity 2s ease;
}

常用的六个类名:

v-enter-from: 定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。

v-enter-active: 定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。

v-enter-to: 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter-from 被移除),在过渡动画完成之后移除。

v-leave-from: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。

v-leave-active: 定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。

v-leave-to: 离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave-from 被删除),在过渡动画完成之后移除。

2.animation动画

app.vue

<template>
  <div class="app">
      <div><button @click="isShow = !isShow">showAndNot</button></div>
      <transition name="wjm">
        <div class="title" v-if="isShow">{{msg}}</div>
      </transition>
  </div>
  
</template>

<script>


export default {
  name: 'App',
  components: {
  },
  data(){
    return {
      isShow:true,
      msg:'hello world'
    }
  }
}
</script>

<style>
.app{
  width: 10vw;
  margin:0 auto;
}
.wjm-enter-active{
  animation:bounce 1s ease;
}

.wjm-leave-active{
  animation: bounce 1s ease reverse;
}

@keyframes bounce {
  0% {
    transform: scale(0);
  }

  50% {
    transform: scale(1.3);
  }

  100% {
    transform: scale(1);
  }
}

</style>

通过定义帧动画,实现css过渡动画

transition组件属性

type: 分别指定按照哪种动画过渡

mode: 指定动画切换模式 比如在app.vue中:需要的动画效果为两个组件切换

<template>
  <div class="app">
      <div><button @click="isShow = !isShow">showAndNot</button></div>
      <transition name="wjm" mode="out-in">
        <div class="title" v-if="isShow">{{msg}}</div>
        <div class="title" v-else>this is default</div>
      </transition>
  </div>
  
</template>

在不指定mode的情况下,会出现两个组件同时存在的情况,我们指定mode为out-in,则vue会在前一个组件out动画结束后再渲染新组件的in动画,解决了上述问题

appear: 指定初次渲染是否执行动画,默认为false。appear为true时,初次渲染会使用动画效果

3.animate.css库

animate是一个跨平台动画库,对于强调、主页、滑动、注意力引导特别有用;

安装animate.css

npm install animate.css

main.js中引入

import("animate.css")

在vue组件中使用:

<template>
  <div class="app">
      <div><button @click="isShow = !isShow">showAndNot</button></div>
      <transition name="wjm" mode="out-in">
        <div class="title" v-if="isShow">{{msg}}</div>
      </transition>
  </div>
  
</template>
<style>
.app{
  width: 10vw;
  margin:0 auto;
}
.wjm-enter-active{
  animation:backInUp 1s ease-in;
}

.wjm-leave-active{
  animation: backInUp 1s ease-in reverse;
}

</style>

上述组件基于transition和animate.css实现动画,我们需要自定义css类样式,另外一种方法是直接给transition添加属性类名:

home.vue

<template>
  <div class="app">
      <div><button @click="isShow = !isShow">showAndNot</button></div>
      <transition 
      name="wjm" 
      mode="out-in"
      enter-active-class="animate__animated animate__bounceIn"
      leave-active-class="animate__animated animate__bounceOut"
      >
        <div class="title" v-if="isShow">{{msg}}</div>
      </transition>
  </div>
  
</template>

通过enter-active-class指定进入动画,leave-active-class指定离场动画

4.js动画:gsap库

gsap可以通过js为css属性、svg、canvas等设置动画,并且浏览器兼容

安装gsap库:

npm insatll gsap

在app.vue中使用

<template>
  <div class="app">
      <div><button @click="isShow = !isShow">showAndNot</button></div>
      <transition 
      @enter='enter'
      @leave='leave'
      :css="false"
      >
        <div class="title" v-if="isShow">{{msg}}</div>
      </transition>
  </div>
  
</template>

<script>

import gsap from 'gsap';
export default {
  name: 'Home',
  data(){
    return {
      isShow:true,
      msg:'hello world'
    }
  },
  methods:{
      beforeEnter(){
          console.log('beforeEnter')
      },
     //done方法:动画执行完会回调done方法,通知js动画执行完毕,进行其他操作
      enter(el,done){
           gsap.from(el,{
               scale:0,
               x:200,
               onComplete:done
           })
      },
      leave(el,done){
          gsap.to(el,{
               scale:0,
               x:200,
               onComplete:done
           })
      }
  }
}
</script>

通过enter、leave等javascript钩子实现动画效果

通过gsap实现数字变化效果

changenum.vue

<template>
  <div>
      <input type="number" step='100' v-model="counter">
      <span>{{showCounter.toFixed(0)}}</span>
  </div>
</template>
<script>

import gsap from 'gsap'
export default {
  data() {
    return {
        counter:0,
        showCounter:0
    };
  },
  watch:{
      counter(newValue){
          gsap.to(this,{duration:1,showCounter:newValue})
      }
  }
};
</script>

5.列表过渡-transition-group