CSS动画-transition/animation

HTML系列:
CSS系列:
00、CSS动画
CSS系列:
CSS 动画就是由一种状态(CSS样式),过渡到另一中状态(CSS样式)的动态过程,CSS中提供了两种动画实现方式:transition、animation。
| 对比 | transition动画 | animation动画 |
|---|---|---|
| 定义 | 基于CSS属性变化的简单过渡动画 | 基于关键帧@keyframes实现更复杂的动画 |
| 复用 | 只能执行一次,不可重复执行,复用不便 | 可多次执行,复用方便 |
| 执行方式 | 页面加载不会默认执行,须触发执行 | 可直接执行、可控制 |
| 动画事件 | 无,只能预估动画时间,用定时器setTimeout模拟 |
支持监听事件,如动画开始、结束 |
| 动画帧 | 只有初始帧(当前样式)、结束帧(触发动画时的样式) | 支持任意多帧动画设置 |
| 五星好评 | 灵活简单 | 功能丰富 |
01、transition过渡动画
1.1、transition动画
transition 过渡动画是针对CSS样式的变化,进行过渡,如width、opacity、color改变的过渡,可以实现CSS样式的平滑动态过渡动画效果。
transition动画本身并不会主动执行,须通过其他方式触发,动画属性变化才会触发执行。常用一些伪类触发::hover、:focus、:active(鼠标按下激活)、:target(锚点元素id)、:checked,或者JS控制CSS样式来触发动画执行。
| transition过渡 | 描述 | 示例 |
|---|---|---|
| transition | 过渡动画的简写属性,包括下面这些小弟 | (transition /trænˈzɪʃ(ə)n/ 过渡) |
| transition-property | 指定过渡动画的CSS属性名,多个,分割,默认all都生效 |
transition-property: width; |
| transition-duration | 动画时长,默认0,单位s、ms,*必备 | transition-duration: 1s; |
| transition-delay | 动画延时时长,延时执行动画 | transition-delay: 1s; |
| *-timing-function | 指定过渡动画执行缓动曲线函数,详见后面animation章节 |
transition-timing-function: linear; |
简写属性:transiton: property duration timing-function delay
当transition-property指定的属性值变化时,就会触发动画执行,且只对该属性执行过渡动画,设置all则任意属性变化都会触发动画执行。

如下示例分析:
- 页面初始加载时并不会触发动画执行。
- 当鼠标移入时,属性
width、background-color值变化,触发了动画执行。 - 当鼠移出时,属性
width、background-color值回到初始状态,再次触发了动画执行。
<div>
<button onclick="active()">动起来</button>
<p class="goodstudy">好好学习</p>
</div>
<style>
.goodstudy {
background-color: #63a9e7;
width: 150px; margin: 40px 0; padding: 8px;
/* 设置动画 页面加载并不会执行 */
transition-property: width,background-color;
transition-duration: 1s;
transition-delay: 0.2s;
transition-timing-function: ease-out;
transition: all 1s ease-out;
}
.goodstudy:hover {
width: 350px;
background-color: red;
}
.active {
transform: rotate(360deg);
background-color: #0cdb39;
transition: all 3s;
}
</style>
<script>
//通过脚本添加CSS类,触发动画执行
const pnode = document.querySelector('.goodstudy');
function active() {
pnode.classList.add('active');
//执行完移除,没有事件只能定时执行移除动作
setTimeout(() => {
console.log('removed');
pnode.classList.remove('active');
}, 3000);
}
</script>
1.2、transform变换
transform 可实现元素的各种图形变换,如缩放、旋转,及3D的变换,(transform /trænsˈfɔːrm/ 变换)。transform 本身并不是动画,不过常用来配合transition来实现各种炫酷的变换动画效果。
| transform变换函数 | 描述 | 示例 |
|---|---|---|
| transform | 元素变换,值支持下面这些函数,可设置多个值 | transform: skew(30deg) rotate(60deg); |
| translate(x, y) | 位移变换,x、y方向的移动,可负数。扩展函数translateX()、translateY(),其他变换函数类似 | transform: translateY(100);( translate /trænzˈleɪt/ 变化、移动) |
| scale(x, y) | 缩放变换,1为100%原始大小 | transform: scaleX(2); |
| rotate(angle) | 旋转,参数单位为角度deg,(rotate /rəʊˈteɪt/ ) |
transform: rotate(30deg); |
| skew(x, y) | 元素倾斜,单位为角度deg( skew /skjuː/ 倾斜) |
transform: skew(-60deg,0); |
| translate3d(x,y,z) | 3D的位置变换,指定x、y、z坐标轴的偏移距离 | transform: translate3d(100px,0,0); |
| scale3d(x,y,z) | 3D的缩放变换,指定x、y、z坐标轴的缩放值 | transform: scale3d(2,1.2,1); |
| rotate3d(x,y,z,angle) | 3D旋转,指定x、y、z坐标轴 | transform: rotateX(180deg); |
| matrix() | 基于X轴和Y轴矩阵变换(/ˈmeɪtrɪks/矩阵) | |
| 其他变换相关属性 | ||
| transform-origin | 元素中心坐标,默认center |
transform-origin: 150px 50px; |
| perspective | 3D变换的透视视角,在父元素上设置 /pərˈspektɪv/ | perspective: 500px; |
3D坐标系的手势图:

<div>
<button onclick="active()">动起来</button>
<p class="goodstudy">好好学习</p>
<p class="ddup">天天向上</p>
</div>
<style>
.ddup{
background-color: #0cdb39;
width: 100px;
height: 100px;
line-height: 100px;
text-align: center;
transition: all 1s ease-out;
transform: skew(-30deg);
}
.ddup:hover{
transform: translateX(-30px); /* transform只有一个生效,被后面的覆盖了*/
transform: rotateX(180deg); /* 围绕x轴3d旋转*/
}
</style>

02、animation帧动画
CSS 动画 animation帧动画,动画的实际CSS样式是由 @keyframes 规则实现的,animation属性负责设置动画的各项运动参数。
2.1、animation
| animation 属性/值 | 描述 | 示例/备注 |
|---|---|---|
| animation | 动画组合简写属性,包括下面这些小弟 | 是有顺序的,支持多组动画,逗号隔开 |
| animation-name | *必填,指定由@keyframes定义的动画序列名称 |
@keyframes animation-name {} |
| animation-duration | *必填,动画时长,单位s、ms | animation-duration: 2.5s |
| animation-iteration-count | 动画循环次数(1),infinite无限循环(/ˈɪnfɪnət/无限) |
animation-iteration-count: 3; |
| animation-timing-function | 设置动画速度变化函数,提供了函数、预置函数关键字 | animation-timing-function: linear; |
| linear、ease、... | 预置的函数关键字定义,默认ease | |
| cubic-bezier() | 三次贝塞尔曲线函数,参数为两个坐标点,在线工具 | cubic-bezier(x1, y1, x2, y2) |
| animation-fill-mode | 动画执行元素样式应用方式,默认none,动画执行完成后恢复到原来的样式。animation-fill-mode: forwards; |
● forwards:动画后保留最后一帧的样式 ● backwards:立刻应用第一帧样式,包括 animation-delay延迟时间生效● both:forwards+backwards,全都要! |
| animation-delay | 动画延时时长,默认0s立即执行,可为负数 |
animation-delay: 2s; |
| animation-direction | 播放方向方式,默认normal。animation-iteration-count多次执行时可以使用交替运行alternate |
● alternate:动画交替反向运行,结合多次 ● reverse:反向播放动画 ● alternate-reverse:反向交替运行 |
| animation-play-state | 动画运行状态,running、paused,可用来控制动画 | animation-play-state: paused; |
简写属性:animation: name duration timing-function delay iteration-count direction fill-mode play-state
<div class="div-abox">
断肠人在天涯
</div>
<style>
.div-abox {
padding: 4px;
width: 150px;
background-color: red;
animation-delay: 1s;
animation-duration: 1s;
animation-name: box-line-ani;
animation-direction: alternate; /*动画交替反向运行*/
animation-iteration-count: infinite; /*无限重复*/
animation-fill-mode: both;
animation-timing-function: cubic-bezier(.4, .52, .93, .4);
/*animation 简写属性*/
animation: box-line-ani 1.5s alternate 4 cubic-bezier(.4, .52, .93, .4) both;
}
.div-abox:hover { /* 鼠标悬浮时运动加速 */
animation-duration: 0.5s;
}
@keyframes box-line-ani {
0% {
background-color: white;
width: 150px;
}
40% { width: 250px; }
100% {
background-color: #63a9e7;
width: 400px;
}
}
</style>

2.2、@keyframes关键帧
animation 属性定义动画各项运动参数,实际的动画执行的CSS属性通过@keyframes来定义,使用@keyframes建立两个或两个以上关键帧来实现动画帧的样式定义。
@keyframes animationname { keyframes-selector { css-styles; } }
- 定一个关键帧动画组,并命名:
@keyframes animation-name {} - 用百分比
%来定动画帧:0%表示开始第一帧样式,可以用别名from代替。100%表示最后一帧样式,可以用别名to代替。- 中间可以加其他
%*关键帧。
- 每一帧里定义需要执行动画变换的CSS样式。
@keyframes animation-name {
0% {
background-color: white;
width: 150px;
}
40% { width: 250px; }
100% {
background-color: #63a9e7;
width: 400px;
}
}
2.3、animation-timing-function动画缓动曲线
animation-timing-function 用来定义动画执行过程的缓动速度,内置了几个常用的函数定义关键字,及两个关键函数。同transition 动画中的缓动速度属性 transition-timing-function 是一样的,同母异父的亲兄妹。
- 三次贝塞尔曲线缓动函数:
cubic-bezier(x1, y1, x2, y2)(cubic /ˈkjuːbɪk/ 立方),参数其实是两个坐标点,可以通过在线贝塞尔可视化工具编辑和测试。用来实现动画过程中速度变化曲线的控制,以实现更自然的动画效果。内置的linear、ease等都是基于贝塞尔曲线函数的。 - 步骤缓动函数:
steps(),把@keyframes定义的动画帧划分为多段执行,多用来实现图片的逐帧动画效果。
| animation-timing-function | 描述 | 示例/补充 |
|---|---|---|
| cubic-bezier(x1, y1, x2, y2) | 三次贝塞尔曲线函数,参数为两个坐标点,在线工具 | cubic-bezier(x1, y1, x2, y2) |
| linear | 匀速,= cubic-bezier(0.0, 0.0, 1.0, 1.0) |
animation-timing-function: linear; |
| ease | 默认值:低速开始,中间加速,然后低速收尾 | (ease /iːz/ 容易,减轻) |
| ease-in | 低速开始 | |
| ease-out | 低速结束 | |
| ease-in-out | 低速开始,低速结束 | |
steps( n, <jumpterm>) |
分阶段缓动函数,参数为步数和变化点。可实现时钟指针动画 | animation-timing-function:steps(6); |

2.4、动画事件
用于监听动画的开始、循环、结束的动画事件 AnimationEvent
| 事件 | 描述 |
|---|---|
| animationstart | 动画开始 |
| animationend | 动画完成 |
| animationiteration | 动画循环 |
<script>
const node = document.querySelector('.div-abox');
node.addEventListener('animationend', (e) => {
console.log(e.animationName, e.type, e.elapsedTime);
//box-line-ani animationend 1
})
</script>
参考资料
️版权申明:版权所有@安木夕,本文内容仅供学习,欢迎指正、交流,转载请注明出处!原文编辑地址-语雀
CSS动画-transition/animation的更多相关文章
- CSS动画:animation、transition、transform、translate
https://blog.csdn.net/px01ih8/article/details/80780470 一.区分容易混淆的几个属性和值 先区分一下css中的几个属性:animation(动画). ...
- css动画(transition/transform/animation)
在开发中,一个好的用户操作界面,总会夹杂着一些动画.css用对少的代码,来给用户最佳的体验感,下面我总结了一些css动画属性的使用方法及用例代码供大家参考,在不对的地方,希望大佬直接拍砖评论. 1 t ...
- css3动画transition animation
CSS动画简介 transition animation transition过渡:css3通过transitions属性引入时间概念,通过开始.结束状态自动计算中间状态,实现状态改变的过渡效果 ...
- 前端深入之css篇丨2020年前,彻底掌握css动画【animation】
写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...
- css动画——transition和animation
http://www.ruanyifeng.com/blog/2014/02/css_transition_and_animation.html 第一部分:CSS Transition 在CSS 3引 ...
- css 动画 transition和animation
本文参考:http://www.ruanyifeng.com/blog/2014/02/css_transition_and_animation.html 1. transition基本用法: < ...
- CSS Transform / Transition / Animation 属性的区别
back21 Jun 2011 Category: tech Tags: css 最近想UI的动画转到css3能吃进3d加速的属性上面来以加强动画的连贯性.只是对于css几个新加的属性不太熟悉,常常容 ...
- css动画 transition
比如输入框触交渐变 在原来的属性添加 : .form-control{-webkit-transition: all .3s; transition: all .3s;} .form-control: ...
- css 动画 transform transition animation
1.transform transform 是通过在浏览器里面让网页元素 移动 旋转 透明 模糊 等方法来实现改变其外观的技术 -webkit-transform : translate(3em,0 ...
随机推荐
- Hive存储格式之ORC File详解,什么是ORC File
目录 概述 文件存储结构 Stripe Index Data Row Data Stripe Footer 两个补充名词 Row Group Stream File Footer 条纹信息 列统计 元 ...
- gcd(数论)
题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对? 输入 一个整数 1<=N<=1000000 输出 一个整数 样例输入 4 样例输出 ...
- 「题解报告」 P3167 [CQOI2014]通配符匹配
「题解报告」 P3167 [CQOI2014]通配符匹配 思路 *和?显然无法直接匹配,但是可以发现「通配符个数不超过 \(10\) 」,那么我们可以考虑分段匹配. 我们首先把原字符串分成多个以一个通 ...
- 一 策略模式 来自CBF4LIFE 的设计模式
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的. 先说这个场景中 ...
- 分布式协同AI基准测试项目Ianvs:工业场景提升5倍研发效率
摘要:全场景可扩展的分布式协同AI基准测试项目 Ianvs(雅努斯),能为算法及服务开发者提供全面开发套件支持,以研发.衡量和优化分布式协同AI系统. 本文分享自华为云社区<KubeEdge|分 ...
- AtCoder Beginner Contest 254(D-E)
Tasks - AtCoder Beginner Contest 254 D - Together Square 题意: 给定一个N,找出所有不超过N的 ( i , j ),使得( i * j )是一 ...
- 解决报错:axios is not defined
好家伙,来解决报错:axios is not defined 写前端嘛,修bug,不寒颤 进入页面一片空白 来看看报错: 1.axios在安装时:npm install axios --save-de ...
- js函数( 普通函数、箭头函数 ) 内部this的指向
- 普通函数 | 具名普通函数.匿名普通函数,在不作为对象的属性值的情况下,其内部的 this 总是指向代码运行环境下的全局对象 ( 例如,浏览器中的 window ). 示例: (functio ...
- Shell第四章《正则表达式》
一.前言 1.1.名词解释 正则表达式(regular expression, RE)是一种字符模式,用于在查找过程中匹配指定的字符.在大多数程序里,正则表达式都被置于两个正斜杠之间:例如/l[oO] ...
- RTSP播放器或RTMP播放器常用的Evnet事件回调设计
很多开发者在开发RTSP或RTMP播放器的时候,不晓得哪些event回调事件是有意义的,针对此,我们以大牛直播SDK(github)的Android平台RTSP/RTMP直播播放端为例,简单介绍下常用 ...