赞
踩
在 vue
中给组件或元素添加动画的方式可以分为多种,但总体无非还是通过 css
和 JavaScript
来进行处理
通过 css
添加动画的方式特别的简单,只需要利用 css
中的 transition
就可以做到
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> .js_animation_box { width: 100px; height: 100px; background: red; transition: .5s all; } .js_animation_box.end { width: 200px; height: 200px; background: green; } </style> </head> <body> <button id="js_animation_btn">原生动画</button> <div id="js_animation_box" class="js_animation_box"></div> <script> // 原生 + css let jsAnimationBtn = document.querySelector('#js_animation_btn'); let jsAnimationBox = document.querySelector('#js_animation_box'); jsAnimationBtn.onclick = function() { jsAnimationBox.classList.add('end'); } </script> </body> </html>
参考:https://https://github.com/6xiaoDi/blog-vue-Novice/tree/a1.44
Branch: branch04commit description:a1.44(原生css动画demo)
tag:a1.44
(如果不太会css,可参考小迪的blog,有对css详细说明)
vue+css
=> 动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .box { width: 100px; height: 100px; background: red; /*动画效果*/ transition: all .5s; } /*移入更改宽*/ .box:hover { width: 200px; } </style> </head> <body> <div id="app"> <div class="box"></div> </div> <script src="./js/vue.js"></script> <script> let app = new Vue({ el: '#app' }); </script> </body> </html>
参考:https://https://github.com/6xiaoDi/blog-vue-Novice/tree/a1.45
Branch: branch04commit description:a1.45(example01-1——vue配合css生成动画)
tag:a1.45
融入vue
数据操作动画。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .box { width: 100px; height: 100px; background: red; /*动画效果*/ transition: all .5s; } </style> </head> <body> <div id="app"> <button @click="fn">按钮</button> <div class="box" :style="{width: w}"></div> </div> <script src="./js/vue.js"></script> <script> let app = new Vue({ el: '#app', data: { w: '100px' }, methods: { fn() { this.w = '200px'; } } }); </script> </body> </html>
参考:https://https://github.com/6xiaoDi/blog-vue-Novice/tree/a1.46
Branch: branch04commit description:a1.46(example01-2——vue配合css生成动画-融入data)
tag:a1.46
融入vue
的dom
操作。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .box { width: 100px; height: 100px; background: red; /*动画效果*/ transition: all .5s; } </style> </head> <body> <div id="app"> <button @click="fn">按钮</button> <div class="box" ref="box1"></div> </div> <script src="./js/vue.js"></script> <script> let app = new Vue({ el: '#app', methods: { fn() { this.$refs.box1.style.width = '200px'; } } }); </script> </body> </html>
参考:https://https://github.com/6xiaoDi/blog-vue-Novice/tree/a1.47
Branch: branch04commit description:a1.47(example01-3——vue配合css生成动画-融入dom操作)
tag:a1.47
用原生js,引入jQuery去做。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> .js_animation_box { width: 100px; height: 100px; background: red; } </style> </head> <body> <button id="js_animation_btn">原生动画</button> <div id="js_animation_box" class="js_animation_box"></div> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <script> // jq $('#js_animation_btn').on('click', function() { $('#js_animation_box').animate({ width: 200, height: 200 }, .5); }); </script> </body> </html>
参考:https://https://github.com/6xiaoDi/blog-vue-Novice/tree/a1.48
Branch: branch04commit description:a1.48(jq动画demo)
tag:a1.48
在 vue
中基本和上面的处理方式是一样的
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> .js_animation_box { width: 100px; height: 100px; background: red; transition: .5s all; } .js_animation_box.end { width: 200px; height: 200px; background: green; } </style> </head> <body> <div id="app"> <button @click="isEnd = !isEnd">vue动画</button> <div :class="['js_animation_box', isEnd ? 'end' : '']"></div> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> let app = new Vue({ el: '#app', data: { isEnd: false } }); </script> </body> </html>
参考:https://https://github.com/6xiaoDi/blog-vue-Novice/tree/a1.49
Branch: branch04commit description:a1.49(vue动画demo)
tag:a1.49
vue
为元素和组件的几个特殊的情况提供了对应的处理方式
v-if
)v-show
)通过 transition
组件包裹的元素或组件,会在上面定义的几个场景中触发过渡,并添加指定的 class
样式。transition
会使其下的组件具有动画效果,但是有条件的,在上述四个条件下才(条件渲染、条件展示、动态组件、组件根节点)能触发动画 => 自动帮助添加class
,添加class
也是有规定的。
参考下方的过渡类名
,指定class
。
v-enter
:(默认情况)定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除v-enter-active
:(默认情况)定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数v-enter-to
: 2.1.8版及以上 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter
被移除),在过渡/动画完成之后移除v-leave
: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除v-leave-active
:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数v-leave-to
: 2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave
被删除),在过渡/动画完成之后移除Opacity
从0运动到1(需要一个这样的动画),Enter
代表从无到有的过程(如:v-if为true
),这个时候就会有过渡动画(从隐藏到显示),首先会给当前元素添加一个v-enter
(动画初始值),紧接着会给它添加v-enter-active
(过渡效果),它是设置当前动画的样式,v-enter-to
代表目标点(动画终点值),表示即将动画到的终点。
v-enter
在下一帧就自动被销毁了,v-enter-active
、v-enter-to
直到动画完全结束,它们才被自动销毁,这就是它动画的生命周期了。
同理动画离开的时候也是上面的流程,只不过倒过来了。
触发v-if
演示 => 当 <div class="box" v-if="isShow"></div>
隐藏的时候,会自动调用动画,
class
名称默认为v-XXX
,默认为v-enter-XXXX
,前面可以加自己的前缀名(v
-),这样自己可以设计多套不同的css
样式。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .box { width: 100px; height: 100px; background: red; /*修改box样式就会触发该动画*/ transition: all .5s; } </style> </head> <body> <div id="app"> <button @click="fn">按钮</button> <button @click="isShow=!isShow">{{isShow}}</button> <transition> <div class="box" v-if="isShow"></div> </transition> </div> <script src="./js/vue.js"></script> <script> let app = new Vue({ el: '#app', data: { isShow: true, w: '100px' }, methods: { fn() { this.$refs.box1.style.width = '200px'; } } }); </script> </body> </html>
参考:https://https://github.com/6xiaoDi/blog-vue-Novice/tree/a1.50
Branch: branch04commit description:a1.50(example02-1——transition使用)
tag:a1.50
存在掉帧,动画效果看得不明显,不能完全看出css
效果,再做一个演示:
我们可以为transition
组件设置名称属性 => slide-fade
加一些样式效果,再把动画加长至5s
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .box { width: 100px; height: 100px; background: red; } .slide-fade-enter-active, .slide-fade-leave-active { transition: all 5s ease; } .slide-fade-enter { width: 0; height: 0; } .slide-fade-enter-to { width: 100px; height: 100px; } .slide-fade-leave { /*可以和slide-fade-enter-to合并*/ width: 100px; height: 100px; } .slide-fade-leave-to { /*可以和slide-fade-enter合并*/ width: 0; height: 0; } </style> </head> <body> <div id="app"> <button >按钮</button> <button @click="isShow=!isShow">{{isShow}}</button> <transition name="slide-fade"> <div class="box" v-if="isShow"></div> </transition> </div> <script src="./js/vue.js"></script> <script> let app = new Vue({ el: '#app', data: { isShow: true } }); </script> </body> </html>
触发的时候,会发现class
加了很多字符,其实就它会根据动画触发重新渲染的时候,它都会给这个元素添加样式,即加入到class
当中。
参考:https://https://github.com/6xiaoDi/blog-vue-Novice/tree/a1.51
Branch: branch04commit description:a1.51(example02-2——transition深入使用)
tag:a1.51
触发动画的时候,class
自动追加enter-active
和enter-to
,运动完成之后又会把这些class
给销毁掉。
vue
动画组件根据<transition name="slide-fade">
,当它包含的元素触发了上面四个条件而重新渲染的时候,它都会触发transition
指定的动画,它会给包含的这个元素添加class
,然后就会有动画效果了。
需要一个这样的动画,Enter
代表从无到有的过程(如:v-if
为true
),这个时候就会有过渡动画,首先会给当前元素添加一个.slide-fade-enter
(动画初始值=>宽高都是0
),紧接着会给它添加.slide-fade-enter-active
(过渡效果),它是设置当前动画的样式,.slide-fade-enter-to
代表目标点(动画终点值),表示即将动画到的终点。.slide-fade-enter
在下一帧就自动被销毁了,.slide-fade-enter-active
、.slide-fade-enter-to
直到动画完全结束,它们才被自动销毁,这就是它动画的生命周期了。
同理动画离开的时候也是上面的流程,只不过倒过来了,伴随.slide-fade-leave-active
的过渡动画,.slide-fade-leave
到.slide-fade-leave-to
。
很多动画,用css
就可以办到,完全没有必要用vue
去做,而且transition
是有局限性的,它不是任何时候都可以触发的。
假如页面当中已经有一个元素出现了,我想点击一下让它运动到一个位置,这个时候既不会触发v-if
,也不会触发v-show
,并且不是动态组件,也不是组件根节点。
这个时候动画触发通通无效了,所以操作这种特殊情况,并不是从无到有的过程,所以建议还是用原生js
的方式,来加载一些动画库去完成。
通过ref
获取dom
元素,利用原生js
和动画库去完成。(关于原生js
与css
实现动画,以及调用动画库可参考小迪写的blog
)
再或者直接使用css
去做动画即可。
除此之外,vue
动画在动画过程中还会触发动画生命周期,可以参考官方文档(不太重点):
js
钩子其实就是在transition
当中加一些指定的事件,动画过程中会触发这些指定的事件,执行对应的生命周期函数。可在这些生命周期函数中做些事情,比如改变其样式,添加class
,让其动画起来等等。
<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 结合使用时 // 回调函数 done 是可选的 enter: function (el, done) { // ... done() }, afterEnter: function (el) { // ... }, enterCancelled: function (el) { // ... }, // -------- // 离开时 // -------- beforeLeave: function (el) { // ... }, // 当与 CSS 结合使用时 // 回调函数 done 是可选的 leave: function (el, done) { // ... done() }, afterLeave: function (el) { // ... }, // leaveCancelled 只用于 v-show 中 leaveCancelled: function (el) { // ... } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。