过渡、动画

当元素在更新、插入、删除时添加不同的效果,这个效果有两部分:“过渡”和“动画”。vue本身是没有动画的,它引入的是css3中的过渡与动画。

过渡与动画

过渡:就是指元素从一种状态逐渐变为另一种的效果。使用过渡时,我们要指定添加效果的css属性和效果的持续时间。过渡的作用是使得效果在变化时更平滑。过渡是vue自带的特效。
动画:过渡只能设置起始状态的变化,而“动画”除了起始,能设置更多状态。比如说用百分比指定变化时间,0%是动画开始,100%是动画结束。使用动画时,要指定动画的名称和总作用时间

进入.png

离开.png

单个元素的过渡

1.vue 有内置的过渡组件<transition>,该组件用于包裹要实现过渡效果的元素或组件;
2.<transition>可以在条件渲染 ( v-if )、条件展示 ( v-show )上使用,也可以在动态组件、组件根节点上使用;
3.<transition>并不是添加以后就可以起作用了,它的本质是对元素添加了css过渡。要在样式里设定过渡使用的效果;
4.样式选择器的前缀是可以设置的,通过<transition>的name属性自定义,如果不设置,那么选择器就是默认的前缀“v-”。

举个栗子:


v-enter.png

1、 .fade-enter为元素进入过渡时添加的效果,fade就是前缀,和组件的name属性要一致;
2、Vue在元素显示与隐藏的过渡中,提供了 6 个 class 来切换:

  • v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除;
  • v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数;
  • v-enter-to: 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除;
  • v-leave: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除;
  • v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数;
  • v-leave-to:定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。

单个元素的动画

1、使用动画的方法和过渡的一样,利用<transition>组件给元素或组件添加对应的样式;
2、使用@keyframes规则创建动画,这个规则用于指定元素从原来的样式变为新样式:

  • 把@keyframes 绑定到选择器上,不然就没有动画效果;
  • 在选择器内规定动画的名称和时长(默认时长为“0”);
  • 在@keyframes 内设置具体的效果。
    举个栗子:
<style>
    .fade-enter-active{
        animation:fade-in 1s;
    }
    .fade-leave-active{
        animation:fade-in 1s reverse;
    }
    @keyframes fade-in{
        0%{
            transform:scale(0);
        }
        50%{
            transform:scale(1.5);
        }
        100%{
            transform:scale(1);
        }
    }
</style>
<body>
    <div id="demo">
        <transition name="fade">
            <p v-if="show">欢迎来到极乐世界</p>
        </transition>
        <button @click="show=!show">动画</button>
    </div>
    <script>
        new Vue({
            el:"#demo",
            data:{
                show:true
            }
        })
    </script>
</body>

多个元素的过渡

利用v-if/v-else

仅适用于不同的元素。举个栗子:

<style>
    .fade-enter-active{
        transition:all 3s ease;
    }
    .fade-leave-active{
        transition:all 1s cubic-bezier(1.0,0.5,0.8,1.0);
    }
    .fade-enter,.fade-leave-to{
        transform: translateX(30px);
        opacity: 0;
    }
    #demo{
        margin-left: 50px;
        margin-top:50px;
    }
</style>
<body>
    <div id="demo">
            <transition name="fade">
                <!--不同的元素-->
                <div v-if="show">欢迎来到极乐世界</div>
                <p v-else>今天适合出去散步</p>
            </transition>
            <button @click="show=!show">请点击我</button>
    </div>
    <script>
        new Vue({
            el:"#demo",
            data:{
                show:true
            }
        })
    </script>
</body>

用key特性标记元素

适用于同一标签元素。key的作用相当于元素id,对vue来说,每个key值是唯一的。举个栗子:

<style>
    .fade-enter-active,.fade-leave-active{
        transition:opacity 1s;
    }
    .fade-enter,.fade-leave-active{
        opacity: 0;
    }
</style>
<body>
    <div id="demo" class="demo">
            <transition name="fade">
                <button v-if="show" key="on" @click="show=false">on</button>
                <button v-else key="off" @click="show=true">off</button>
            </transition>
    </div>
    <script>
        new Vue({
            el:"#demo",
            data:{
                show:true
            }
        })
    </script>
</body>

使用第三方动画库

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>demo</title>
<!--用link来引入第三方动画库-->
<link href="https://cdn.bootcss.com/animate.css/3.5.2/animate.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>
</head>
<body>
    <div id="box">
        <button @click="isShow=!isShow">使用animate</button>
        <!--自定义类名要先添加animated,这个动画库才会生效;
            在transition标签中添加animate属性,用以在组件中添加animate动画-->
        <transition enter-active-class="animated fadeInRightBig" leave-active-class="animated flipOutY">
            <v-tpl v-if="isShow"></v-tpl>
        </transition>
    </div>
    <template id="tpl">
        <ul class="nav-up">
            <li><p>程序媛</p></li>
            <li><p>边城学校</p></li>
            <li><p>欢迎你</p></li>
        </ul>
    </template>
<script type = "text/javascript">
    new Vue({
        el: '#box',
        data: {
            isShow:false
        },
        components:{
            'v-tpl':{
                template:'#tpl'
            }
        },
        mounted(){
            this.isShow=true
        }
});
</script>
</body>
</html>

列表过渡

使用vue中的<transition-group>组件向列表添加过渡或动画。

<transition-group>与<transition>
  • <transition-group>被渲染的内部元素要使用唯一的key属性值;
  • 当元素被渲染到网页上后,<transition>不会呈现出来,只在对应状态下添加对应的类名;而<transition-group>则会以真实的元素呈现,默认情况是<span>。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容