- 1. 区分
animation
(动画)、transition
(过渡)、transform
(变形)、translate
(移动) - 2.
animation
中的steps()
逐帧动画 - 3. 关于js动画和CSS3动画的差异性
# 1. 区分animation
(动画)、transition
(过渡)、transform
(变形)、translate
(移动)
CSS3中的
transform
(变形)属性用于内联元素和块级元素,可以旋转、扭曲、缩放、移动元素,它的属性值有以下五个:旋转rotate
、扭曲skew
、缩放scale
和移动translate
以及矩阵变形matrix
;transform
(变形)是CSS3中的元素的属性,而translate
只是transform
的一个属性值;transform
是transition
(过渡动画)的transition-property
的一个属性值。animation
(动画)、transition
(过渡)是css3中的两种动画属性。animation
强调流程与控制,对元素的一个或多个属性的变化进行控制,可以有多个关键帧(animation
和@ keyframes
结合使用);transition
强调过渡,是元素的一个或多个属性发生变化时产生的过渡效果,同一个元素通过两个不同的途径获取样式,而第二个途径当某种改变发生(例如hover
)时才能获取样式,这样就会产生过渡动画。可以认为它有两个关键帧(transition
+transform
= 两个关键帧的animation
)。animation
和transition
大部分属性是相同的,他们都是随时间改变元素的属性值,他们的主要区别是transition
需要触发一个事件才能改变属性,而animation
不需要触发任何事件的情况下才会随时间改变属性值;并且transition
为2帧,从from .... to
,而animation
可以一帧一帧的。
# 1.1. transition
属性
1、语法
transition
是一个复合属性,可设置四个过渡属性,简写方式如下:
transition{transition-property, transition-duration, transition-timing-function, transition-delay}
transition-property
:是用来指定当元素其中一个属性改变时执行transition
效果,值有none
(没有属性改变)、all
(默认值,所有属性改变),indent
(某个属性名,一条transition
规则,只能定义一个属性的变化,不能涉及多个属性,如果要设置多个属性时,需分别设置,中间以逗号隔开)【当其值为none
时,transition
马上停止执行,当指定为all
时,则元素产生任何属性值变化时都将执行transition
效果】。transition-duration
:过渡时间,是用来指定元素转换过程的持续时间,单位为s
(秒)或ms
(毫秒)transition-timing-function
:时间函数,允许你根据时间的推进去改变属性值的变换速率,值ease
(逐渐变慢)、linear
(匀速)、ease-in
(加速)、ease-out
(减速)、ease-in-out
(加速然后减速)、cubic-bezier
(该值允许你去自定义一个时间曲线)transition-delay
:延迟,指定一个动画开始执行的时间,也就是说当改变元素属性值后多长时间开始执行transition
效果,单位为s(秒)或ms(毫秒)
2、触发方式
- 伪类触发:
:hover
:focus
:checked
:active
- js触发:
toggleClass
3、以下情况下,属性值改变不能产生过渡效果
background-image,如`url(a.jpg)`到`url(b.jpg)`(与浏览器支持相关,有的浏览器不支持)等
float 浮动元素
height 或 width 使用 auto 值
display 属性在 none 和其他值(block、inline-block、inline)之间变换
position 在 static 和 absolute 之间变换
# 1.2. animation
属性
语法
设置好了关键帧,就可以设置animation
属性了,animation
也是一个复合属性,可以简写,语法如下:
animation{animation-name, animation-duration, animatino-timing-function, animation-delay, animation-iteration-count, animation-direction, animtion-play-state, animation-fill-mode}
animation-name
:用来调用@keyframes
定义好的动画,与@keyframes
定义的动画名称一致animation-duration
:指定元素播放动画所持续的时间animatino-timing-function
: 和transition
中的transition-timing-function
中的值一样。根据上面@keframes
中分析的animation
中可能存在多个小动画,因此这里的值设置是针对每一个小动画所在时间范围内的属性变换速率。animation-delay
:定义在浏览器开始执行动画之前等待的时间,这里是指整个animation
执行之前的等待时间,而不是上面说的多个小动画animation-iteration-count
:定义动画的播放次数,其通常为整数,默认是1
;取值为infinite
,动画将无限次的播放。animation-direction
:主要用来设置动画播放方向,其主要有两个值normal
默认值,如果设置为normal
时,动画每次循环都是向前(即按顺序)播alternate
(轮流),动画播放在第偶数次向前播放,第奇数次向反方向播放(animation-iteration-count
取值大于1时设置有效)
animtion-play-state
:属性是用来控制元素动画的播放状态。其主要有两个值:running
,可以通过该值将暂停的动画重新播放,这里的重新播放不是从元素动画的开始播放,而是从暂停的那个位置开始播放。paused
,暂停播放 注意:使用animtion-play-state
属性,当元素动画结束后,元素的样式将回到最原始设置状态(这也是为什么要引入animation-fill-mode
属性的原因)
animation-fill-mode
:默认情况下,动画结束后,元素的样式将回到起始状态,animation-fill-mode
属性可以控制动画结束后元素的样式。主要具有四个属性值:none
(默认,回到动画没开始时的状态。)forwards
(动画结束后动画停留在结束状态)backwords
(动画回到第一帧的状态)both
(根据animation-direction
轮流应用forwards
和backwards
规则)。
# 2. animation
中的steps()
逐帧动画
语法:steps(n, start/end)
steps 函数指定了一个阶跃函数,第一个参数指定了时间函数中的间隔数量(必须是正整数);第二个参数可选,接受 start
和 end
两个值,指定在每个间隔的起点或是终点发生阶跃变化,默认为 end
。
- 第一个参数
number
为指定的间隔数,即把动画分为n步阶段性展示 - 第二个参数默认是
end
,设置最后一步的状态start
第一帧是第一步动画结束end
第一帧是第一步动画开始
举例:
steps(1,start)
动画分成1步,动画执行时为开始左侧端点的部分开始。steps(1,end)
动画分成1步,动画执行时以结尾端点为开始,默认值end
# 3. 关于js动画和CSS3动画的差异性
渲染线程分为main thread
和compositor thread
,如果css动画只改变transform和opacity
,这时整个CSS动画得以在compositor trhead
完成(而js动画则会在main thread
执行,然后触发compositor thread
进行下一步操作),特别注意的是如果改变transform和opacity
是不会layout或者paint的。
区别:
- 功能涵盖面,js比CSS3大
- 实现/重构难度不一,CSS3比js更加简单,性能调优方向固定
- 对帧速表现不好的低版本浏览器,CSS3可以做到自然降级
- CSS3动画有天然事件支持
- CSS3有兼容性问题