Vue4--过渡动画

在Vue中给元素添加过渡动画:

  1. 将需要执行动画的元素放在transition标签中
  2. 每一组transition标签只能控制一个标签的过渡动画,如果在transition中有多个标签,也只能在第一个标签添加过渡动画
  3. 如果想给多个元素添加过渡动画, 那么就必须创建多个transition组件
  4. 当transition组件中的元素显示时会自动查找.v-enter/.v-enter-active/.v-enter-to类名
  5. 当transition组件中的元素隐藏时会自动查找.v-leave/ .v-leave-active/.v-leave-to类名
  6. 在.v-enter和.v-leave-to中指定动画动画开始的状态,在.v-enter-active和.v-leave-active中指定动画执行的状态,即可完成过渡动画
  7. 初始动画设置:默认情况下,第一次进入时没有动画,如果想一进来就有动画,需要给transition添加apper属性,告诉Vue第一次进入就要显示动画
  8. 给不同的元素指定不同的动画:通过给transition指定name的形式指定在“进入之前/进入之后/进入过程中,离开之前/离开之后/离开过程中”对应的类名,实现不同的元素执行不同的过渡动画

使用transition和类名实现过渡动画

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--导入vue.js文件-->
    <script src="js/vue.js"></script>
    <style>
        *{
            margin:0;
            padding:0;
        }
        .box{
            width: 200px;
            height: 200px;
            background: red;
        }
        .one-enter{
            opacity: 0;
        }
        .one-enter-to{
            opacity: 1;
            margin-left: 300px;
        }
        .one-enter-active{
            transition: all 2s;
        }
        .two-enter{
            opacity: 0;
        }
        .two-enter-to{
            margin-top: 200px;
            opacity: 1;
        }
        .two-enter-active{
            transition: all 2s;
        }
    </style>
</head>
<body>
<div id="app">
    <button @click="toggle">按钮</button>
    <transition appear name="one">
    <div class="box" v-show="show"></div>
    </transition>
    <transition appear name="two">
        <div class="box" v-show="show"></div>
    </transition>
</div>
<script>
    let vue = new Vue({
        el:'#app',
        data:{
            show:false
        },
        methods:{
            toggle(){
                this.show = !this.show
            }
        }
    });
</script>
</body>
</html>

使用transition和钩子函数实现过渡动画

  1. 通过tranisition和类名能实现过渡动画,但是存在不能保存动画执行后的状态,即动画执行后会复位,这是因为在Vue内部,是通过给标签动态添加类名,在动画执行结束后删除类名的原因。
  2. 想要在Vue中保存过渡后的结果:使用函数实现:
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" 离开动画被取消
  1. 注意点:
    3.1 在动画过程中必须写上el.offsetWidth或者el.offsetHeight
    3.2 在enter和leave方法中必须调用done方法, 否则after-enter和after-leave不会执行
    3.3 如果需要添加初始动画, 那么需要把done方法包裹到setTimeout方法中调用
    3.4 默认情况下,即使给transition添加钩子函数,还是会去寻找类名中的样式,需要给transition添加v-bind:css="false"防止Vue默认去寻找类名
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--导入vue.js文件-->
    <script src="js/vue.js"></script>
    <style>
        *{
            margin:0;
            padding:0;
        }
        .box{
            width: 200px;
            height: 200px;
            background: red;
        }
    </style>
</head>
<body>
<div id="app">
    <button @click="toggle">按钮</button>
    <transition appear
                v-bind:css="false"
                v-on:before-enter="beforeEnter"
                v-on:enter="enter"
                v-on:after-enter="afterEnter"
    >
    <div class="box" v-show="show"></div>
    </transition>
</div>
<script>
    let vue = new Vue({
        el:'#app',
        data:{
            show:false
        },
        methods:{
            toggle(){
                this.show = !this.show
            },
            beforeEnter(el){
                //动画开始之前
                el.style.opacity = '0'
            },
            enter(el,done){
                //进入动画执行过程
                el.offsetWidth;//必须在动画执行过程中的回调函数中写上el.offsetWidth / el.offsetHeight
                el.style.transition ='all 3s'
                setTimeout(function(){
                    //done函数一定要执行,否则后续的aferEnter函数不会被执行
                    done();//如果想让元素一进来就有动画,需要把done函数写在延迟函数中
                },0)
            },
            afterEnter(el){
                //动画执行完毕的效果
                el.style.opacity ='1';
                el.style.marginLeft ='500px';
            }
        }
    });
</script>
</body>
</html>

在这里插入图片描述

自定义动画类名

enter-class // 进入动画开始之前
enter-active-class // 进入动画执行过程中
enter-to-class // 进入动画执行完毕之后
leave-class // 离开动画开始之前
leave-active-class // 离开动画执行过程中
leave-to-class // 离开动画执行完毕之后

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--导入vue.js文件-->
    <script src="js/vue.js"></script>
    <style>
        *{
            margin:0;
            padding:0;
        }
        .box{
            width: 200px;
            height: 200px;
            background: red;
        }
        .a{
            opacity: 0;
        }
        .b{
            transition: all 2s;
        }
        .c{
            opacity: 1;
            background-color: yellow;
        }
    </style>
</head>
<body>
<div id="app">
    <button @click="toggle">按钮</button>
    <transition appear
                enter-class="a"
                enter-active-class="b"
                enter-to-class="c"
    >
    <div class="box" v-show="show"></div>
    </transition>
</div>
<script>
    let vue = new Vue({
        el:'#app',
        data:{
            show:false
        },
        methods:{
            toggle(){
                this.show = !this.show
            }
        }
    });
</script>
</body>
</html>
发布了119 篇原创文章 · 获赞 1 · 访问量 3948

猜你喜欢

转载自blog.csdn.net/weixin_42139212/article/details/103855391