概述

  • Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。
  • 在过渡钩子函数中使用 JavaScript 直接操作 DOM
  • 配合使用第三方 CSS 动画库,如 Animate.css
  • 配合使用第三方 JavaScript 动画库,如 Velocity.js
  • CSS 过渡和动画中自动应用 class

transition

Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡

  • 条件渲染 (使用 v-if)
  • 条件展示 (使用 v-show)
  • 动态组件
  • 组件根节点

例子:

Vue动画详解篇

当插入或删除包含在 transition 组件中的元素时,Vue 将会做以下处理:

  • 自动嗅探目标元素是否应用了 CSS 过渡或动画,如果是,在恰当的时机添加/删除 CSS 类名
  • 如果没有找到 JavaScript 钩子并且也没有检测到 CSS 过渡/动画,DOM 操作 (插入/删除) 在下一帧中立即执行。
  • 如果过渡组件提供了 javaScript钩子函数,这些钩子函数将在恰当的时机被调用。

在进入/离开的过渡中,会有 6 个 class 切换:

  • v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。
  • v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。
  • v-enter-to2.1.8版及以上 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。
  • v-leave: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。
  • v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。
  • v-leave-to2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。

其他案例:          //具体可以Vue官网文档查看,建议少看书籍多看官网文档,代谢的太快,不懂就敲百度或者看文档

Vue动画详解篇

动画用法同 CSS 过渡,区别是在动画中 v-enter 类名在节点插入 DOM 后不会立即删除,而是在 animationend 事件触发时删除。

案例:

<style type="text/css">
            .abc-enter-active {
              animation: abc-in .5s;
            }
            .abc-leave-active {
              animation: abc-in .5s reverse;
            }
            @keyframes abc-in {
              0% {
                transform: scale(0);
              }
              50% {
                transform: scale(1.5);
              }
              100% {v-on:
                transform: scale(1);
              }
            }
        </style>

<body>
        <div id="app">
          <button v-on:click="show = !show">点击按键产生由外膨胀再向内慢慢缩退消失的效果</button>
          <transition name="abc">
            <p v-if="show">bilibilibilibilibilibilibilibilibilibilibilibilibilibilibilibilibilibilibilibilibilibilibilibili</p>
          </transition>
        </div>
    <script type="text/javascript">
        new Vue({
          el: '#app',
          data: {
            show: true
          }
        })
    </script>
    </body>

自定义过滤的类名:

  • enter-class
  • enter-active-class
  • enter-to-class 
  • leave-class
  • leave-active-class
  • leave-to-class 

他们的优先级高于普通的类名,这对于 Vue 的过渡系统和其他第三方 CSS 动画库,如 Animate.css 结合使用十分有用。

实例:

<body>
        <link href="https://cdn.jsdelivr.net/npm/[email protected]" rel="stylesheet" type="text/css">
        <div id="app">
          <button @click="show = !show">
            按键
          </button>
          <transition
            name="custom-classes-transition"
            enter-active-class="animated tada"
            leave-active-class="animated bounceOutRight"
          >
            <p v-if="show">动画效果</p>
          </transition>
        </div>
    <script type="text/javascript">
        new Vue({
          el: '#app',
          data: {
            show: true
          }
        })
    </script>
    </body>

也可以定义JavaScript钩子:

Vue动画详解篇

这些钩子函数可以结合 CSS transitions/animations 使用,也可以单独使用。

  • 当只用 JavaScript 过渡的时候,在 enter 和 leave 中必须使用 done 进行回调。否则,它们将被同步调用,过渡会立即完成。
  • 推荐对于仅使用 JavaScript 过渡的元素添加 v-bind:css="false",Vue 会跳过 CSS 的检测。这也可以避免过渡过程中 CSS 的影响。

使用 Velocity.js 的例子:

<body>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js"></script>
        <div id="app">
          <button v-on:click="show = !show">
                按键
          </button>
          <transition
            v-on:before-enter="before"
            v-on:enter="enter"
            v-on:leave="leave"
            v-bind:css="false"
          >
            <p v-if="show">
              动画效果
            </p>
          </transition>
        </div>
        
    <script type="text/javascript">
        new Vue({
          el: '#app',
          data: {
            show: true
          },
          methods: {
            before: function (el) {
              el.style.opacity = 0
              el.style.transformOrigin = 'left'
            },
            enter: function (el, done) {
              Velocity(el, { opacity: 1, fontSize: '1.4em' }, { duration: 300 })
              Velocity(el, { fontSize: '1em' }, { complete: done })
            },
            leave: function (el, done) {
              Velocity(el, { translateX: '15px', rotateZ: '50deg' }, { duration: 600 })
              Velocity(el, { rotateZ: '100deg' }, { loop: 2 })
              Velocity(el, {
                rotateZ: '45deg',
                translateY: '30px',
                translateX: '30px',
                opacity: 0
              }, { complete: done })
            }
          }
        })
        
    </script>
    </body>

ps:谢谢观看,希望对你有所帮助!其他案列可以从多个案例项目了解,不需要刻意去记住所有,慢慢吃透,不懂敲百度或者看文档即可。

相关文章: