Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)


Posted in Javascript onFebruary 05, 2020

以一个toggle按钮控制p元素显隐为例,如果不使用过渡效果,则如下所示

<div id="demo">
 <button v-on:click="show = !show">Toggle</button>
 <p v-if="show">蓝色理想</p>
</div>
<script>
new Vue({
 el: '#demo',
 data: {
  show: true
 }
})
</script>

如果要为此加入过渡效果,则需要使用过渡组件transition 

过渡组件

Vue提供了transition的封装组件,下面代码中,该过渡组件的名称为'fade'

<transition name="fade">
  <p v-if="show">蓝色理想</p>
 </transition>

当插入或删除包含在transition组件中的元素时,Vue会自动嗅探目标元素是否应用了 CSS 过渡或动画,如果是,在恰当的时机添加/删除 CSS 类名 

过渡类名

总共有6个(CSS)类名在enter/leave的过渡中切换

v-enter

定义进入过渡的开始状态。在元素被插入时生效,在下一个帧移除

v-enter-active

定义过渡的状态。在元素整个过渡过程中作用,在元素被插入时生效,在 transition 或 animation 完成之后移除。 这个类可以被用来定义过渡的过程时间,延迟和曲线函数

v-enter-to

定义进入过渡的结束状态。在元素被插入一帧后生效(与此同时 v-enter 被删除),在  transition 或 animation 完成之后移除

v-leave

定义离开过渡的开始状态。在离开过渡被触发时生效,在下一个帧移除

v-leave-active

定义过渡的状态。在元素整个过渡过程中作用,在离开过渡被触发后立即生效,在 transition 或 animation 完成之后移除。 这个类可以被用来定义过渡的过程时间,延迟和曲线函数

v-leave-to

定义离开过渡的结束状态。在离开过渡被触发一帧后生效(与此同时 v-leave 被删除),在 transition 或 animation 完成之后移除

对于这些在 enter/leave 过渡中切换的类名,v- 是这些类名的前缀,表示过渡组件的名称。比如,如果使用 <transition name="my-transition"> ,则 v-enter替换为 my-transition-enter

transition

常用的Vue过渡效果都是使用CSS过渡transition,下面增加一个enter时透明度变化,leave时位移变化的效果

<style>
.fade-enter{
 opacity:0;
}
.fade-enter-active{
 transition:opacity .5s;
}
.fade-leave-active{
 transition:transform .5s;
}
.fade-leave-to{
 transform:translateX(10px);
}
</style>
<div id="demo">
 <button v-on:click="show = !show">Toggle</button>  
 <transition name="fade">
  <p v-if="show">蓝色理想</p>
 </transition>
</div>
<script>
new Vue({
 el: '#demo',
 data: {
  show: true
 }
})
</script>

animation

CSS动画animation用法同CSS过渡transition,区别是在动画中 v-enter 类名在节点插入 DOM 后不会立即删除,而是在 animationend 事件触发时删除

下面例子中,在元素enter和leave时都增加缩放scale效果

<style>
.bounce-enter-active{
 animation:bounce-in .5s;
}
.bounce-leave-active{
 animation:bounce-in .5s reverse;
}
@keyframes bounce-in{
 0%{transform:scale(0);}
 50%{transform:scale(1.5);}
 100%{transform:scale(1);}
}
</style>
<div id="demo">
 <button v-on:click="show = !show">Toggle</button>  
 <transition name="bounce">
  <p v-if="show">蓝色理想</p>
 </transition>
</div>
<script>
new Vue({
 el: '#demo',
 data: {
  show: true
 }
})
</script>

同时使用

Vue 为了知道过渡的完成,必须设置相应的事件监听器。它可以是 transitionend 或 animationend ,这取决于给元素应用的 CSS 规则。如果使用其中任何一种,Vue 能自动识别类型并设置监听。

但是,在一些场景中,需要给同一个元素同时设置两种过渡动效,比如 animation 很快的被触发并完成了,而 transition 效果还没结束。在这种情况中,就需要使用 type 特性并设置 animation 或 transition 来明确声明需要 Vue 监听的类型

<style>
.fade-enter,.fade-leave-to{
 opacity:0;
}
.fade-enter-active,.fade-leave-active{
 transition:opacity 1s;
 animation:bounce-in 5s;
}
@keyframes bounce-in{
 0%{transform:scale(0);}
 50%{transform:scale(1.5);}
 100%{transform:scale(1);}
}
</style>
<div id="demo">
 <button v-on:click="show = !show">Toggle</button>  
 <transition name="fade" type="transition">
  <p v-if="show">蓝色理想</p>
 </transition>
</div>
<script>
new Vue({
 el: '#demo',
 data: {
  show: true,
 },
})
</script>

自定义类名

可以通过以下特性来自定义过渡类名

enter-class

enter-active-class

enter-to-class 

leave-class

leave-active-class

leave-to-class 

自定义类名的优先级高于普通的类名,这对于Vue的过渡系统和其他第三方CSS动画库,如 Animate.css 结合使用十分有用

<link rel="stylesheet" href="https://unpkg.com/animate.css@3.5.2/animate.min.css" rel="external nofollow" >
<div id="example">
 <button @click="show = !show">
  Toggle render
 </button>
 <transition name="xxx" enter-active-class="animated tada" leave-active-class="animated bounceOutRight">
  <p v-if="show">蓝色理想</p>
 </transition>
</div>
<script src="https://www.3water.com/vue"></script>
<script>
new Vue({
 el: '#example',
 data: {
  show: true
 }
})
</script>

初始渲染过渡

可以通过 appear 特性设置节点的在初始渲染的过渡

<transition appear>
 <!-- ... -->
</transition>

这里默认和进入和离开过渡一样,同样也可以自定义 CSS 类名

<transition
 appear
 appear-class="custom-appear-class"
 appear-to-class="custom-appear-to-class" 
 appear-active-class="custom-appear-active-class"
>
 <!-- ... -->
</transition>

下面是一个例子

<style>
.custom-appear-class{
 opacity:0;
 background-color:pink;
 transform:translateX(100px);
} 
.custom-appear-active-class{
 transition: 2s;
}
</style>
<div id="demo">
 <button @click="reset">还原</button>
 <transition appear  appear-class="custom-appear-class"
 appear-to-class="custom-appear-to-class" 
 appear-active-class="custom-appear-active-class">
  <p>蓝色理想</p>
 </transition>
</div>
<script>
new Vue({
 el: '#demo',
 methods:{
  reset(){
   history.go();
  }
 }
})
</script>

过渡时间

在很多情况下,Vue可以自动得出过渡效果的完成时机。默认情况下,Vue会等待其在过渡效果的根元素的第一个 transitionend 或 animationend 事件。然而也可以不这样设定——比如,可以拥有一个精心编排的一序列过渡效果,其中一些嵌套的内部元素相比于过渡效果的根元素有延迟的或更长的过渡效果

在这种情况下可以用<transition>组件上的duration属性定制一个显性的过渡效果持续时间 (以毫秒计)

下面的代码意味着元素在进入enter和离开leave时,持续时间都为1s,而无论在样式中它们的设置值为多少

<transition :duration="1000">...</transition>

也可以分别定制进入和移出的持续时间

<transition :duration="{ enter: 500, leave: 800 }">...</transition>

比如,下面的代码中,进入和移出的效果都为animate.css里面的shake效果,但持续时间分别是0.5s和1s

<div id="demo">
 <button v-on:click="show = !show">Toggle</button>  
 <transition :duration="{ enter: 500, leave: 1000 }" name="xxx" enter-active-class="animated shake" leave-active-class="animated shake">
  <p v-if="show">小火柴的蓝色理想</p>
 </transition>
</div>
<script>
new Vue({
 el: '#demo',
 data: {
  show: true
 }
})
</script>

过渡条件

一般地,在Vue中满足下列任意一个过渡条件,即可添加过渡效果

条件渲染(使用v-if)

常见的条件是使用条件渲染,使用v-if

<style>
.fade-enter,.fade-leave-to{
 opacity:0;
}
.fade-enter-active,.fade-leave-active{
 transition:opacity 1s;
}
</style>
<div id="demo">
 <button v-on:click="show = !show">Toggle</button>  
 <transition name="fade">
  <p v-if="show">蓝色理想</p>
 </transition>
</div>
<script>
new Vue({
 el: '#demo',
 data: {
  show: true
 }
})
</script>

条件展示(使用v-show)

使用条件展示,即使用v-show时,也可以添加过渡效果

<div id="demo">
 <button v-on:click="show = !show">Toggle</button>  
 <transition name="fade">
  <p v-show="show">蓝色理想</p>
 </transition>
</div>

动态组件

使用is属性实现的动态组件,可以添加过渡效果

<div id="demo">
 <button v-on:click="show = !show">Toggle</button>  
 <transition name="fade">
  <component :is="view"></component>
 </transition>
</div>
<script>
new Vue({
 el: '#demo',
 components:{
  'home':{template:'<div>蓝色理想</div>'}
 },
 data: {
  show: true,
 },
 computed:{
  view(){
   return this.show ? 'home' : '';
  }
 }
})

更多关于Vue动画效果的文章请点击下面的相关链接

Javascript 相关文章推荐
AJAX 网页保留浏览器前进后退等功能
Feb 12 Javascript
jQuery EasyUI API 中文文档 - Pagination分页
Sep 29 Javascript
如何获取JQUERY AJAX返回的JSON结果集实现代码
Dec 10 Javascript
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
Apr 15 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
Jan 15 Javascript
Bootstrap每天必学之级联下拉菜单
Mar 27 Javascript
通过sails和阿里大于实现短信验证
Jan 04 Javascript
微信小程序 地图map实例详解
Jun 07 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
Feb 21 Javascript
详解关于html,css,js三者的加载顺序问题
Apr 10 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
May 26 Javascript
公众号SVG动画交互实战代码
May 31 Javascript
vue 翻页组件vue-flip-page效果
Feb 05 #Javascript
在博客园博文中添加自定义右键菜单的方法详解
Feb 05 #Javascript
Vue中多元素过渡特效的解决方案
Feb 05 #Javascript
Vue路由管理器Vue-router的使用方法详解
Feb 05 #Javascript
Vue的状态管理vuex使用方法详解
Feb 05 #Javascript
浅谈Vue组件单元测试究竟测试什么
Feb 05 #Javascript
VUE中使用HTTP库Axios方法详解
Feb 05 #Javascript
You might like
linux php mysql数据库备份实现代码
2009/03/10 PHP
thinkPHP5.0框架模块设计详解
2017/03/18 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
IE中jscript/javascript的条件编译
2006/09/07 Javascript
12个非常有创意的JavaScript小游戏
2010/03/18 Javascript
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
2012/03/21 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
jQuery页面加载初始化的3种方法(推荐)
2016/06/02 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
JavaScript实现Java中Map容器的方法
2016/10/09 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
bootstrap multiselect下拉列表功能
2017/08/22 Javascript
Vue按需加载的具体实现
2017/12/02 Javascript
详解如何优雅地在React项目中使用Redux
2017/12/28 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
微信小程序class封装http代码实例
2019/08/24 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
javascript实现弹幕墙效果
2019/11/28 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
Python实现购物系统(示例讲解)
2017/09/13 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
tensorflow实现逻辑回归模型
2018/09/08 Python
使用Python进行目录的对比方法
2018/11/01 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
HTML 5.1来了 9月份正式发布 更新内容预览
2016/04/26 HTML / CSS
自我评价200字分享
2013/12/17 职场文书
外企办公室竞聘演讲稿
2013/12/29 职场文书
竞选班长演讲稿500字
2014/08/22 职场文书
计划生育责任书
2015/05/09 职场文书
2015团员个人年度总结
2015/11/24 职场文书