内容简介:Vue在插入、更新或则移除DOM时,提供多种不同方式的应用过渡效果。包括以下工具:在这里,我们只会讲到进入、离开和列表的过渡。
概述
Vue在插入、更新或则移除DOM时,提供多种不同方式的应用过渡效果。
包括以下工具:
*在CSS过渡和动画中自动应用class *可以配合第三方CSS动画库,如Animate.css *在过渡钩子函数中使用Javascript直接操作DOM *可以配合使用第三方Javascript动画库,如Velocity.js
在这里,我们只会讲到进入、离开和列表的过渡。
单元素/组件的过渡
Vue提供了transition的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡。
*条件渲染(使用v-if) *条件展示(使用v-show) *动态组件 *组件根节点
这里是一个典型的例子:
<div id="demo">
<button v-on:click="show=!show">
Toggle
</button>
<transition name="fade">
<p v-if="show">hello</p>
</transition>
</div>
new Vue({
el:'#demo',
data:{
show:true
}
})
//css
.fade-enter-active,.fade-leave-active{
transition:opacity .5s;
}
.fade-enter,.fade-leave-to{
opacity:0;
}
当插入或删除包含在transition组件中的元素时,Vue将会做以下处理:
1.自动嗅探目标元素是否应用了CSS过渡或动画,如果是,在恰当的时机添加/删除CSS类名。 2.如果过渡组件提供了Javascript钩子函数,这些钩子函数将在恰当的时机被调用。 3.如果没有找到JavaScript钩子并且也没有检测到CSS过渡/动画,DOM操作(插入/删除)在下一帧中立即执行。(注意:此指浏览器逐帧动画机制,和Vue的nextTick概念不同)
过渡的类名
在进入/离开的过渡中,会有6个class切换。
1.v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后下一帧移除。 2.v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。 3.v-enter-to:2.1.8版及以上定义进入过渡的结束状态。在元素被插入之后下一帧生效(与此同时v-enter被移除),在过渡/动画完成之后移除。 4.v-leave:定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧移除。 5.v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。 6.v-leave-to:2.1.8版本及以上定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效(与此同时v-leave被删除),在过渡/动画完成之后移除。
对于这些在过渡中切换的类名来说,如果你使用一个没有名字的<transition>,则v-是这些类名的默认前缀。如果你使用了<transition name="my-transition">,那么v-enter会替换为my-transition-enter。
v-enter-active和v-leave-active可以控制进入/离开过渡的不同的缓和曲线。
CSS过渡
常用的过渡都是使用CSS过渡。
下面是一个简单的例子:
<div id="example-1">
<button @click="show=!show">
Toggle render
<button>
<transition name="slide-fade">
<p v-if="show">hello</p>
</transition>
</div>
new Vue({
el:'#example-1',
data:{
show:true
}
})
/*可以设置不同的进入和离开动画*/
/*设置持续时间和动画函数*/
.slide-fade-enter-active{
transition:all .3s ease;
}
.slide-fade-leave-active{
transition:all .8s cubic-bezier(1.0,0.5,0.8,1.0);
}
.slide-fade-enter,.slide-fade-leave-to{
transform:translateX(10px);
opacity:0;
}
CSS动画
CSS动画用法同CSS过渡,区别是在动画中v-enter类名在节点插入DOM后不会立即删除,而是在animationend事件触发时删除。
<div id="example-2">
<button @click="show=!show">Toggle show</button>
<transition name="bounce">
<p v-if="show">Lorem ipsum dolor sit amet,consectetur adipiscing elit.Mauris facilisis enim libero, at lacinia diam fermentum id. Pellentesque habitant morbi tristique senectus et netus.</p>
</transition>
</div>
new Vue({
el:'#example-2',
data:{
show:true
}
})
.bounce-enter-active{
animation:bounce-in .5s;
}
.bounce-leave-active{
animation:bounce-in .5s reverse;
}
@keyframes bounce-in{
0%{
transform:scale(0);
}
50%{
transition:scale(1.5);
}
100%{
transition:scale(1);
}
}
自定义过渡的类名
我们可以通过以下特性来自定义过渡类名:
*enter-calss *enter-active-class *enter-to-class *leave-class *leave-active-class *leave-to-class
它们的优先级高于普通的类名,这对于Vue的过渡系统和其他第三方CSS动画库,如Animate.css结合使用十分有用。
示例:
<link href="https://cdn.jsdelivr.net/npm/animate.css@3.5.1" rel="stylesheet" type="text/css">
<div id="example-3">
<button @click="show = !show">
Toggle render
</button>
<transition
name="custom-classes-transition"
enter-active-class="animated tada"
leave-active-class="animated bounceOutRight"
>
<p v-if="show">hello</p>
</transition>
</div>
new Vue({
el: '#example-3',
data: {
show: true
}
})
同时使用过渡和动画
Vue为了知道过渡的完成,必须设置相应的事件监听器。它可以是transitionend或animationend,这取决于给元素应用的CSS规则。如果你使用其中任何一种,Vue能自动识别类型并设置监听。
但是,在一些场景中,你需要给同一个元素同时设置两种过渡动效,比如animation很快的被触发并完成了,而transition效果还没结束。在这种情况中,你就需要使用type特性并设置animation或transition来明确声明你需要Vue监听的类型。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 大数据破题“过度医疗”
- android 过度绘制
- 她说:程序员离开电脑就是 “废物” !
- 手机管家(Android)UI过度渲染自动化测试方案
- 程序员的大恩人永远地离开了
- c# – WPF / Silverlight程序员:MVVM是否过度杀伤?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First Design Patterns
Elisabeth Freeman、Eric Freeman、Bert Bates、Kathy Sierra、Elisabeth Robson / O'Reilly Media / 2004-11-1 / USD 49.99
You're not alone. At any given moment, somewhere in the world someone struggles with the same software design problems you have. You know you don't want to reinvent the wheel (or worse, a flat tire),......一起来看看 《Head First Design Patterns》 这本书的介绍吧!