Vue——动画

  动画效果可以提升网页整体的“酷炫感”,而Vue中有特有的一些制作动画效果的方法

 

原理

  Vue里的动画是这样被创建出来的:

  1.所有需要有动画效果的标签,全部放在transition标签中,transition标签添加一个name属性(默认值为v

  2.动画分为进入(enter)、离开(leave)两部分,每一部分又分为开始enter/leave)、中间enter-active/leave-active)以及结束enter-to/leave-to

  3.动画开始执行时,给该元素添加上enterenter-active两个class(对leave也一样)

  4.第二帧时,元素的enter这个class被移除enter-to这个class被添加上(对leave也一样)

  5.动画执行完成后,enter-toenter两个标签都被移除(对leave也一样)

自定义class名

  一般默认使用的enter/leave名称为transition名-enter这样,如果想自定义名称,需要在transition标签中给其中的某个过程添加自定义class名

  

  之后就可以在style标签中用自定义的这个class名称

  

过渡、动画同时使用

  当然,也可以在自定义class中添加上fade-enter-active,从而实现过渡和动画效果同时添加

  

  但是这里会引发问题,整个动画和过渡的效果的时长究竟以动画时长为准,还是以过渡时长为准呢?

  这里可以用transition的type属性,后面添加animation/transition,表示总时长以动画/过渡的时长为准

  

  此外,还可以用v-bind绑定一个duration,后面自己填写动画的时长(毫秒)

  

  这里的duration还可以设置得复杂一些,例如分别给入场出场设置不同的时长

  

钩子

  transition中可以添加一些钩子,在动画的不同阶段执行不同的方法

  @before-enter:运行动画前触发,可接收一个参数el(transition包裹的标签)

  @enter:动画运行时触发,可接收参数el以及done(表示动画执行完成,会立即调用after-enter内的内容)

  @after-enter:在done触发后立即触发,可接收参数el,如果没有调用done则不触发

  

  

  对于leave也有同样的三个钩子

 

多个元素过渡

   在一个transition中添加多个元素,元素之间的切换要实现过渡效果

  

  上面图中是没有过渡效果的,因为页面会在切换DOM元素时尽可能地进行复用,此时需要给两个div添加不同的key

  此外,transition中还有一个mode属性,可以对多个元素切换时的过渡方式设定,包括in-out(先显示后隐藏)和out-in(先隐藏后显示)

  

 

多个组件过渡

  多个组件的过渡也可以用v-if的方法

  

  但是对于组件,我们可以用component元素,在上面用v-bind动态绑定一个变量,变量里存储的是组件的名称,通过修改组件名,从而达到切换显示和隐藏的组件的效果

  

 

列表过渡

  Vue中一个列表项如果想实现过渡效果,可以把这个列表渲染的元素放入transition-group标签中,然后再写CSS样式来实现过渡

  

 

动画封装

  可以用组件的方法,把带有过渡动画效果的元素封装起来,以便多次调用

  这里可以在组件的模板中添加transition标签,内部放一个插槽,插槽上绑定改变元素显示与否的变量

  (这里的slot中必须用v-if,因为实际上slot根本不是一个元素,没有CSS中的display属性)

  

  然后父组件中使用这个子组件

  

  当然,也可以把动画的效果一并封装入组件中,这里就需要用之前的钩子,并用JS写动画的代码来实现

  

 

一些库的使用

animate.css

  这个库上有一些现成的动画效果,可以直接套用到Vue中(官网链接

  使用前需要下载好animate.css,然后用link标签导入

  之后添加自定义的class名称,在其中先添加animated这个class

  

  之后在官网上看需要用的动画效果名称,把这个名称添加到enter/leave自定义class中,即可实现动画效果的调用

  

  

Velocity.js

  一个可以实现动画效果的库(官网链接

  使用的时候,结合Vue中的duration的钩子,传入三个参数(el、动画中变更的css属性、动画时长以及最后执行done)

  

posted @ 2019-09-23 10:38  且听风吟720  阅读(291)  评论(0编辑  收藏  举报