vue过渡与动画

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_39025670/article/details/100105657

本节内容包括

  • 常规的 transition 组件动画
  • 使用 keyframes 动画
  • 使用 Animate.css
  • 让动画首次执行
  • 过渡与动画同时存在
  • 使用第三方 JavaScript 动画库 Velocity.js

更多内容见官网过度与动画部分教程

一.常规的 transition 组件动画

vue 提供了 transition 的封装组件,让我们实现动画效果。

这里,我们要实现的效果如下

我们先看下面这张图

这张图是进入过程中的类名切换。在动画开始前,添加了fade-enter和fade-enter-active类;在动画的下一帧,移除了fade-enter类,增加了fade-enter-to类;在动画结束时删除了fade-enter-active和fade-enter-to类。

离开时的类名操作图

从上面两图来看,一共有六个类。

然后,我们来写代码实现

<head>
    <style>
        .fade-enter{
            opacity: 0;
        }
        .fade-enter-active{
            transition: opacity 1s;
        }
        .fade-leave-to{
            opacity: 0;
        }
        .fade-leave-active{
            transition: opacity 1s;
        }
    </style>
</head>
<body>

<div id="root">
    <!-- transition可以加name属性,对应的css类名将开头改为对应的name开头,默认为v开头 -->
    <transition name="fade">
        <div v-if="show">hello world</div>
    </transition>
    <button @click="handleClick">切换</button>
</div>

<script>
    var vm = new Vue({
        el: '#root',
        data: {
            show: true
        },
        methods: {
            handleClick: function () {
                this.show = !this.show;
            }
        }
    })
</script>

 这样,我们就实现了显示过程 opacity 从0到1的过程,隐藏过程从1到0。这里我们可以用v-if也可以用v-show。

二.使用 keyframes 动画

看代码

<head>
    <style>
        @keyframes bounce-in {
            0% {
                transform: scale(0);
            }
            50% {
                transform: scale(1.5);
            }
            100% {
                transform: scale(1);
            }
        }
        .enter{
            transform-origin: left center;/*改变被转换元素的位置 此处解决缩放可能会出现的问题*/
            animation: bounce-in 1s;
        }
        .leave{
            transform-origin: left center;
            animation: bounce-in 1s reverse;
            /*reverse:反向执行*/
        }
    </style>
</head>
<body>

<div id="root">
    <!-- 自定义类 -->
    <transition
            enter-active-class="enter"
            leave-active-class="leave">
        <div v-show="show">hello world</div>
    </transition>
    <button @click="handleClick">切换</button>
</div>

<script>
    var vm = new Vue({
        el: '#root',
        data: {
            show: true
        },
        methods: {
            handleClick: function () {
                this.show = !this.show;
            }
        }
    })
</script>

这里用到了自定义类,分别是enter-active和leave-active,使用了我们自己写的keyframes动画。效果如下

其他的类也可以使用自定义类,详情查看vue官网教程

三.使用 Animate.css

animate.css 其实和上面差不多,它封装的就是keyframes动画。引入样式库后,我们只需将上面例子的html代码替换成下面这样

<div id="root">
    <!-- 使用animate.css库 animated类必须要有 -->
    <transition
            enter-active-class="animated bounce"
            leave-active-class="animated swing">
        <div v-show="show">hello world</div>
    </transition>
    <button @click="handleClick">切换</button>
</div>

效果如下

四.让动画首次执行

首次执行即刷新页面执行动画。我们只需加上appear和appear-active-class

<div id="root">
    <!-- 使用animate.css库 animated类必须要有 -->
    <transition
            appear
            appear-active-class="animated bounce"
            enter-active-class="animated bounce"
            leave-active-class="animated swing">
        <div v-show="show">hello world</div>
    </transition>
    <button @click="handleClick">切换</button>
</div>

五.过渡与动画同时存在

当transition过渡与keyframes动画同时存在时,我们要以谁的时长为动画时常呢?这需要我们去设置type。type为transition,这时动画时长为3s,type为animate这时动画时长为animate.css的时长为准。

<style>
.fade-enter,
.fade-leave-to{
  opacity: 0;
}
.fade-enter-active,
.fade-leave-active{
  transition: opacity 3s;
}
</style>

<div id="root">
    <transition
      name="fade"
      type="transition"
      enter-active-class="animated bounce fade-enter-active"
      leave-active-class="animated swing fade-leave-active">
        <div v-show="show">hello world</div>
    </transition>
    <button @click="handleClick">切换</button>
</div>

六.使用第三方 JavaScript 动画库 Velocity.js

<div id="root">
    <!-- enter为进场动画,对应的leave为出场动画 -->
    <transition
            @before-enter="handleBeforeEnter"
            @enter="handleEnter"
            @after-enter="handleAfterEnter"
    >
        <div v-show="show">hello world</div>
    </transition>
    <button @click="handleClick">切换</button>
</div>

<script>
    var vm = new Vue({
        el: '#root',
        data: {
            show: true
        },
        methods: {
            handleClick: function () {
                this.show = !this.show;
            },
            handleBeforeEnter: function (el) {
                el.style.opacity = 0;
            },
            handleEnter: function (el, done) {
                Velocity(el, {
                    opacity: 1
                }, {
                    duration: 1000,
                    complete: done
                })
            },
            handleAfterEnter: function (el) {
            }
        }
    })
</script>

上面transition标签绑定的事件为vue提供的js钩子,对应的还有leave相关的钩子。上面的动画只能执行一次,我们只需将v-show改为v-if即可。

动画这块还有很多的知识点,如:多个元素/组件的过渡,列表过渡等。

猜你喜欢

转载自blog.csdn.net/qq_39025670/article/details/100105657