1、实现动画过渡效果的几种方式css
实现动画必需要将要进行动画的元素利用<transition>标签进行包裹html
一、利用CSS样式实现过渡效果vue
<transition name="fade"></transition>git
v-enter
: 定义进入过渡的开始状态。在元素被插入时生效,在下一个帧移除。github
v-enter-active
: 定义过渡的状态。在元素整个过渡过程当中做用,在元素被插入时生效,在 transition/animation
完成以后移除。 这个类能够被用来定义过渡的过程时间,延迟和曲线函数。app
v-enter-to
: 2.1.8版及以上 定义进入过渡的结束状态。在元素被插入一帧后生效(于此同时 v-enter
被删除),在 transition/animation
完成以后移除。dom
v-leave
: 定义离开过渡的开始状态。在离开过渡被触发时生效,在下一个帧移除。异步
v-leave-active
: 定义过渡的状态。在元素整个过渡过程当中做用,在离开过渡被触发后当即生效,在 transition/animation
完成以后移除。 这个类能够被用来定义过渡的过程时间,延迟和曲线函数。函数
v-leave-to
: 2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发一帧后生效(于此同时 v-leave
被删除),在 transition/animation
完成以后移除动画
(1)经过name的名称进行重命名,在样式文件中进行.fade-enter-active设置动画的效果即transition属性,须要注意的是动画结束后样式将会移除,因此若是想要动画实现以后元素保持有某个样式,则须要transition标签里面的元素的样式表中进行设置,此状况是针对须要经过改变元素的属性来显示元素,如定位top,left以及经过transform将显示的元素的位置改变从而让元素出如今当前的视图窗口中时,可是若是元素v-show为true以后元素已经在视图中央显示了,不须要位置的移动将元素移动到视图中,只是想要显示的时候显示有动画效果的,则直接将动画结束的属性设置在v-enter-active/v-leave-active中便可。也就是说动画的属性若是只是产生效果,不对元素的任何属性进行修改,也就是动画中的属性样式不须要永久添加到dom元素中,则直接按后者的方式定义,若是说动画的属性同时相对元素进行样式设计,属性样式须要被添加到dom元素上,则须要按照前者的方式。
<transition name="fold"> <div class="shopcart-list" v-show="listShow"> <div class="list-header"> <h1 class="title">购物车</h1> <span class="empty" @click="empty">清空</span> </div> <div class="list-content" ref="list"> <ul> <li class="food border-1px" v-for="(food,index) in selectFoods" v-show="food.count>0"> <span class="name">{{selectName[index]}}</span> <div class="price"> <span>¥{{food.price*food.count}}</span> </div> <div class="cartcontrol-wrapper"> <v-cartcontrol :food="food"></v-cartcontrol> </div> </li> </ul> </div> </div> </transition>
.fold-enter-active,.fold-leave-active transition:all 0.5s .fold-enter,.fold-leave transform :translate3d(0,0,0) .shopcart-list position:absolute transform:translate3d(0,-100%,0)//动画结束后的效果须要在此处进行设置,设置在.fold-enter-active中,元素动画结束后该样式属性会被移除掉,将会看不到想要的效果 top: 100%//元素即便显示也再也不视图窗口中,经过transform实现显示 z-index:-1 width:100%
(2)若是要设置元素出现和隐藏的动画效果不同则能够分别设置样式
HTML
<transition name="bounce"> <div v-show="showFlag" class="food"><div> </transition>
CSS
.bounce-enter-active transition:all 0.4s linear transform:translate3d(0,0,0) .bounce-enter transform :translate3d(100%,0,0) .bounce-leave-active transition:all 0.4s linear transform:translate3d(100%,0,0) .bounce-leave transform:translate3d(0,0,0)
利用动画animation也能够实现上面的效果
.bounce-enter-active animation :bounceIn 0.4s linear @keyframes bounceIn{ 0%{ transform :translate3d(100%,0,0) } 50%{ transform :translate3d(50%,0,0) } 100%{ transform :translate3d(0,0,0) } } .bounce-leave-active animation :bounceOut 0.4s linear @keyframes bounceOut{ 0%{ transform :translate3d(0,0,0) } 50%{ transform :translate3d(50%,0,0) } 100%{ transform :translate3d(100%,0,0) } }
二、利用animation或者是动画库实现动画效果
<div id="example-2">
<button @click="show = !show">Toggle show</button>
<transition name="bounce">
<p v-if="show">Look at me!</p>
</transition>
</div>
new Vue({ el: '#example-2', data: { show: true } })
.bounce-enter-active { animation: bounce-in 0.5s linear;//leave和enter的动画效果不同 } .bounce-leave-active { animation: bounce-out 0.5s linear; } @keyframes bounce-in { 0% { transform: scale(0); } 50% { transform: scale(1.5); } 100% { transform: scale(1); } } @keyframes bounce-out { 0% { transform: scale(1); } 50% { transform: scale(1.5); } 100% { transform: scale(0); } }
三、自定义过分类名
enter-class
enter-active-class
enter-to-class
(>= 2.1.8 only)leave-class
leave-active-class
leave-to-class
(>= 2.1.8 only)他们的优先级高于普通的类名,这对于 Vue 的过渡系统和其余第三方 CSS 动画库,如 Animate.css 结合使用十分有用。
<link href="https://unpkg.com/animate.css@3.5.1/animate.min.css" rel="stylesheet" type="text/css"> <div id="example-3"> <button @click="show = !show"> Toggle render </button> <transition name="custom-classes-transition" enter-active-class="animated tada" leave-active-class="animated bounceOutRight" > <p v-if="show">hello</p> </transition> </div>
new Vue({ el: '#example-3', data: { show: true } })
能够在样式中同时使用transition和animation
四、利用JavaScript钩子函数实现过渡效果
<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) { // ... }, // 此回调函数是可选项的设置 // 与 CSS 结合时使用 enter: function (el, done) { // ... done() }, afterEnter: function (el) { // ... }, enterCancelled: function (el) { // ... }, // -------- // 离开时 // -------- beforeLeave: function (el) { // ... }, // 此回调函数是可选项的设置 // 与 CSS 结合时使用 leave: function (el, done) { // ... done() }, afterLeave: function (el) { // ... }, // leaveCancelled 只用于 v-show 中 leaveCancelled: function (el) { // ... } }
在使用钩子函数实现动画的时候注意dom的异步刷新,须要结合this.$nextTick(),同时在leave和enter中设置样式前最好迫使dom进行回流(reflow)使dom从新渲染,如获取元素的offsetHeight等,而后在this.$nextTick()中设置新的样式,否则有可能实现不了动画的效果.
若想了解组件间的通讯机制,能够看个人下一篇博客http://www.cnblogs.com/heshan1992/p/6905452.html