美文网首页
CSS3逐帧动画

CSS3逐帧动画

作者: OliverMa | 来源:发表于2017-11-13 14:29 被阅读0次

    内容节选自“http://www.zcool.com.cn/article/ZNDA0MjAw.html”

    CSS3 实际上是使用animation-timing-function的阶梯函数steps(number_of_steps, direction)来实现逐帧动画的连续播放的。

    在移动端,CSS3 Animation 兼容性良好,相对于 JS,CSS3 逐帧动画使用简单,且效率更高,因为许多优化都在浏览器底层完成。

    逐帧动画有不同的动画帧,我们可以通过更改background-image的值实现帧的切换,但多张图片会带来多个 HTTP 请求,且不利于文件的管理。

    比较合适的做法,是将所有的动画帧合并成一张图,通过改变background-position的值来实现动画帧切换。因此,逐帧动画也被称为“精灵动画(sprite animation)”。

    以京东到家的触屏页面《年货送到家》为例:

    这个动画一个有三帧,将3个动画帧合并,并放到.p8 .page_key的背景中:

    (2)使用 steps 实现动画播放

    steps 指定了一个阶梯函数,包含两个参数:

    1. 第一个参数指定了函数中的间隔数量(必须是正整数);

    2. 第二个参数可选,指定在每个间隔的起点或是终点发生阶跃变化,接受 start 和 end 两个值,默认为 end。(参考自W3C

    通过W3C中的这张图片来理解 steps 的工作机制:

    回到上述的例子,我们在 keyframes 中定义好每个动画帧:

    然后,给他加上animation:

    为什么第一个参数是1?

    前文中提到,steps 是animation-timing-function的一个属性值,在W3C中有如下说明:

    For a keyframed animation, the ‘animation-timing-function’ applies between keyframes, not over the entire animation.

    也就是说,animation-timing-function应该于两个 keyframes 之间,而非整个动画。在上面的 keyframes 中,我们已经把每个帧都写出来了,所以两个 keyframes 之间的间隔是1。

    更加简便的写法?

    既然说 steps 第一个参数是指函数的间隔数量,那么我们就可以把 keyframes 的计算直接交给 steps 来完成。

    以上两种写法效果是等同的。

    CSS3 逐帧动画使用技巧

    (1)step-start 与 step-end

    除了steps函数,animation-timing-function还有两个与逐帧动画相关的属性值step-start与step-end:

    1. step-start等同于steps(1,start):动画执行时以开始端点为开始;

    2. step-end等同于steps(1,end):动画执行时以结尾端点为开始。

    (2)动画帧的计算:

    (3)适配方案:rem+scale

    我们知道,rem 的计算会存在误差,因此使用雪碧图时我们并不推荐用 rem。如果是逐帧动画的话,由于计算的误差,会出现抖动的情况。

    那么在触屏页中,如何实现页面的适配?

    这里小编提供一个思路:

    1. 非逐帧动画部分,使用rem做单位;

    2. 逐帧动画部分,使用px做单位,再结合js对动画部分使用scale进行缩放。

    相关文章

      网友评论

          本文标题:CSS3逐帧动画

          本文链接:https://www.haomeiwen.com/subject/xblzmxtx.html