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

逻辑拼图
• 阅读 9568

网页逐帧动画的实现方式

网页中的逐帧动画,大致可分为两大类的实现方式, 分别是使用JS控制,和单纯使用CSS实现,两者的优劣总体概括来说就是: JS动画可控性更强,但开销大,实现复杂。 CSS动画实现相对JS更简单。
常见的网页动画形式参考:mark? 9种网页动画常用实现方式总结
PS:江湖传言CSS动画性能更佳,可web环境过于复杂,哪个性能好可能需要参照具体情况测试, 这里有篇博客较为系统地阐述了css与JS动画在性能上的比较: mark? 消除疑问:CSS动画 VS JavaScript

另外在JS控制的动画中,又可分为JS控制的canvas动画, SVG动画,以及直接控制图片,元素的位置来实现的动画。一句话,JS动画更复杂。

CSS实现逐帧动画的原理

css逐帧动画是通过不断变换keyframes中每个阶段的背景来实现,比如0%处和100%处分别使用不同的background就实现了最简单的画面切换。 一般的做法是先将动画的不同帧做成一张雪碧图,然后不断变换background-position来达到变换效果, 但是直接使用会有这样的问题: css动画默认的动画过渡方式的平滑的,平滑的过渡对逐帧动画会造成类似滑动的效果,所以需要动画时间函数animation-timing-function中的steps属性来设置过渡方式,这里先上demo对比:

使用steps时间函数与常规时间函数实现逐帧动画的对比

这两个动画的区别仅在animation中时间函数参数:

.above:hover {
  -webkit-animation: run .6s steps(1,start) infinite;
}  /* 使用steps实现逐帧动画*/

.down:hover {
  -webkit-animation: run .6s linear infinite;
} /* 常规时间函数linear产生平滑的滑动效果*/

理解steps

对于steps属性的理解,我翻过好几篇博客,但有点越讲越邪乎,我的理解,该属性用于控制动画关键帧的过渡(补间)方式, 常规的css动画过渡,都是平滑的, 正如上面demo中所展示, 浏览器会自动为关键帧的间隔中插入补间动画(学过flash的朋友对这几个概念应该很熟悉) ,以便视觉上不会出现闪烁, css控制过渡方式的属性是animation-timing-function ,它的值除了可以设置贝塞尔曲线Cubic-bezier(类似的easelinear等也属于曲线函数) 还有就是我们的steps,该属性的语法为steps(number, start|end) 接受两个参数,第一个参数为正整数,将一段动画分成number段,第二个参数为为关键帧的变化位置, 默认为end,关于start和end的详细讲解也可以参考这里:
mark?CSS3 timing-function: steps() 详解

但上面这篇博客中的例子并不直观,我自己做了个例子,可能有助理解,steps将动画分成n段(n为第一个参数) 也就是设置补间动画的间隔数,比如从白色到黑色的过渡,常规曲线函数会渐进地补间其中的灰色, 而如果将设置为steps(2),则中间的补间只有一个rgb都为125的灰色,而startend可以理解为关键帧的跳跃时机, 设置为start的时候,关键帧在0秒完成跳跃,由于在0秒已经完成了跳跃,所以我们视觉上所见的也就是第一个关键帧之后的一帧,这也可以解释下面的demo(对比demo中steps的设置便于理解):
理解steps时间函数

扯得太远,让我们回到逐帧动画, 以上demo解释了逐帧动画的实现基础,也就是将其第一个参数设为steps(1) ,意味着将不对动画分段,也就是不插入补间动画,这样也就实现了逐帧播放,由于steps这个特性,反之,如果我们将动画只设置两个关键帧,由steps(4)来分段,那么就省去了手动设置keyframes中的百分比关键帧。
于是在对比demo中,我们可以加入另一个实现同样效果的动画:

@keyframes run2 {
  0% {
    background-position: 0 0;
  }
  100% {
    background-position: -800px 0; /* 直接将后关
    键帧设置为图片末尾,在animation属性设置中就可以利
    用steps分段的特性来省去手动设置keyframes
    */
  }
 
}

附一篇类似博客作参考:
mark? CSS3 实现奔跑动画
这博客今天写得貌似很啰嗦,回家吃饭了~

点赞
收藏
评论区
推荐文章
徐小夕 徐小夕
4年前
用css3实现惊艳面试官的背景即背景动画(高级附源码
我们传统的前端更多的是用javascript实现各种复杂动画,自从有了Css3transition和animation以来,前端开发在动画这一块有了更高的自由度和格局,对动画的开发也越来越容易。这篇文章就让我们汇总一下使用Css3实现的各种特效。这篇文章参考《css揭秘》这本书,并作出了自己的总结,希望能让大家更有收获,也强烈推荐大家看看这本书,你值得拥有
徐小夕 徐小夕
4年前
如何使用css3实现一个类在线直播的队列动画
之前在群里有个朋友问了这样一个问题,就是如何在小程序中实现类似直播平台的用户上线时的队列动画?作为一名前端工程师,解决方案无非以下2种:1.使用javascript根据条件来控制元素的样式实现队列动画2.用纯css3配合数据驱动模型来实现.大家都知道在现代的Web开发中,我们能使用Css实现的效果尽量不要用Js,所以我们应该优先考虑用C
亚瑟 亚瑟
4年前
Flutter - 深入理解Flutter动画原理
基于Flutter1.5,从源码视角来深入剖析flutter动画原理,相关源码目录见文末附录一、概述动画效果对于系统的用户体验非常重要,好的动画能让用户感觉界面更加顺畅,提升用户体验。1.1动画类型Flutter动画大的分类来说主要分为两大类:补间动画:给定初值与终值,系统自动补齐中间帧的动画物理动画:遵循物理学定律
Chase620 Chase620
4年前
CSS3动画之逐帧动画
CSS3动画开发指南第二弹,剥丝抽茧为你解析逐帧动画,同时放送从实战经验中总结出来的逐帧动画使用技巧。什么是逐帧动画要了解CSS3逐帧动画,首先要明确什么是逐帧动画。看一下维基百科中的定义:定格动画,又名逐帧动画,是一种动画技术,其原理即将每帧不同的图像连续播放,从而产生动画效果。简而言之,实现逐帧动画需要两个条件:(1)相关联
徐小夕 徐小夕
4年前
《前端实战总结》之使用纯css实现网站换肤和焦点图切换动画
今天我们来继续复盘一些工作中常用的css技巧和知识,以便我们可以更加优雅的用css实现富有动感的网站.你将收获网站换肤设计方案介绍:target伪类介绍和用法以及如何使用css实现网站换肤transition动画以及如何用纯css实现焦点图动画效果展示1.网站换肤(https://imghelloworld.ossc
Wesley13 Wesley13
3年前
JS动画与CSS动画
一、JS动画(setIntervalsetTimeOutrequestAnimationFrame)优点:  1)过程控制能力强。可以对动画工程进行精准的控制,暂停、取消、开始、终止都可以。  2)动画效果多、炫酷。有一些效果是CSS动画所不能实现的  3)兼容性比较高缺点:   1)由于JS是通过不断的操
Wesley13 Wesley13
3年前
H5实现APP和原生方式有多大差距,多少坑?JS才是王道!
纯H5的APP,虽然开发起来要比纯原生开发畅快的多,但最终效果和性能还是和原生比起来还是有很多问题,主要聚集在以下几个方面:1、动画动画有很多种,比如侧边栏菜单的滑入滑出、元素的响应动画、页面切换之间的过场等等,在H5之下的众多实现方法都没有办法达到纯原生的性能。一般有这几种不同的选择:css3动画,javascript动画,原生动画。cs
Stella981 Stella981
3年前
CSS3 SVG实现可爱的动物哈士奇和狐狸动画
今天,我想向大家展示如何巧妙地使用HTML、CSS排序动画和SVG滤镜把生活中可能最可爱的东西之一——动物画到网页上。我们将探讨绘制动物的两种技术:一种使用纯HTML和CSS,另一种使用内联SVG背景图像。此演示高度实验性质——动画SVG滤镜目前仅在Chrome中可用。所涉及的动画也很复杂,因此本教程将重点介绍创建这些动物以及栩栩如生的动作所涉及
绣鸾 绣鸾
1年前
Moho Pro 14 for Mac(2D动画制作软件)
是一款专业的2D动画制作软件。它具有强大的功能和工具,适用于动画制作师、插画师和设计师。MohoPro14提供了丰富的动画功能,包括骨骼动画、形状插值、帧逐帧动画等。您可以使用骨骼工具来创建复杂的角色动画,通过设置骨骼关节和控制器,实现自然流畅的动作。形状
布局王 布局王
1天前
详解鸿蒙Next仓颉开发语言中的动画
大家上午好,今天来聊一聊仓颉开发语言中的动画开发。仓颉中的动画通常有两种方式,分别是属性动画和显示动画,我们今天以下面的加载动画为例,使用显示动画和属性动画分别实现一下,看看他们有什么区别。显示动画显示动画是幽蓝君比较习惯使用的方式,它主要依赖animat