1.vue动画

1.1 vue动画设置
  • 把需要显示隐藏做动画的标签放入transition组件中作为子标签

注意:transition标签要求仅有一个子标签,多余的不会渲染,如果需要在一个组件中实现多种动画效果,需要给transition添加属性name以区分动画

  • 在css中设置动画效果,标签显示和隐藏是两个动画过程,叫做入场和出场。添加transition组件后,vue会自定定义入场和出场效果的class值,通过class设置动画
    • 入场:标签的显示过程 v-enter v-enter-active v-enter-to
    • 出场:标签的隐藏过程 v-leave v-leave-active v-leave-to

如果需要设置多个标签动画,需要给transition添加属性name,在设置动画效果时,就可以单独设置这个transition的入场和出场,只需要把v-前缀改成name值前缀即可 如: .v-enter 改成 .yu-enter

一个标签动画的设置:

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

<body>
    <script src='https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js'></script>
    <div id='myApp'>
        <button @click="bool=!bool">显示/隐藏</button>
        <transition>
            <h3 v-if="bool">111</h3>
        </transition>

    </div>
    <script>
        new Vue({
            el: '#myApp',
            data: {
                bool: true
            },
            methods: {

            }
        })
    </script>
</body>

多个标签动画的设置:

<style>
        .jjj-enter,
        .jjj-leave-to {
            opacity: 0;
        }
        
        .jjj-enter-active,
        .jjj-leave-active {
            transition: 2s;
        }
        
        .jjj-enter-to,
        .jjj-leave {
            opacity: 1;
        }
</style>
<body>
    <script src='https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js'></script>
    <div id='myApp'>
        <button @click="bool=!bool">显示/隐藏</button>
        <transition>
            <h3 v-if="bool">111</h3>
        </transition>
        <transition name="jjj">
            <h1 v-if="bool">另一个动画</h1>
        </transition>

    </div>
    <script>
        new Vue({
            el: '#myApp',
            data: {
                bool: true
            },
            methods: {

            }
        })
    </script>
</body>
1.2 vue列表动画设置

transition组件的子标签只能有一个,不能写列表,而transition-group可以写多个子标签。transition-group默认会被渲染成span标签,使用tag属性可指定渲染的标签类型。

transition-group组件中的元素要求必须设置key属性,key属性有两个要求:

  • 必选性,key必须设置,不设置会报错
  • 不变性,key的值一旦设置,不能发生变化,所以在此例中key值不能设置为索引,因为数组从前删除元素时数组的索引会发生变化,造成动画显示异常
  • key不要求唯一性,即使key值有重复,也可以正常执行
    <style>
        li {
            position: relative;
        }
        
        .v-enter {
            left: 200px;
            opacity: 0;
        }
        
        .v-enter-active {
            transition: 1s;
        }
        
        .v-enter-to {
            left: 0;
            opacity: 1;
        }
        
        .v-leave {
            left: 0;
            opacity: 1;
        }
        
        .v-leave-active {
            transition: 1s;
        }
        
        .v-leave-to {
            left: 200px;
            opacity: 0;
        }
    </style>
</head>

<body>
    <script src='https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js'></script>
    <div id='myApp'>
        <button @click="add">添加</button>
        <button @click="del">删除</button>

        <transition-group tag="ul">
            <li v-for="item,i in list" :key="item">项目{{item}}</li>
        </transition-group>
    </div>
    <script>
        new Vue({
            el: '#myApp',
            data: {
                list: []
            },
            methods: {
                add() {
                    this.list.push(parseInt(Math.random() * 100))
                },
                del() {
                    this.list.shift() //删除数组的第一项
                }
            }
        })
    </script>
</body>
1.3vue位移动画

如果 transition-group中的列表长度不变,不涉及显示隐藏和创建销毁,就不能设置入场出场动画。此时只设计列表元素位置的更新,使用v-move设置位移动画即可

  <style>
        .v-move {
            transition: 2s;
        }
    </style>
</head>

<body>
    <script src='https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js'></script>
    <div id='myApp'>
        <button @click="reset1">重置排序</button>
        <button @click="reset2">重置反序</button>

        <transition-group tag="ul">
            <li v-for="item,i in list" :key="item">{{item}}</li>
        </transition-group>
    </div>
    <script>
        new Vue({
            el: '#myApp',
            data: {
                list: []
            },
            created() {
                for (var i = 0; i < 10; i++) {
                    this.list.push(Math.random())
                }
            },
            methods: {
                reset1() {
                    this.list.sort()
                },
                reset2() {
                    this.list.reverse()
                }
            }
        })
    </script>
</body>
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐