Vue预习课08:动画.pdf

动画基础

动画的实现方式

  • 在CSS过度和动画中自动应用class(即transition)
  • 配合第三方的动画库,如Animate.css
  • 在过渡钩子中使用Javascript直接操作DOM
  • 配合第三方Javascript动画库,如Velocity.js

image.png

补充 v-enter-active和v-enter-to是一起展示在元素中,一起离开元素中的 v-leave-active和v-leave-to是一起展示在元素中,一起离开元素中的

transition组件

  1. <style>
  2. /* 在元素进入的前一帧 */
  3. .fade-enter {
  4. opacity: 0;
  5. }
  6. /* 在元素进入到元素的终点样式 */
  7. .fade-enter-active {
  8. transition: opacity 1.5s;
  9. }
  10. /* 在元素离开最后的终点样式 */
  11. .fade-leave-to {
  12. opacity: 0
  13. }
  14. /* 在元素离开到元素的终点样式 */
  15. .fade-leave-active {
  16. transition: opacity 1.5s;
  17. }
  18. </style>
  19. <div v-if="show">动画的展示隐藏<span @click="show = false">×</span></div>
  20. new Vue({
  21. el: "#app",
  22. data: {
  23. show: false
  24. },
  25. mounted (){
  26. this.show = true;
  27. }
  28. })

使用CSS动画库

参考官方文档自定义过渡类名
例如:使用Animation.css

enter-active-classleave-active-class是自定义transition组件的进入和离开的class,这个自定义class名称高于自动生成的类名

  1. <link href="https://cdn.jsdelivr.net/npm/animate.css@3.5.1" rel="stylesheet" type="text/css">
  2. <style>
  3. .message {
  4. background-color: red;
  5. }
  6. </style>
  7. <div id="app">
  8. <transition enter-active-class="animated bounceIn" leave-active-class="animated bounceOut">
  9. <div v-if="show" class="message">
  10. 展示
  11. </div>
  12. </transition>
  13. <button @click="show = !show">toggle</button>
  14. </div>
  15. new Vue({
  16. el: '#app',
  17. data: {
  18. show: false
  19. }
  20. })

JS动画钩子

触发回流

  1. <style>
  2. .message {
  3. background-color: red;
  4. }
  5. .fade-enter-active {
  6. transition: opacity 1.5s;
  7. }
  8. .fade-leave-active {
  9. transition: opacity 1.5s;
  10. }
  11. </style>
  12. <div id="app">
  13. <transition name="fade" @before-enter="beforeEnter" @enter="enter" @leave="leave" @before-leave="beforeLeave">
  14. <div v-if="show" class="message">
  15. 展示
  16. </div>
  17. </transition>
  18. <button @click="show = !show">toggle</button>
  19. </div>
  20. new Vue({
  21. el: '#app',
  22. data: {
  23. show: false
  24. },
  25. methods: {
  26. beforeEnter (el) {
  27. el.style.opacity = 0; // 设置初始状态
  28. },
  29. enter (el, done) {
  30. document.body.offsetHeight; // 触发回流激活动画
  31. el.style.opacity = 1; // 设置结束状态
  32. // 监听动画的结束事件,并执行done函数(不执行done函数,则动画不会结束,还占页面位置)
  33. // 合理的还需要在之后动画结束remove监听
  34. el.addEventListener('transitionend', done)
  35. },
  36. leave (el, done) {
  37. el.style.opacity = 0;
  38. // 监听动画的结束事件,并执行done函数(不执行done函数,则动画不会结束,还占页面位置)
  39. // 合理的还需要在之后动画结束remove监听
  40. el.addEventListener('transitionend', done)
  41. },
  42. beforeLeave (el) {
  43. document.body.offsetHeight; // 触发回流激活动画
  44. el.style.opacity = 1;
  45. }
  46. }
  47. })

纯JS方案(Velocity.js使用)

  1. <div id="app">
  2. <transition @before-enter="beforeEnter" @enter="enter" @leave="leave" @before-leave="beforeLeave">
  3. <div v-if="show" class="message">
  4. 展示
  5. </div>
  6. </transition>
  7. <button @click="show = !show">toggle</button>
  8. </div>
  9. new Vue({
  10. el: '#app',
  11. data: {
  12. show: false
  13. },
  14. methods: {
  15. beforeEnter (el) {
  16. el.style.opacity = 0;
  17. },
  18. enter (el, done) {
  19. // 不需要回流,因为内部已经做了
  20. Velocity(el, { opacity: 1 }, {duration: 500, complete: done })
  21. },
  22. beforeLeave (el) {
  23. el.style.opacity = 1;
  24. },
  25. leave (el, done) {
  26. Velocity(el, { opacity: 0 }, {duration: 500, complete: done })
  27. }
  28. }
  29. })

列表动画

使用transition-group组件对v-for的元素包裹起来
原理是在transition-group包裹的标签中每一个元素都添加了transition组件

  1. <style>
  2. .fade-enter {
  3. opacity: 0;
  4. }
  5. .fade-enter-active {
  6. transition: opacity 1.5s
  7. }
  8. .fade-leave-to {
  9. opacity: 0;
  10. }
  11. .fade-leave-active {
  12. transition: opacity 1.5s
  13. }
  14. </style>
  15. <div id="app">
  16. <button @click="list.push('====')">增加</button>
  17. <ul>
  18. <transition-group name="fade">
  19. <li v-for="(item, i) in list" :key="i">
  20. {{item}}
  21. </li>
  22. </transition-group>
  23. </ul>
  24. <button @click="show = !show">收缩</button>
  25. <transition name="fade">
  26. <div v-if="show">25614564564</div>
  27. </transition>
  28. </div>
  29. <script>
  30. new Vue({
  31. el: '#app',
  32. data: {
  33. list: [
  34. 'test',
  35. 'web'
  36. ],
  37. show: false
  38. }
  39. })
  40. </script>