1. 动画的原理

动画.png

  1. enter表示从隐藏到显示
  2. Tip:重点关注v-enter
  3. leave表示从显示到隐藏
  4. Tip:重点关注v-leave-to
  5. v-enter-active,v-leave-active监听动画的执行过程
  6. <transition>
  7. <p v-if="isShow">hello world</p>
  8. </transition>
  9. <button @click="handleClick">toggle</button>
  10. <script>
  11. export default {
  12. name: "home",
  13. data() {
  14. return {
  15. isShow: true
  16. };
  17. },
  18. methods: {
  19. handleClick() {
  20. this.isShow = !this.isShow;
  21. }
  22. }
  23. };
  24. </script>
  25. .v-leave-active,.v-enter-active{
  26. transition: opacity 4s;
  27. }
  28. .v-leave-to,.v-enter{
  29. opacity: 0;
  30. }

2. 动画封装成插槽

  1. //1.封装
  2. <template>
  3. <transition>
  4. <slot name="fade"></slot>
  5. </transition>
  6. </template>
  7. <script>
  8. export default {
  9. name:"Fade"
  10. };
  11. </script>
  12. <style scoped>
  13. .v-leave-active,.v-enter-active{
  14. transition: opacity 4s;
  15. }
  16. .v-leave-to,.v-enter{
  17. opacity: 0;
  18. }
  19. </style>
  20. //2.使用
  21. <fade>
  22. <h1 slot="fade" v-show="isShow">This is an about page</h1>
  23. </fade>

3. 动画的钩子函数

Vue2实现动画的方式可以是css也可以js钩子,大部分情况下css3即可满足,但若是需要在实现动画过程中进行位置计算,那就需要使用js钩子函数来进行

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. <script src="./lib/vue-2.4.0.js"></script>
  9. <style>
  10. .ball {
  11. width: 15px;
  12. height: 15px;
  13. border-radius: 50%;
  14. background-color: red;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <div id="app">
  20. <input type="button" value="快到碗里来" @click="flag=!flag">
  21. <!-- 1. 使用 transition 元素把 小球包裹起来 -->
  22. <transition
  23. @before-enter="beforeEnter"
  24. @enter="enter"
  25. @after-enter="afterEnter"
  26. @before-leave="beforeLeave"
  27. @leave="leave"
  28. @after-leave="afterLeave">
  29. <div class="ball" v-show="flag"></div>
  30. </transition>
  31. </div>
  32. <script>
  33. // 创建 Vue 实例,得到 ViewModel
  34. var vm = new Vue({
  35. el: '#app',
  36. data: {
  37. flag: false
  38. },
  39. methods: {
  40. //el,表示 要执行动画的那个DOM元素,是个原生的 JS DOM对象
  41. beforeEnter(el){
  42. // beforeEnter 表示动画入场之前,此时,动画尚未开始,可以 在 beforeEnter 中,设置元素开始动画之前的起始样式
  43. el.style.transform = "translate(0px, 0px)"
  44. el.style.opacity = 0.0
  45. },
  46. //当只有javascript过渡的时候,在enter和leave中必须使用done进行回调。done的作用其实是调用afterEnter和afterLeave方法
  47. enter(el,done){
  48. //el.offsetWidth 会强制动画刷新
  49. el.offsetWidth
  50. // enter 表示动画 开始之后的样式,在这里可以设置小球完成动画之后的结束状态
  51. el.style.transform = "translate(150px, 450px)"
  52. el.style.transition = 'all 1s ease'
  53. el.style.opacity = 1.0
  54. //过渡动画结束后调用afterEnter方法
  55. el.addEventListener('transitionend', done);
  56. },
  57. afterEnter(el){
  58. // 动画完成之后,会调用 afterEnter
  59. console.log('ok111')
  60. },
  61. beforeLeave(el){
  62. //el.style.opacity = 1.0
  63. el.style.transform = "translate(150px, 450px)"
  64. console.log("beforeLeave")
  65. },
  66. leave(el,done){
  67. console.log("leave")
  68. el.offsetWidth
  69. // leave 表示动画 离开 之后的样式,在这里可以设置小球完成动画之后的结束状态
  70. el.style.transition = 'all 1s ease'
  71. el.style.opacity = 0
  72. el.style.transform = "translate(0px,0px)"
  73. el.addEventListener('transitionend', done);
  74. },
  75. afterLeave(el){
  76. // 动画完成之后,会调用 afterEnter
  77. console.log('ok222')
  78. }
  79. }
  80. });
  81. </script>
  82. </body>
  83. </html>