Vue2.0 Transition常见用法全解惑

Vue2.0的过渡系统(transition)有了很大的改变,想把1.0的项目迁移到2.0,着实须要费一些功夫,今天我就要把vue2.0的过渡系统的用法搞清楚,由于以前确实踩了很多坑。这里只涉及单元素/组件的过渡实现,vue2.0的文档中还讲到了初始渲染的过渡、多个元素的过渡、多个组件的过渡和列表过渡,他们的过渡效果实现方式和单元素/组件的相似,我感受实际项目中用的不太多吧,有兴趣的同窗能够去了解一下,文档这里说的多个元素和多个组件和咱们的理解可能不太同样,必定要仔细阅读文档,搞清楚到底说的是什么样的状况。javascript

什么是过渡

Vue只有在插入,更新或者移除DOM元素时才会应用过渡效果,过渡效果的应用能够经过不一样方式实现,官方文档中提到了以下几种:css

  1. 在CSS过渡和动画中自动应用class;html

  2. 配合使用第三方的CSS动画库,如Animate.css;vue

  3. 在过渡钩子函数中使用JavaScript直接操做DOM;java

  4. 配合使用第三方JavaScript动画库,如Velocity;css3

上面四种方式其实主要就是两种,一个是利用CSS过渡或者动画,另外一个是利用JavaScript钩子函数。app

怎么应用过渡到元素/组件上

要想使元素或者组件应用到咱们所写的过渡动画,须要使用vue提供的transition来封装组件成为过渡组件,transition须要与以下情景中的任一种一块儿使用:ide

  • v-if(条件渲染)函数

  • v-show(条件展现)动画

  • 动态组件

  • 在组建的根节点上,而且被vue实例DOM方法触发,如appendTo方法把组件添加到某个根节点上

当须要插入或者删除封装成过渡元素的元素时,vue将作以下事情:

  1. 查找目标元素是否有CSS过渡或者动画,若是有就在适当的时候进行处理;

  2. 若是过渡组件设置了JavaScript钩子函数,vue会在相应阶段调用钩子函数;

  3. 若是以上二者都没有,DOM操做(插入或者删除)就在下一帧当即执行。

CSS过渡

先举一个典型的CSS过渡的例子:

<!-- 首先将要过渡的元素用transition包裹,并设置过渡的name,而后添加触发这个元素过渡的按钮(实际项目中不必定是按钮,任何能触发过渡组件的DOM操做的操做均可以) -->
<div>
  <button @click="show=!show">show</button>
  <transition name="fade">
    <p v-show="show">hello</p>
  </transition>
</div>
// 接着为过渡类名添加规则
&.fade-enter-active, &.fade-leave-active
  transition: all 0.5s ease     
&.fade-enter, &.fade-leave-active
  opacity: 0

封装上面的代码,就能够实现一个简单的动画了,CSS的transition属性是用来设置过渡整体效果的,具体可参考:http://www.w3cplus.com/content/css3-transition

CSS过渡类名

组件过渡过程当中,会有四个CSS类名进行切换,这四个类名与上面transition的name属性有关,好比name="fade",会有以下四个CSS类名:

  1. fade-enter:进入过渡的开始状态,元素被插入时生效,只应用一帧后当即删除;

  2. fade-enter-active:进入过渡的结束状态,元素被插入时就生效,在过渡过程完成以后移除;

  3. fade-leave:离开过渡的开始状态,元素被删除时触发,只应用一帧后当即删除;

  4. fade-leave-active:离开过渡的结束状态,元素被删除时生效,离开过渡完成以后被删除;

从上面四个类名能够看出,fade-enter-active和fade-leave-active在整个进入或离开过程当中都有效,因此CSS的transition属性在这两个类下进行设置。
上面示例中,fade-enter和fade-leave-active类设置CSS为opacity:0,说明过渡刚进入和离开的时候透明度为0,即不显示。固然还能够设置其余的CSS属性,transform属性是除了opacity以外常常在这里被用到的,transform用法可参考http://www.w3cplus.com/content/css3-transition

CSS动画

组件过渡的实现不只能够经过CSS过渡还能够经过CSS动画(animation)实现,建议先了解一下CSS3 Animation,这里仍是给个例子:

<div>
  <button @click="show=!show">show</button>
  <transition name="fold">
    <p v-show="show">hello</p>
  </transition>
</div>
.fold-enter-active {
  animation-name: fold-in;
  animation-duration: .5s;
}
.fold-leave-active {
  animation-name: fold-out;
  animation-duration: .5s;
}
@keyframes fold-in {
  0% {
    transform: translate3d(0, 100%, 0);
  }
  50% {
    transform: translate3d(0, 50%, 0);
  }
  100% {
    transform: translate3d(0, 0, 0);
  }
}
@keyframes fold-out {
  0% {
    transform: translate3d(0, 0, 0);
  }
  50% {
    transform: translate3d(0, 50%, 0);
  }
  100% {
    transform: translate3d(0, 100%, 0);
  }
}

若是预先了解了CSS动画(上面给了连接),上面代码仍是很好理解的,要注意的是CSS动画中,fold-enter类名在节点插入DOM后不会当即删除,而是在animationed事件触发时删除。

自定义过渡类名

上面的四个过渡类名都是根据transition的name属性自动生成的,那么可否本身定义这四个类名呢?答案是能够的,经过enter-class、enter-active-class、leave-class、leave-active-class这四个特性来定义。

<div>
  <button @click="show=!show">show</button>
  <transition 
    name="fade"
    enter-class="fade-in-enter"
    enter-active-class="fade-in-active"
    leave-class="fade-out-enter"
    leave-active-class="fade-out-active"
  >
    <p v-show="show">hello</p>
  </transition>
</div>
&.fade-in-active, &.fade-out-active
  transition: all 0.5s ease     
&.fade-in-enter, &.fade-out-active
  opacity: 0

上面代码中,原来默认的fade-enter类对应fade-in-enter,fade-enter-active类对应fade-in-active,依次类推。

JavaScript钩子函数

除了用CSS过渡的动画来实现vue的组件过渡,还能够用JavaScript的钩子函数来实现,在钩子函数中直接操做DOM。咱们能够在属性中声明如下钩子:

<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"
>
</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 只用于 v-show 中
  leaveCancelled: function (el) {
    // ...
  }
}

上面的钩子函数中能够进行任何你想作的DOM操做。
小技巧:若是你只想设置组件过渡进入的效果而不想有组件过渡离开的效果,这时你就能够用钩子函数,只设置beforeEnter、enter、afterEnter这几个钩子函数就能够了。

目前接触到的关于vue transition相关的就这么多了,固然vue transition的用法可不止这么点,这须要我之后的慢慢积累。

相关文章
相关标签/搜索