1. 前言
今天的分享是基于 TodoList
已有功能,在添加 todo
和删除 todo
时的样式上增加动画效果的优化。
2. 动态效果图
先来看下优化后的动态效果图,优化代码中选择的是上下模式的匀速淡入淡出,当然你也可以选择左右模式或其他炫酷的动画效果模式。http://mpvideo.qpic.cn/0bc3seabkaaaa4aelaudczrvbeodcwiqafia.f10002.mp4?
3. 动画核心代码
(1). MyList.vue组件
<template> | |
<ul class="todo-main"> | |
<transition-group name="todo" appear> | |
<MyItem | |
v-for="todoObj in todos" | |
:key="todoObj.id" | |
:todo="todoObj" | |
/> | |
</transition-group> | |
</ul> | |
</template> | |
<script> | |
import MyItem from "./MyItem" | |
export default { | |
name:'MyList', | |
components:{MyItem}, | |
//声明接收App传递过来的数据 | |
props:['todos'] | |
} | |
</script> | |
<style scoped> | |
.todo-main { | |
margin-left: 0px; | |
border: 1px solid #dddddd; | |
border-radius: 2px; | |
padding: 0px; | |
} | |
.todo-empty { | |
height: 40px; | |
line-height: 40px; | |
border: 1px solid #dddddd; | |
border-radius: 2px; | |
padding-left: 5px; | |
margin-top: 10px; | |
} | |
.todo-enter-active{ | |
animation: todo 0.5s linear; | |
} | |
.todo-leave-active{ | |
animation: todo 0.5s linear; | |
} | |
@keyframes todo { | |
from{ | |
transform: translateY(-100%); | |
} | |
to{ | |
transform: translateY(0px); | |
} | |
} | |
</style> |
(2). 动画核心代码
<template> | |
<transition-group name="todo" appear> | |
<MyItem | |
v-for="todoObj in todos" | |
:key="todoObj.id" | |
:todo="todoObj" | |
/> | |
</transition-group> | |
</template> | |
<style> | |
.todo-enter-active{ | |
animation: todo 0.5s linear; | |
} | |
.todo-leave-active{ | |
animation: todo 0.5s linear; | |
} | |
@keyframes todo { | |
from{ | |
transform: translateY(-100%); | |
} | |
to{ | |
transform: translateY(0px); | |
} | |
} | |
</style> |
PS:
这里用到的标签是transition-group
而不是transition
,是因为 MyList
组件需要循环遍历 MyItem
组件中的每一条 item 进行渲染,最终是一个组而不是单条 item 数据。
4. 动画属性说明
(1).transition-group
标签属性name="todo"
是和Scope
样式相对应的
如果在transition-group
标签里没有添加name
属性,则Scope
中默认样式名称为v-enter-active
或v-leave-active
(2).Scope
中样式里动画名称需与keyframes
的名称保持一致
(3).transition-group
标签里的属性appear
其实是:appear="true"
的简写形式,作用是当页面一加载时就有动画效果。
5. 小结
不论静态或是动态的样式,很多时候都不需要自己手动实现,不仅耗时可能还做不出满意的效果。
建议参考第三方集成好的样式库,下载引入就能用,这里分享一个好用的样式库:animate.css (https://animate.style/)
简单介绍下用法,感兴趣的小伙伴可以自行探索更多样式!
<template> | |
<div> | |
<transition-group | |
name="animate_animated animate_bounce" | |
enter-active-class="animate_swing" | |
leave-active-class="animate_backOutUp" | |
appear> | |
<h1>Hello World!</h1> | |
</transition-group> | |
</div> | |
</template> | |
<script> | |
import 'animate.css' | |
export default { | |
name:'Style', | |
data(){ | |
return { | |
a:0 | |
} | |
} | |
} | |
</script> |
Step1. 下载
使用命令npm install animate.css
下载
Step2. 引入
Script
标签中使用命令import 'animate.css'
引入
Step3. 使用
参见上述代码块中transition-group
标签属性name,enter-active-class,leave-active-class