Vue过渡&动画

目录

一、单元素/组件的过渡

1、在CSS过渡和动画中自动应用class

2、使用第三方CSS动画库,如Animate.css

3、在过渡钩子函数中使用JavaScript直接操作DOM

二、v-for列表过渡

三、初始渲染的过渡


动画能够提高用户体验,帮助用户更好的理解页面中的功能。Vue在插入、更新或者移除DOM时,提供多种不同方式的应用过渡效果。

一、单元素/组件的过渡

Vue提供了transition的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡。条件渲染(v-if)、条件展示(v-show)、动态组件、组件根节点。

使用<transition></transition>元素,把需要被动画控制的元素包含。

<transition>组件上的duration属性显式地设置过渡持续时间(以毫秒计)。

<transition :duration="1000"></transition>
<transition :duration="{enter:200,leave:600}"></transition>

1、在CSS过渡和动画中自动应用class

在进入/离开的过渡中,会有6个class切换。

v-enter:一个时间点,定义进入过渡的开始状态。

v-enter-active:一个时间段,定义进入过渡生效时的状态,可以被用来定义进入过渡的过程时间,延迟和曲线函数。

v-enter-to:一个时间点,定义进入过渡的结束状态。

v-leave:一个时间点,定义离开过渡的开始状态。

v-leave-active:一个时间段,定义离开过渡生效时的状态,可以被用来定义离开过渡的过程时间,延迟和曲线函数。

v-leave-to:一个时间点,定义离开过渡的结束状态。

对于这些在过渡中切换的类名来说,如果你使用一个没有名字的<transition>,则v-是这些类名的默认前缀。如果你使用了<transition name="my">,则v-enter会替换为my-enter。

<style>
  .fade-slide-enter,
  .fade-slide-leave-to{
    opacity:0;
    transform:translateX(100px);
  }
  .fade-slide-enter-active,
  .fade-slide-leave-active{
    transition:all 1s ease;
  }
</style>

<div id="app">
  <button @click="flag=!flag;">toggle</button>
  <transition name="fade-slide">
    <h3 v-show="flag">这是动画</h3>
  </transition>
</div>
<script>
  var vm=new Vue({
    el:'#app',
    data:{
      flag:false
    }
  });
</script>

2、使用第三方CSS动画库,如Animate.css

https://daneden.github.io/animate.css/ 选择类名,观察动画效果

<link rel="stylesheet" href="lib/animate.css">

<div id="app">
  <button @click="flag=!flag;">toggle</button>
  <transition enter-active-class="animated bounceIn" leave-active-class="animated bounceOut">
    <h3 v-show="flag">这是动画</h3>
  </transition>
  <!--或将animated写在transition元素内部的元素
  <transition enter-active-class="bounceIn" leave-active-class="bounceOut">
    <h3 class="animated" v-show="flag">这是动画</h3>
  </transition>
  -->
</div>

3、在过渡钩子函数中使用JavaScript直接操作DOM

实现半场动画。

before-enter:过渡进入前的初始状态;

enter:过渡生效时的状态;

after-enter:过渡完成后执行的代码,如恢复到初始状态便于下一次动画。

<transition
  v-on:before-enter="beforeEnter"
  v-on:enter="enter"
  v-on:after-enter="afterEnter"
  v-on:enter-cancelled="enterCancelled"

  v-on:before-leave="beforeLeave"
  v-on:leave="leave"
  v-on:after-leave="afterLeave"
  v-on:leave-cancelled="leaveCancelled"

  v-bind:css="false"
>
</transition>
methods: {
  // 进入中
  beforeEnter: function (el) {
  },
  enter: function (el, done) {
    done()
  },
  afterEnter: function (el) {
  },
  enterCancelled: function (el) {
  },

  // 离开时
  beforeLeave: function (el) {
  },
  leave: function (el, done) {    
    done()
  },
  afterLeave: function (el) {
  },
  leaveCancelled: function (el) { // 只用于v-show中
  }
}

过渡钩子函数的第一个参数el,表示要执行动画的DOM元素,是原生的JS DOM对象。

el.offsetWidth或el.offsetHeight等写在该函数顶部,不写可能没有动画效果。

这些钩子函数可以结合CSS transitions/animations使用,也可以单独使用。当只用JavaScript过渡的时候,在enter和leave中必须使用done进行回调。否则,它们将被同步调用,过渡会立即完成。done是 afterEnter函数的引用。推荐对于仅使用JavaScript过渡的元素添加v-bind:css="false",Vue会跳过CSS的检测,也可避免过渡过程中CSS的影响。

<div id="app">
  <button @click="flag=!flag">加入购物车</button>
  <transition
    @before-enter="beforeEnter"
    @enter="enter"
    @after-enter="afterEnter">
    <div id="ball" v-show="flag"></div>
  </transition> 
</div>
<script>
  var vm=new Vue({
    el:'#app',
    data:{
      flag:false
    },
    methods:{
      beforeEnter(el){
        el.style.transform='translate(0,0)';
      },
      enter(el,done){
        el.offsetWidth;
        el.style.transform='translate(150px,450px)';
        el.style.transition="all 1s ease";

        done();
      },
      afterEnter(el){
        // flag从false变为true是前半场动画,从true变为false是后半场动画
        // 使小球隐藏,且跳过后半场动画
        this.flag=!this.flag;
      }
    }
  });
</script>

二、v-for列表过渡

同时渲染整个列表,使用<transition-group>组件。

不同于<transition>,它在渲染页面时会转换为一个真实的元素,默认为<span>,包含着动画元素。可通过tag将其指定为其它元素,如<transition-group tag="ul"></transition-group>。

过渡模式不可用,因为不再切换特有的元素。

内部元素总是需要提供唯一的key属性值。

<style>
  span{
    display:inline-block;
    margin-right:10px;
  }

  .v-enter,.v-leave-to{
    opacity:0;
    transform:translateY(30px);
  }
  .v-enter-active,.v-leave-active{
    transition:all 1s ease;
  }

  .v-move{
    transition:all 1s ease;
  }
  .v-leave-active{
    position:absolute;
  }
</style>

<div id="app">
  <button @click="add">添加</button>
  <button @click="remove">移除</button>
  <transition-group tag="p">
    <span v-for="item in list" :key="item">{{item}}</span>
  </transition-group> 
</div>
<script>
  var vm=new Vue({
    el:'#app',
    data:{
      list:[1,2,3,4,5,6],
      nextNum:7
    },
    methods:{
      randomIndex(){
        return Math.floor(Math.random()*this.list.length);
      },
      add(){
        this.list.splice(this.randomIndex(),0,this.nextNum++);
      },
      remove(i){
        this.list.splice(this.randomIndex(),1);
      }
    }
  });
</script>

<transition-group>组件不仅可以进入和离开动画,还可以改变定位。v-move会在元素的改变定位的过程中应用,需要和.v-leave-active{position:absolute;}配合使用。

内部的实现,Vue使用了一个叫FLIP简单的动画队列,使用transforms将元素从之前的位置平滑过渡新的位置。使用FLIP过渡的元素不能设置为display:inline,作为替代方案,可以设置为display:inline-block或者放置于flex中。

三、初始渲染的过渡

可以通过appear特性设置节点在初始渲染的过渡,用于<transition>和<transition-group>。

<transition appear></transition>

和进入/离开过渡一样,也可以自定义CSS类名,使用第三方CSS动画库。也可以自定义JavaScript钩子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值