美文网首页
Vue 过渡和动画

Vue 过渡和动画

作者: hgzzz | 来源:发表于2018-10-29 21:37 被阅读0次

Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。(能够触发的包括 v-if、 v-show 、数据更新导致的页面更新、组件过渡等)
1. 在 CSS 过渡和动画中自动应用 class

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

  • 条件渲染 (使用 v-if)
  • 条件展示 (使用 v-show)
  • 动态组件
  • 组件根节点
    用法:将要加过渡效果的元素包裹在 <transition></transition>标签里,添加css类即可达成动画过渡效果
      /*动画进入之前和离开之后的状态*/
        .v-enter,
        .v-leave-to {
            opacity: 0;
            transform: translateX(80px);
        }
        /*动画进入过程和离开过程的状态*/
        .v-enter-active,
        .v-leave-active{
            transition: all 0.4s ease;
        }

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

  1. 自动嗅探目标元素是否应用了 CSS 过渡或动画,如果是,在恰当的时机添加/删除 CSS 类名。

  2. 如果过渡组件提供了 JavaScript 钩子函数,这些钩子函数将在恰当的时机被调用。

  3. 如果没有找到 JavaScript 钩子并且也没有检测到 CSS 过渡/动画,DOM 操作 (插入/删除) 在下一帧中立即执行。(注意:此指浏览器逐帧动画机制,和 Vue 的 nextTick 概念不同)

2. 可以配合使用第三方 CSS 动画库,如 Animate.css

 使用方式:导入Animate.css动画库

<link rel="stylesheet" href="./animate3.5.2.css">
transition 标签中添加 Animate.css 内置类,绑定 duration 属性可以指定入场和出场动画的时间

<transition enter-active-class="animated bounceIn" leave-active-class="animated bounceOut" :duration="{ enter: 400, leave: 800 }">
            <h1 v-show="flag">h1标签</h1>
        </transition>

3. 在过渡钩子函数中使用 JavaScript 直接操作 DOM
钩子函数有以下这些

<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 (el) {
                // 动画入场之前绑定的函数,动画还未开始,el表示设置了过渡效果的当前元素,可以通过 el 设置动画入场之前的样式
                el.style.transform = "translate(0, 0)"; 
            },
            enter (el, done) {
                // 表示动画开始绑定的函数,可以设置小球在动画结束之后的状态

                // 这句话没有实际的作用,但是不写就没有动画效果
                el.offsetWidth;
                el.style.transform = "translate(150px, 450px)";
                el.style.transition = "all 1s ease";  
                // done 即代表 after-enter 中绑定的函数
                done();
            },
            afterEnter (el) {
                // 动画完成之后
                this.flag = !this.flag;
            }
        }

也可以配合使用第三方 JavaScript 动画库,如 Velocity.js。
注意:这里的例子只写了上半场的动画,即进入的动画的钩子函数,离开的没有写,所以在结束上半场动画时,要让它回到初始状态,这样是为了跳过下半场动画,否则会出现一个错误
4. 给列表添加过渡

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>过渡</title>
    <style>
        ul li{
            border: 1px dashed #ccc;
            line-height: 30px;
            font-size: 12px;
            padding-left: 15px;
            margin-top: 5px;
            width: 100%;
        }
        li:hover{
            background-color: skyblue;
            transition: all 0.8s ease;
        }
        /*动画进入之前和离开之后的状态*/
        .v-enter,
        .v-leave-to {
            opacity: 0;
            transform: translateY(80px);
        }
        /*动画进入过程和离开过程的状态*/
        .v-enter-active,
        .v-leave-active{
            transition: all 0.4s ease;
        }
        .v-move{
            transition: all 0.4s ease;
        }
        .v-leave-active{
            position: absolute;
        }
    </style>
</head>
<body>
    <!-- 这是 MVVM 中的 V 视图-->
    <div id="zz">
        <label>
            ID:
            <input type="text" v-model="id">
        </label>
        <label>
            ID:
            <input type="text" v-model="name">
        </label>
        <button @click="add">添加</button>
        <!-- <ul> -->
            <!--在for循环中包裹的元素添加动画用 transitionGroup-->
            <!-- appear 可以设置元素初始渲染的动画效果-->
            <!-- tag 设置 transition-group 标签解析为什么元素 默认是 span-->
            <transition-group appear tag="ul">
               <li v-for="(item, key) in list" :key="item.id" @click="del(key)">{{ item.id }} --- {{ item.name }}</li> 
            </transition-group>
        <!-- </ul> -->
    </div>


<script src="../../Vue/node_modules/vue/dist/vue.js"></script>
<script>
    //1. 创建Vue的实例 这是 MVVM 中的 VM 调度者
    let vm = new Vue({
        el : '#zz', // 表示我们新建的 Vue 实例要控制的页面区域
        data : { // data 中存放 el 中要用到的数据 ,这是 MVVM 中的 M ,保存页面的数据
            list: [
                {id: 1, name: "张三"},
                {id: 2, name: "李四"},
                {id: 3, name: "王五"},
            ],
            id: "",
            name: ""
        },
        methods: {
            add () {
                this.list.push({id: this.id, name: this.name});
                this.id = this.name = "";
            },
            del (i) {
                this.list.splice(i, 1);
            }
        },
    });
</script>
</body>
</html>

相关文章

  • 2021-01-08

    Vue过渡和动画 Vue过渡和动画官方文档[https://cn.vuejs.org/v2/guide/trans...

  • Vue 过渡和动画

    Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。(能够触发的包括 v-if、 v-sho...

  • Vue -- 过渡和动画

    单组件过渡和动画 动画方案:css过渡和动画中自动用class;配合css第三方库如 Animate.css;在钩...

  • Vue 过渡和动画

    本文已整理到 Github,地址 ? blog[https://github.com/lio-zero/blog...

  • 17.vue中多个元素或者多个组件的过渡动画列表过渡

    1.多个元素过渡动画 2.多个组件的过渡动画 3.vue中的列表过渡

  • 在Vue中使用css动画

    About 本文主要讲述了如果在Vue项目中使用css动画效果,包括过渡和动画 同时运用过渡和动画,代码如下 效果...

  • css动画过渡

    title: css动画和transition过渡toc: truedate: 2017-03-20 vue组件 ...

  • Vue中多个元素或组件的过渡

    Vue中多个元素的过渡 Vue中多个组件的过渡(通过动态组件实现组件的过渡动画效果)image.png

  • Vue神一般的打开姿势

    过渡&动画 vue 动画的理解 1)操作 css 的 trasition 或 animation2)vue 会给目...

  • Vue动画

    Vue动画 Vue动画 CSS transition 在进入/离开的过渡中,会有 6 个 class 切换。 对于...

网友评论

      本文标题:Vue 过渡和动画

      本文链接:https://www.haomeiwen.com/subject/pqiitqtx.html