前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >animation

animation

作者头像
ayqy贾杰
发布于 2023-03-15 10:49:58
发布于 2023-03-15 10:49:58
1.2K00
代码可运行
举报
文章被收录于专栏:黯羽轻扬黯羽轻扬
运行总次数:0
代码可运行

一.CSS动画

CSS动画相对JS动画有2个主要优势:

1.流畅

因为渲染引擎可以通过跳帧(frame-skipping)及其它技术来确保性能尽量流畅

2.浏览器性能优化

把动画序列交给浏览器去控制,这样浏览器就能优化性能和效率,比如对于看不见的tab,可以减少刷新频率

定义动画分为2部分

  • 配置animation各项子属性
  • 通过@keyframes定义关键帧样式

浏览器根据这些东西来创建补间动画,计算插值把各个关键帧连接起来

二.animation子属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
animation-name @keyframes定义的关键帧名,默认none
animation-duration 动画时长,默认0s,与transition完全一致
animation-timing-function easying函数,默认ease,与transition完全一致
animation-delay 延迟时间,默认0s,,与transition完全一致
animation-iteration-count 重复次数,默认1
animation-direction 方向,默认normal
animation-fill-mode 样式应用模式,默认none
animation-play-state 用来暂停/恢复动画序列,默认running

需要注意:

  • durationdelay,其它参数顺序随意
  • animation-name不要和关键字重名,会优先匹配属性

animation-iteration-count

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
animation-iteration-count = infinite | <number>

动画重复次数,各值分别表示无限次、指定次数

animation-direction

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
animation-direction = normal | reverse | alternate | alternate-reverse

动画执行方向,各值分别表示正向、反向、交替(奇数次正向偶数次反向)、反向交替(奇数次反向偶数次正向)

animation-fill-mode

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
animation-fill-mode = none | forwards | backwards | both

样式应用模式,各值分别表示不应用关键帧样式、(结束后)应用终态样式、(delay期间)应用初态样式、(delay期间)应用初态样式且(结束后)应用终态样式

注意:初态和终态可能是0%也可能是100%,由animation-iteration-countanimation-direction共同决定

关键字含义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
none 在动画结束后,去掉@keyframes定义的样式,恢复原样式
forwards 在动画结束后,保持终态样式
backwards 在动画开始前(delay期间),保持初态样式
both 同时具有forwards和backwards的效果,即在delay期间保持初态样式,在动画结束后保持终态样式

具体差异见Demo:http://www.ayqy.net/temp/animation/animation-fill-mode.html,点击红色块开始动画

animation-play-state

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
animation-play-state = running | paused

决定动画执行还是暂停,可以用来控制动画暂停/恢复,比delay更强大更灵活一些

具体效果见Demo:http://www.ayqy.net/temp/animation/animation-play-state.html

三.@keyframes

语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@keyframes anmiationName {
   0% {}
   /*...*/
   100% {}
}

如果没有定义0%100%,浏览器就根据其它时刻的关键帧给所有属性算一组值

P.S.tofrom分别是0%100%的别名,因为初态和终态比较重要,有权申请英文名

四.事件

transition只有一个end事件,animation提供了3个事件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
animationstart      开始
animationend        结束
animationiteration  开始下一次重复

事件对象有3个特殊属性:

  • animationName 即animation-name
  • elapsedTime 单位是秒,对于animationstartanimationend表示动画执行到此刻的时间,对于animationiteration,表示下一次重复开始的时间,与transitionend事件类似,一般不受delay影响 特殊的,animationstart中的elapsedTime一般为0,除非animation-delay是个负值,此时elapsedTime-1 * delay
  • pseudoElement 以::开头的伪元素名,如果动画不是应用在伪元素上,就是空串

注意:最后一次重复结束的时候,不会触发animationiteration,而是触发animationend

五.技巧

1.steps(1)去掉平滑过渡

steps(1)linear很像,去掉一个linear动画的补间过渡,只留下关键帧,关键帧之间的帧延续上一个关键帧,就得到了steps(1)

制作Flash时,先插入两个关键帧,此时两个关键帧之间的都是普通帧(用来延长上一个关键帧的播放时间),这时的效果就是steps(1)。右键后一个关键帧,创建补间动画,此时得到的就是linear效果

实例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.rgb {
   -webkit-animation: rgb 1.5s linear infinite;
   animation: rgb 1.5s linear infinite;
}
@keyframes rgb {
   0% {
       opacity: red;
   }
   33% {
       background: green;
   }
   66% {
       background: blue;
   }
}

效果是背景色红绿蓝平滑渐变,想去掉渐变的平滑过渡,直接把linear改为steps(1)即可,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.rgb-step {
   -webkit-animation: rgb 1.5s steps(1) infinite;
   animation: rgb 1.5s steps(1) infinite;
}

效果就变成了每0.5秒切换一次背景色,没有渐变过渡

具体应用:两种状态无限切换(闪烁)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.blink {
   -webkit-animation: blink 1s steps(1) infinite;
   animation: blink 1s steps(1) infinite;
}
@keyframes blink {
   0% {
       opacity: 0;
   }
   50% {
       opacity: 1;
   }
}

2.添加关键帧去掉平滑过渡

闪烁效果有另一种有趣的实现方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.blink {
   -webkit-animation: blink 1s linear infinite;
   animation: blink 1s linear infinite;
}
@keyframes blink {
   0% {
       opacity: 0;
   }
   50% {
       opacity: 0;
   }
   50.01% {
       opacity: 1;
   }
   100% {
       opacity: 1;
   }
}

虽然还是linear平滑过渡,但插入的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
50.01% {
   opacity: 1;
}

去掉了50% -> 100%的补间,把透明度补间转移到50% -> 50.01%,时间较短的情况下,这个补间变化不会被察觉,当然,如果时间足够长,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.blink {
   -webkit-animation: blink 10000s linear infinite;
   animation: blink 10000s linear infinite;
}

就应该能看到透明度在某1秒内从0渐变到1,但一般情况下,这样实现闪烁在效果上是没有问题的

3.关键帧控制延迟

animation-delay只在动画开始前有效,每次重复不会插入延迟。类似于上面50.01%的技巧,可以通过插入空白关键帧来给每次重复插入延迟,实现loading转一圈等一等的效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.wait {
   -webkit-animation: wait 1s linear infinite;
   animation: wait 1s linear infinite;
}
@keyframes wait {
   0% {
       -webkit-transform: rotateZ(0);
       transform: rotateZ(0);
   }
   40% {
       -webkit-transform: rotateZ(0);
       transform: rotateZ(0);
   }
   100% {
       -webkit-transform: rotateZ(360deg);
       transform: rotateZ(360deg);
   }
}

做到了每转一圈等0.4s

4.steps逐帧动画

把序列帧平铺在一张图片上,修改background-position

steps()实现的话需要在末尾复制第一帧(比如6帧动画,需要7帧平铺图),例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.walk {
   background: url(walk.svg);
   width: 162px;
   height: 230px;   -webkit-animation: walk 1s steps(22) infinite;
   animation: walk 1s steps(22) infinite;
}
@keyframes walk {
   0% {
       background-position: 0 0;
   }
   100% {
       background-position: -3564px 0;
   }
}

其中walk.svg横向铺满了23帧,每帧尺寸是162 * 230,向左抽背景图片,最多能抽162 * 22 = 3564,此时显示最后一帧(图片帧内容与第一帧相同),首尾接起来

当然,还有另一种方法,用steps(1)去掉平滑过渡,然后手动设置22个关键帧,比较费劲,这里不给例子,但肯定是可行的

在线Demo:http://www.ayqy.net/temp/animation/css-animation-tricks.html

六.总结

CSS animation的定义方式和Flash非常相似,比如Flash中的几个概念:

  • 关键帧:如果你希望某处的内容要跟前面不一样,就插入关键帧
  • 空白关键帧:表示上面没内容,以小白点显示。他可以跟关键帧互相转换,放了内容就成关键帧了。关键帧上的内容去掉就是空白关键帧
  • 普通帧:关键帧或者空白关键帧后面延续的是普通帧。普通帧是延续之前关键帧的内容,所以他的作用可以来控制动画的显示时间

对应到CSS的@keyframes定义中感受一下,是不是有点意思?

参考资料

  • Using CSS animations – CSS | MDN
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端问问 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CSS3过渡与动画
   增强页面渲染性能,提前通知浏览器元素将要做什么动画,让浏览器提前准备合适的优化设置
Leophen
2019/08/23
8190
CSS3 animation动画 - 转风车、loding加载、人物走路等示例
1、@keyframes 定义关键帧动画 2、animation-name 动画名称 3、animation-duration 动画时间 4、animation-timing-function 动画曲线 linear(匀速)|ease(缓冲)|steps(步数) 5、animation-delay 动画延迟 6、animation-iteration-count 动画播放次数 n|infinite 7、animation-direction 动画结束后是否反向还原 normal|alternate 8、animation-play-state 动画状态 paused(停止)|running(运动) 9、animation-fill-mode 动画前后的状态 none(缺省)|forwards(结束时停留在最后一帧)|backwards(开始时停留在定义的开始帧)|both(前后都应用) 10、animation:name duration timing-function delay iteration-count direction;同时设置多个属性
Devops海洋的渔夫
2019/05/31
1.6K0
CSS3动画,为你带来极致的视觉体验!
HTML5学堂:随着网络的发展,浏览器具有更强的渲染与高级代码的执行能力。所以在当前,大量的动画效果由原来的JavaScript制作正慢慢的被CSS3所替代,究其原因在于CSS3的性能会比JS的性能来的好,并且CSS3动画为用户带来了强大而又震撼的效果,为开发者带来了简单的书写方式。 本文主要内容 1、前言 2、实现动画的前奏 3、CSS3动画的语法 4、实例解析 5、总结 1、前言 CSS3属性中有关于制作动画的三个属性:Transform、Transition、Animation;之前一起学习了Tran
HTML5学堂
2018/03/13
1.4K0
CSS3动画,为你带来极致的视觉体验!
网页|CSS的动画实现
一些CSS属性是可以实现动画效果,即我们可以用CSS实现动画和过渡。而动画属性的实现其实就是,属性逐渐地从一个值变化到另一个值,比如尺寸大小、数量、百分比和颜色,也就是通过设置多个节点来精确控制一个,或一组动画,常用来实现复杂的动画效果从而实现动画。动画是CSS最具有颠覆性的特征之一,接下来我们就来感受一下CSS的动画吧。
算法与编程之美
2019/11/29
1.4K0
八.CSS之animation(动画)
​ 多个属性间使用,隔开 ​ 如果所有属性都需要过渡,则使用all关键字 ​ 大部分属性都支持过渡效果,注意过渡时必须是从一个有效数值向另外一个有效数值进行过渡(auto不是有效数值,过渡动画效果不会生效)
小海怪的互联网
2020/11/24
9930
使用css3如何实现一个文字打印效果
animation动画通过设置多个节点来精确控制一个或者一组动画,常用来实现复杂的动画效果;
itclanCoder
2023/09/14
2730
使用css3如何实现一个文字打印效果
深入浅出 CSS 动画
本文将比较全面细致的梳理一下 CSS 动画的方方面面,针对每个属性用法的讲解及进阶用法的示意,希望能成为一个比较好的从入门到进阶的教程。
Sb_Coco
2022/03/10
1.9K0
深入浅出 CSS 动画
css笔记 - animation学习笔记(二)
from - to 等价于 0% - 100% 但是优先使用0% - 100%,因为浏览器兼容性还好点
xing.org1^
2018/09/20
5010
CSS3 动画—animation
animation 属性目前还存在浏览器兼容性问题,建议使用 PostCSS 或手动添加浏览器前缀。本文学习使用 animation 属性创建简单动画。
李振
2021/11/26
6760
彻底了解CSS3帧动画
animation-name 可以指定多个值,每个用 , 隔开,多个值表明有多个帧动画。
多云转晴
2020/06/28
1K0
CSS动画简介
现在,我很少写介绍CSS的文章,因为感觉网站开发的关键还是在服务器端。 但是,CSS动画除外,它实在太有用了。 本文介绍CSS动画的两大组成部分:transition和animation。我不打算给出
ruanyf
2018/04/13
1.2K0
CSS动画简介
CSS魔法堂:更丰富的前端动效by CSS Animation
 在《CSS魔法堂:Transition就这么好玩》中我们了解到对于简单的补间动画,我们可以通过transition实现。那到底多简单的动画适合用transtion来实现呢?答案就是——我们只需定义动画起始和结束帧的状态的动画。一旦关键帧数大于2时,我们必须转向CSS Animation了。本文为这段时间学习的记录,欢迎拍砖。
^_^肥仔John
2018/07/10
1.4K1
Css3新特性应用之过渡与动画
一、缓动效果 学习和利用贝塞尔曲线,默认支持ease,ease-in,ease-out,ease-in-out和linear等 还提供一个cubic-beizer自定义贝塞尔曲线的起点和终点 Css中只支持一条贝塞尔曲的运动,不能连续多段 对cubic-beizer中控制锚点的水平坐标与垂直坐标互换,就可以得到任何调整函数的反向版本 cubic-beizer(.1,.25,1,.25)是ease的反向调整函数 水平坐标只能在0~1的范围内,因为水平坐标表示的是时间 垂直坐标可以超过此范围,表示为运动距离
sam dragon
2018/01/17
1.1K0
CSS3中的animation动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>animation制作复杂帧动画</title> <style> body{ background-color: rgba(163, 207, 255, 0.69); } a:link{ color: #ff5ee6; }
xing.org1^
2018/05/17
8740
CSS3 动画属性
CSS3 动画 虽然transition在一定的时间内可以实现元素的初始状态在指定的时间范围过渡最终状态, 模拟一种过渡动画效果,但它的功能是非常有限的。 因此,CSS3 新增了一个动画属性animation。与过渡属性transition属性不同的是,CSS3 的animation属性可以像Flash制作动画一样,通过关键帧控制动画的每一步, 实现更为复杂的动画效果。 CSS3中通过animation实现动画和transition实现动画非常类似,都是通过改变元素的属性值来实现动画效果的。 它们的区别主要在于:使用 transition属性只能通过指定属性的初始状态和结束状态,然后在两个状态之间进行平滑过渡的方式来实现动画。 而animation实现动画效果主要由两个部分组成: 1). 通过类似Flash动画中的关键帧来声明一个动画; 2). 在animation属性中调用关键帧声明的动画,从而实现一个更为复杂的动画效果。 CSS3动画属性animation和CSS3的transition属性一样是一个复合属性,它包含了8个属性: animation-name,主要用来指定一个关键帧动画的名字,这个动画名必须对应一个@keyframes规则。CSS加载时会应用animation-name指定的动画, 从而执行动画。 animation-duration,主要用来设置动画播放所需时间,一般以秒为单位。 animation-timing- function主要用来设置动画的播放方式,与transition-timing-function类似。 http:/ /www.iis7.com/b/wzjk/ animation-delay、主要用来指定动画开始时间,一般以秒为单位。 animation-iteration- count、主要用来指定动画播放的循环次数。 animation-direction、主要用来指定动画的播放方向。 animation-play- state,主要用来控制动画的播放状态。 animation-fill- mode,主要用来设置动画的时间外属性。br/>:关键帧 在CSS3中,把@keyframes称为关键帧 @keyframes 的作用: transition制作一个简单的动画效果时,包括了元素的初始属性和最终属性,一个开始执行动作时间和一个延迟动作时间以及一个动作变换速率, 其实这些值都是一个中间值,如果要控制得更细一些,比如说要第一个时间段执行什么动作,第二个时间段执行什么动作(换到Flash制作动画中来说,就是第一帧要执行什么动作,第二帧执行什么动作), 这样用transition 就很难实现了,此时也需要一个“ 关键 帧”来控制。 在CSS3中就是通过@keyframes属性来实现这样的效果的。br/>@keyframes的语法: @keyframes具有其自己的语法规则,命名是由@keyframes开头,后面紧跟着是“动画的名称”加上一对花括号“{...}”,括号中就不同时间段样式规则,有点像CSS的样式写法。一个@keyframes中的样式规则是由多个百分比构成的,如0%~100%,可以在这个规则中创建更多个百分比,分别给每个百分比中需要有动画效果的元素加上不同的属性,从而让元素达到一种不断变化的效果,比如说移动,再比如改变元素颜色、位置、大小和形状等。 不过有一点需要注意, 可以使用“ frome”“to”代表一个动画是从哪开始,到哪结束,也就是说from就相当于0%,而to相当于100%。值得说的是,0%不能像别的属性取值一样把百分比符号省略,在这里必须加上百分符号(%)。如果没有加上,这个@keyframes是无效的,不起任何作用。因为@keyframes的单位只接受百分比值。@keyframes可以指定任何顺序排列来决定animation动画变化的关键位置 CSS中为元素应用动画: 要在CSS中为元素应用动画, 首先要创建一个已命名的动画,然后将它附加到该元素属性声明块中的一个元素上。 动画本身并不执行任何操作; 为了向元素应用动画,需要将动画与元素关联起来。这个要创建的动画,必须使用@keyframes来声明(或者对于当前的Webkit实现,使用@-webkit-keyframes),后跟所选择的名称,该名称主要用于对动画的声明作用,然后指定关键帧。 :CSS3动画8个子属性详解
py3study
2020/01/08
1.2K0
CSS3动画的使用
``语法:animation: name duration timing-function delay iteration-count direction fill-mode play-state;`
小小咸鱼YwY
2020/06/19
8580
玩转CSS3动画
因公司业务需要在Android WebView上增加对CSS3动画的支持,所以就先研究了一下CSS Animations。这篇文章主要站在前端开发人员的角度,试图阐述什么是CSS动画、包含哪些关键要素以及如何编写代码实现动画。先把这些捋清楚了,才好去考虑如何实现。
云水木石
2019/07/01
7240
玩转CSS3动画
【前端攻略--HTML/CSS】这是你需要的transform学习教程
transition语法格式:transition: property duration timing-function delay;
野原测试开发
2019/07/10
1K0
3分钟教你用css3做一个求婚小动画!
首先放张效果图 然后一步步分析一下: 首先是刚出现的新郎的动画 .w-m img{     margin-right: 0;     float: right;     margin-top: 60px;     animation: toWoman 0.5s ease .5s both; } @keyframes toWoman{     0%{         opacity: 0;         transform: translate(-200px);     }     100%{
王小婷
2020/12/01
4320
总结CSS3新特性(Animation篇)
总结CSS3新特性(Animation篇) 动画(Animation),是CSS3的亮点.//之一 通过animation属性指定@keyframe来完成关键帧动画; @keyframe用法:   @keyframes name { 0% { top: 0; }/*0%可用from关键字替代*/ 50% { top: 10px; } 100% { top: 0; }/*100%可用to关键字替代*/ } 由于是CSS3,所以不出意外
贾顺名
2018/04/12
1.6K0
总结CSS3新特性(Animation篇)
相关推荐
CSS3过渡与动画
更多 >
LV.1
阿里巴巴高级前端工程师
加入讨论
的问答专区 >
1宣传大使擅长3个领域
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    本文部分代码块支持一键运行,欢迎体验
    本文部分代码块支持一键运行,欢迎体验