30-Vue-过渡动画

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>30-Vue-过渡动画</title>
    <script src="js/vue.js"></script>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .box{
            width: 200px;
            height: 200px;
            background: red;
        }
        .v-enter{
            opacity: 0;
        }
        .v-enter-to{
            opacity: 1;
            margin-left: 500px;
        }
        .v-enter-active{
            transition: all 3s;
        }
    </style>
</head>
<body>
<!--
1.当前过渡存在的问题
通过transition+类名的方式确实能够实现过渡效果
但是实现的过渡效果并不能保存动画之后的状态
因为Vue内部的实现是在过程中动态绑定类名, 过程完成之后删除类名
正式因为删除了类名, 所以不能保存最终的效果

2.在Vue中如何保存过渡最终的效果
通过Vue提供的JS钩子来实现过渡动画

因为这些钩子是用v-on绑定的函数,所以这又称为钩子函数,
因为是用v-on绑定的函数,所以所有钩子函数放在methods中执行

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" 离开动画被取消

3.JS钩子实现过渡注意点
3.1在动画过程中必须写上el.offsetWidth或者el.offsetHeight
3.2在enter和leave方法中必须调用done方法, 否则after-enter和after-leave不会执行
3.3需要需要添加初始动画, 那么需要把done方法包裹到setTimeout方法中调用
-->

<!--这里就是MVVM中的View-->
<div id="app">
    <button @click="toggle">我是按钮</button>
    <!--
    注意点: 虽然我们是通过JS钩子函数来实现过渡动画
            但是默认Vue还是回去查找类名, 所以为了不让Vue去查找类名
            可以给transition添加v-bind:css="false"
    -->
    <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="isShow"></div>
    </transition>
</div>
<script>
    // 这里就是MVVM中的View Model
    let vue = new Vue({
        el: '#app',
        // 这里就是MVVM中的Model
        data: {
            isShow: true
        },
        // 专门用于存储监听事件回调函数
        methods: {
            toggle(){
                this.isShow = !this.isShow;
            },
            beforeEnter(el){ // el是当前执行动画的元素
                // 进入动画开始之前
                console.log("beforeEnter");
                el.style.opacity = "0";
            },
            enter(el, done){
                // 进入动画执行过程中
                // 动画执行过程中不仅传入当前执行动画的元素el,还有回调函数done
                //      回调函数done的作用:
                //          告诉vue动画已经执行完毕,可以继续向下执行(afterEnter)了

                console.log("enter");
                /*
                注意点: 如果是通过JS钩子来实现过渡动画
                        那么必须在动画执行过程中的回调函数中写上
                        el.offsetWidth 或者 el.offsetHeight
                * */
                // el.offsetWidth;
                el.offsetHeight;
                el.style.transition = "all 3s";
                /*
                注意点: 动画执行完毕之后一定要调用done回调函数
                        否则后续的afterEnter钩子函数不会被执行
                * */
                // done();//没有appear时直接这样写就行
                /*
                注意点: 如果想让元素一进来就有动画, 那么最好使用定时器延迟一下再调用done方法
                * */
                setTimeout(function () {
                    done();
                }, 0);
            },
            afterEnter(el){
                // 进入动画执行完毕之后
                console.log("afterEnter");
                el.style.opacity = "1";
                el.style.marginLeft = "500px";
            }
        },
        // 专门用于定义计算属性的
        computed: {
        }
    });
</script>
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Vue.js 中,过渡动画是一种在元素插入、更新或移除时添加动画效果的方式。`<transition>` 组件是 Vue 提供的用于处理过渡动画的组件之一。其中,`move-class` 属性用于指定在元素移动过程中应用的 CSS 类。 `move-class` 属性允许你为元素在移动过程中的不同状态定义不同的 CSS 类。当元素在进行插入、更新或移除时,Vue 会自动添加或删除这些 CSS 类。 下面是 `move-class` 属性的详细解释: 1. **基本用法**:你可以将 `move-class` 属性添加到 `<transition>` 组件上,并指定一个用于移动过程中应用的 CSS 类。 ```html <transition move-class="custom-move-class"> <!-- 元素内容 --> </transition> ``` 2. **类名规则**:`move-class` 属性的值可以是一个字符串,也可以是一个对象。如果是一个字符串,它将被视为应用于所有移动过程中的状态;如果是一个对象,可以指定分别应用于不同状态的类名。 ```html <!-- 字符串形式 --> <transition move-class="custom-move-class"> <!-- 元素内容 --> </transition> <!-- 对象形式 --> <transition :move-class="{ enter: 'enter-class', enterActive: 'enter-active-class', leave: 'leave-class', leaveActive: 'leave-active-class', appear: 'appear-class', appearActive: 'appear-active-class' }"> <!-- 元素内容 --> </transition> ``` 在对象形式中,可以定义以下类名: - `enter`:插入时的起始状态类名; - `enterActive`:插入时的过渡状态类名; - `leave`:移除时的起始状态类名; - `leaveActive`:移除时的过渡状态类名; - `appear`:初次渲染时的起始状态类名; - `appearActive`:初次渲染时的过渡状态类名。 3. **CSS 定义**:你需要在 CSS 样式中定义这些类名,以实现相应的过渡效果。例如: ```css .custom-move-class { transition: transform 0.3s ease; } .custom-move-class-enter { transform: translateX(-100%); } .custom-move-class-enter-active { transform: translateX(0); } .custom-move-class-leave { transform: translateX(0); } .custom-move-class-leave-active { transform: translateX(100%); } ``` 在上述示例中,我们定义了一个简单的过渡效果,使元素从左侧滑入和滑出。 通过使用 `move-class` 属性,你可以根据元素在插入、更新或移除时的不同状态,为其添加不同的 CSS 类,从而实现自定义的过渡动画效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值