vue-animation(第三天)

vue过渡动画

1.如何给Vue控制的元素添加过渡动画
1.1将需要执行动画的元素放到transition组件中
1.2当transition组件中的元素显示时会自动查找.v-enter/.v-enter-active/.v-enter-to类名;当transition组件中的元素隐藏时会自动查找.v-leave/.v-leave-active/.v-leave-to类名
1.3我们只需要在.v-enter.v-leave-to中指定动画动画开始的状态,在.v-enter-active.v-leave-active中指定动画执行的状态, 即可完成过渡动画

通过按钮实现动态显示和隐藏元素实例
代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue-animation</title>
    <script src="vue.js"></script>
<style>
   .box{
       width: 200px;
       height: 200px;
       background: #ff9900;
   }
    .v-enter{
        opacity: 0;
    }
    .v-enter-active{
        transition: all 3s;
    }
    .v-enter-to{
        opacity: 1;
    }
    .v-leave{
        opacity: 1;
    }
    .v-leave-active{
        transition: all 3s;
    }
    .v-leave-to{
        opacity: 0;
    }
</style>
</head>
<body>
<div id="app">
    <button @click="toggle()">按钮</button>
    <transition>
        <div class="box" v-show="isShow"></div>
    </transition>
</div>
<script>
    let vue=new Vue({
        el:"#app",
        data:{
            isShow:false,
            name:"单佳兰"
        },
        methods:{
            toggle(){
                this.isShow=!this.isShow;
            }
        }
    });
</script>
</body>
/html>

transition注意点

1.transition注意点:
transition中只能放一个元素, 多个元素无效
如果想给多个元素添加过渡动画, 那么就必须创建多个transition组件

2.初始动画设置
默认情况下第一次进入的时候没没有动画的
如果想一进来就有动画, 我们可以通过给transition添加appear属性的方式
告诉Vue第一次进入就需要显示动画

3.如何给多个不同的元素指定不同的动画
如果有多个不同的元素需要执行不同的过渡动画,那么我们可以通过给transition指定name的方式
来指定"进入之前/进入之后/进入过程中, 离开之前/离开之后/离开过程中"对应的类名
来实现不同的元素执行不同的过渡动画

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue-animation</title>
    <script src="vue.js"></script>
<style>
   .box{
       width: 200px;
       height: 200px;
       background: #ff9900;
   }
    .one-enter{
        opacity: 0;
    }
    .one-enter-active{
        transition: all 3s;
    }
    .one-enter-to{
        opacity: 1;
    }
    .two-enter{
        opacity: 0;
    }
    .two-enter-active{
        transition: all 3s;
    }
    .two-enter-to{
        opacity: 1;
    }
</style>
</head>
<body>
<div id="app">
    <button @click="toggle()">按钮</button>
    <transition name="one" appear>
        <div class="box" v-show="isShow"></div>
    </transition>
    <transition name="two" appear>
        <div class="box" v-show="isShow"></div>
    </transition>
</div>
<script>
    let vue=new Vue({
        el:"#app",
        data:{
            isShow:true,
            name:"单佳兰"
        },
        methods:{
            toggle(){
                this.isShow=!this.isShow;
            }
        }
    });
</script>
</body>
</html>

执行完过渡动画元素会复位,本质就是绑定的v-leave……等类名不会被绑定;

解决方案:Vue钩子函数实现
1.上面过渡存在的问题
通过transition+类名的方式确实能够实现过渡效果
但是实现的过渡效果并不能保存动画之后的状态
因为Vue内部的实现是在过程中动态绑定类名, 过程完成之后删除类名,正是因为删除了类名, 所以不能保存最终的效果

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

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方法中调用

4【注意点】

  • 注意点: 虽然我们是通过JS钩子函数来实现过渡动画
    但是默认Vue还是回去查找类名, 所以为了不让Vue去查找名
    可以给transition添加v-bind:css="false"
  • 注意点: 如果是通过JS钩子来实现过渡动画
    那么必须在动画执行过程中的回调函数中写上
    el.offsetWidth / el.offsetHeight
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
<style>
    *{
        margin: 0;
        padding: 0;
    }
    .box{
        width: 100px;
        height: 100px;
        background: orange;
    }
</style>
</head>
<body>
<div id="app">
    <button @click="toggle">按钮</button>
    <transition appear
                v-bind:css="false"
                v-on:enter="enter"
                v-on:before-enter="beforeEnter"
                v-on:after-enter="afterEnter">
        <div class="box" v-show="isShow"></div>
    </transition>
</div>
<script>
    let vue=new Vue({
        el:"#app",
        data:{
            name:"单佳兰",
            isShow:true
        },
        methods:{
            toggle() {
                this.isShow=!this.isShow;
            },
            beforeEnter(el){
                console.log("beforeEnter");
                el.style.opacity=0;
            },
            enter(el,done){
                el.offsetWidth;
                console.log("Enter");
                el.style.transition="all 3s"
                //只有执行了done()回调函数才会执行afterenter的方法
                setTimeout(
                    function (){
                        done();
                    },0
            )
            },
            afterEnter(el){
                console.log("afterEnter");
                el.style.opacity=1;
            }
        }
    });
</script>
</body>
</html>

1.配合Velocity实现过渡动画
在Vue中我们除了可以自己实现过渡动画以外, 还可以结合第三方框架实现过渡动画

  • 1.1 导入Velocity库
  • 1.2 在动画执行过程钩子函数中编写Velocity动画

【补充】自定义类名动画
在Vue中除了可以使用 默认类名(v-xxx)来指定过渡动画
除了可以使用 自定义类名前缀(yyy-xx)来指定过渡动画(transition name="yyy")
除了可以使用 JS钩子函数来指定过渡动画以外
还可以使用自定义类名的方式来指定过渡动画

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>
    <script src="vue.js"></script>
    <style>
    .box{
    width: 200px;
    height: 200px;
    background: #ff9900;
    }
    .a{
    opacity: 0;
    }
    .b{
    transition: all 3s;
    }
    .c{
    opacity: 1;
    }
    </style>
</head>
<body>
    <div id="app">
        <button @click="toggle">按钮</button>
        <transition enter-class="a"
                    enter-active-class="b"
                    enter-to-class="c">
            <div class="box" v-show="isShow"></div>
        </transition>
    </div>
<script>
    let vue=new Vue({
        el:"#app",
        data:{
            isShow:false,
            name:"单佳兰"
        },
        methods:{
            toggle(){
                this.isShow=!this.isShow;
            }
        }
    });
</script>
</body>
</html>
使用animate.css第三方库来实现动画

1.配合Animate.css实现过渡动画
1.1导入Animate.css库
https://cdn.jsdelivr.net/npm/animate.css@3.5.1
1.2在执行过程中的属性上绑定需要的类名

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
    <style>
    .box{
    width: 200px;
    height: 200px;
    background: #ff9900;
    }
    </style>
    <link href="https://cdn.jsdelivr.net/npm/animate.css@3.5.1" rel="stylesheet" type="text/css">
</head>
<body>
    <div id="app">
        <button @click="toggle">按钮</button>
        <transition appear
                    enter-class=""
                    enter-active-class="animated bounceInRight"
                    enter-to-class="">
            <div class="box" v-show="isShow"></div>
        </transition>
    </div>
<script>
    let vue=new Vue({
        el:"#app",
        data:{
            isShow:true,
            name:"单佳兰"
        },
        methods:{
            toggle(){
                this.isShow=!this.isShow;
            }
        }
    });
</script>
</body>
</html>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • 1.如何给Vue控制的元素添加过渡动画 1.1将需要执行动画的元素放到transition组件中 1.2当tran...
    mainXIAO阅读 335评论 0 0
  • 1.1. Vue 的基本认识 1.1.1. 官网 1)英文官网:https://vuejs.org/ 2)中文官网...
    您的名称已被使用阅读 91评论 0 0
  • # 传智播客vue 学习## 1. 什么是 Vue.js* Vue 开发手机 APP 需要借助于 Weex* Vu...
    再见天才阅读 3,534评论 0 6
  • 这篇文章是接着我的上部vue学习笔记写的,之所以分开写这两篇文章是因为我意识到不知道什么时候就写了非常多的字了,所...
    看物看雾阅读 836评论 0 1
  • 一、什么是Vue.js 1. vue是一种数据驱动的前端框架 this.msg="我爱你",通过改变数据,然后自动...
    在路上919阅读 1,597评论 0 2