资讯专栏INFORMATION COLUMN

【CSS】一文读懂 Animation 中的时间函数 steps

AJie / 3049人阅读

摘要:本文主要介绍中的函数。在执行动画时默认以函数进行过渡,会在每个关键帧之间插入补间动画,所以动画效果是连贯的。因此并非作用于整个动画,而是作用于每两个关键帧之间,与动画的时长播放次数等都无关,所以整个动画的执行时间还是中设定的。

利用 CSS3 的 Animation 可以创建动画,在许多页面中能够替代 Flash、JS 等,提升页面加载速度。众所周知,Animation 有 8 大属性,如下所述:

属性名 简介
animation-name 规定需要绑定到选择器的 keyframe 名称
animation-duration 完成动画所花费的时间,以秒或毫秒计
animation-timing-function 规定动画的速度曲线
animation-delay 动画开始前的延迟
animation-iteration-count 动画播放次数
animation-direction 规定是否应该轮流反向播放动画
animation-play-state 指定动画是否正在运行或已暂停
animation-fill-mode 当动画不播放时(动画完成或动画延迟),要应用到元素的样式

以上这 8 个属性就决定了 Animation 能够实现一个什么样的动画效果。 

本文主要介绍 timing-function中的steps()函数。Animation 在执行动画时默认以 ease函数进行过渡,ease 会在每个关键帧之间插入补间动画,所以动画效果是连贯的。
除了ease函数之外,linearcubic-bezier(贝塞尔曲线)等过渡函数也会为其插入补间动画。

但有的时候某些效果不需要补间,只需要在关键帧之间进行跳跃,这时就用到了steps()过渡方式。

1、什么是 steps?

steps()是 Animation 中的一个timing-function函数, 能够实现动画的阶跃式变化,而非两个状态间的线性过渡。 
steps() 接收两个参数:

steps ( n, [start | end] )

第一个参数是一个正值,指定动画分割的段数

第二个参数定义动画执行开始点,可设定为 start 或 end,这个值为可选值,当未传入参数时默认以 end 方式执行

2、如何使用 steps?

大家都见过很经典的菊花 loading 效果图,其实现原理很简单:
一张静态图片,然后为其添加动画:

设定在固定步数内旋转(rotate) 360 度即可实现 loading 效果,具体实现方式如下:
... .loading-dot-step { animation: loading 1s infinite steps(12,start); } @keyframes loading { 0% {transform: rotate(0deg);} 100% {transform: rotate(360deg);} }

静态图片如图所示:

给上面的静态图片添加动画,steps 设定 12 步完成两个关键帧间的动作轨迹,即从当前状态旋转 360 度,实现下面 gif 的动画效果。

除了菊花 loading 效果,很常见的还有线性 loading,其实现方式是:
利用 timing-functionlinear 线性过渡函数,实现图片的连续旋转,此时的效果在视觉上就是连续的动画,如下图所示:

对于两种 loading 效果图,第一种为 steps 方式,第二种为线性过渡方式。
两者实现原理类似:

均在两个关键帧之间将图片从当前状态旋转至 360 度,当 timing-function 设置为 linear 时,从 0% 到 100% 的状态变化为匀速线性变化;
当动作设定为 steps 时,将从 0 度旋转至 360 度的整个动画分为 12 步执行完,且每步之间是跳跃的,因此出现了经典的菊花 loading 效果。
3、分清 start 和 end

steps 的执行点 start 和 end 是许多人存在疑惑的地方,误用 start 和 end 可能会出现和理想情况下不一致的动画效果,许多人分不清两者的区别在哪里,下面以几个简单的 demo 来辅助理解这两个属性值的区别。

steps() 可简化出 step-startstep-end 这两个关键字。

step-start 等同 steps ( 1, start ) ,动画分成 1 步,动画执行时以左侧端点为开始

step-end 等同 steps ( 1, end ) ,动画分成 1 步,动画执行时以结尾端点为开始

1、steps(1, start)

2、steps(1, end)

... .a{ animation:changeColor 4s infinite steps(1, start); } .b{ animation:changeColor 4s infinite steps(1, end); } @keyframes changeColor{ 0%{ background-color: red; } 100%{ background-color: blue; } }

上述代码显示效果如下图所示:
1、steps(1, start)

2、steps(1, end)

代码可见,两者设定的均为 1 步执行完动画,实现将 div 的颜色从红色变为蓝色,但是我们看到的结果却是不同的,这就是由于 startend 两个属性的执行点不同造成的结果差异。

规范文档中给出了关于 steps() 的函数图,如下图所示:

对比 steps 函数中的 start 和 end 两个执行点,由上图中步数为 1 的两图可见:

整个动作只有一步,在时间为 0 处,position 设置为 start 时动画的第一步已执行完成

相同情况下,position 设置为 end ,当时间为 0 时动画的第一步尚未开始

同样,当步数等于 3 时,肉眼可见的 start 的执行点为第一步执行结束的位置,end 的执行点则为第一步尚未开始的位置 。由于动画执行的步数相同但起点不同,因此动画的结束点也不相同,设置为 start 的情况下,结束点为动画结束的最后一步的状态,而 end 为结束前一步的状态。

为了更加直观地展示两者执行的开始点和结束点的区别,本文以横向坐标图的方式对执行过程进行示意:

属性值设置为 start 时,在动画开始后,动画的第一段会马上完成。以左侧端点为起点,立即跳到第一个 step 的结尾处,并且保持这样的状态直到第一步的持续时间结束(后面的每一帧都将按照此模式来完成动画)。

属性值设置为 end 时,在动画执行的每一帧中,动画都保持当前状态直到这一段的持续时间完成,才会跳到下一步的起点(后面的每一帧都按照这个模式来进行)。

现在可以解释上述 demo 中两个 div 颜色显示不一样的原因了,对于 steps 属性值为 start 的 a-box,进入画面时动画的第一阶段已经完成,因此我们不会看到红色,直接显示蓝色;对于 steps 属性值为 end 的 b-box,动画保持第一帧的状态直到结束,因此始终显示为红色。

4、何时使用 steps?

并非所有的动画都是连续的,对于某些非连续变化的效果就需要用到 steps 来实现。 例如钟表秒针阶跃式的转动,或者在动画中模仿人物或动物的脚印行走效果,再或者利用雪碧图实现人物跑动的效果等等。下面详细介绍一下人物跑动效果的实现方式。

人物奔跑 demo
... .person { background: url("person.jpg") no-repeat; background-size: 800%; // 动画名称 持续时间 运动曲线(steps()分为几步)循环次数 animation: personBlast .8s steps(7) infinite; } @keyframes personBlast { 0% { background-position: left; } 100% { background-position: right; } }

其中 person.jpg 为人物动作分割的雪碧图:

本文奔跑动作实现方式为将原始雪碧图进行按图形帧数的倍数放大,然后设定steps 为雪碧图的帧数减 1(8 帧分为 7 步执行完),关键帧的动作为从 (from) 雪碧图左侧阶跃式跳跃到(to)右侧,最终实现下面的跑动效果:

【 注:此奔跑效果的实现方式不尽相同,此处只是其中一种,这样做是为了让大家更好的理解 steps 的应用场景,还有其他更友好的实现方式欢迎大家一起交流 】

5、请注意 !!!

对于 Animation 的 timing-function 有一个需要引起注意的点,即:

timing-function 的执行位置为两个关键帧之间,而非整个动画

此处的 timing-function 指的是本文所讲的 steps 函数以及 linear、ease、cubic-bezier 等函数。
这里还是通过一个简单的 demo 来了解这个点。首先看一下下面的动画效果:

实现代码为:

... .test-a { animation: changeColorOne 1s steps(1) infinite; } .test-b { animation: changeColorTwo 1s steps(1) infinite; } @keyframes changeColorOne { 0% { background-color: red; } 100% { background-color: blue; } } @keyframes changeColorTwo { 0% { background-color: red; } 25%{ background-color: blue; } 75%{ background-color: red; } 100% { background-color: blue; }

对于 class 为 test-a 的 div,为其添加的 changeColorOne 动画为 1 秒内完成 0% 及 100% 两个关键帧之间的颜色变化,其执行位置为 0% 到 100% 之间,因此始终显示红色(不设置 start 还是 end 时默认为 end)

对于 test-b,changeColorTwo 的关键帧有 4 个,因此这时的 steps(1) 的执行位置为 0% - 25% 两个关键帧中间执行一次、25% - 75% 两个关键帧中间执行一次、75% - 100% 两个关键帧中间执行一次,一共执行3次。由于执行点设定为 end, 因此 0% - 25% 显示红色,25% - 75% 显示蓝色,75% - 100% 显示红色,动画整体效果即为上图 gif 所示。

因此:steps 并非作用于整个动画,而是作用于每两个关键帧之间,与动画的时长、播放次数等都无关,所以整个动画的执行时间还是 Animation 中设定的 1s

6、结束语

Animation 时间函数中的 steps() 确实不好理解,但是一旦掌握了它会为我们的开发工作带来很大的效率提升,节省很多调试时间,也能帮助我们快速定位问题。 希望本文的讲解可以帮助你更好的理解和使用 steps()。
感谢阅读,欢迎互相交流!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/114252.html

相关文章

  • [练习]利用CSS steps 实现逐帧动画

    摘要:网页逐帧动画的实现方式网页中的逐帧动画,大致可分为两大类的实现方式,分别是使用控制,和单纯使用实现,两者的优劣总体概括来说就是动画可控性更强,但开销大,实现复杂。 网页逐帧动画的实现方式 网页中的逐帧动画,大致可分为两大类的实现方式, 分别是使用JS控制,和单纯使用CSS实现,两者的优劣总体概括来说就是: JS动画可控性更强,但开销大,实现复杂。 CSS动画实现相对JS更简单。常见的网...

    RiverLi 评论0 收藏0
  • 利用 CSS animationCSS sprite 制作动画

    摘要:今天给大家介绍一个使用配合雪碧图来制作动画的方法,可以做出类似于动画的效果。利用雪碧图来制作动画使用了里面的一个重要的函数。 CSS3 大大强化了制作动画的能力,但是如果要做出图案比较复杂的动画,选择 GIF 依然是一个不错的选择。今天给大家介绍一个使用 CSS animation 配合雪碧图(CSS sprite)来制作动画的方法,可以做出类似于 GIF 动画的效果。 CSS3 An...

    陈伟 评论0 收藏0
  • 【前端优化】动画几种实现方式总结和性能分析

    摘要:备注没整理格式,抱歉动画实现的几种方式性能排序实现方式自身调用调用的定时器值推荐最小使用的原因即每秒帧为什么倒计时动画一定要用而避免使用两者区别及引发的线程讨论线程讨论为什么单线程是的一大特性。 备注:没整理格式,抱歉 动画实现的几种方式:性能排序js < requestAnimationFrame 3->4->2. 那么在来看你这段代码。 var t = true; window...

    IamDLY 评论0 收藏0
  • CSS魔法堂:更丰富的前端动效by CSS Animation

    摘要:无效生效重复怎么办与规则一样,标准规定相同的关键帧不产生层叠,仅最后出现的认定为有效。但实际上和均将关键帧设计为可层叠的。为默认值,表示动画一结束,动画效果就结束表示动画一开始就马上执行完第一个关键帧的效果。 前言  在《CSS魔法堂:Transition就这么好玩》中我们了解到对于简单的补间动画,我们可以通过transition实现。那到底多简单的动画适合用transtion来实现呢...

    MrZONT 评论0 收藏0
  • CSS3动画之逐帧动画

    摘要:什么是逐帧动画要了解逐帧动画,首先要明确什么是逐帧动画。简而言之,实现逐帧动画需要两个条件相关联的不同图像,即动画帧连续播放。因此在触屏页面中逐帧动画使用广泛,下文将对其进行详细介绍。因此,逐帧动画也被称为精灵动画。 什么是逐帧动画要了解 CSS3 逐帧动画,首先要明确什么是逐帧动画。 看一下维基百科中的定义: 定格动画,又名逐帧动画,是一种动画技术,其原理即将每帧不同的图像连续播放,...

    RancherLabs 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<