css steps 动画的使用 - 雪碧图动画

简介: 之前在时间函数那篇文章里有写到 css 动画除了支持贝塞尔曲线绘制平滑动画外,还支持使用 steps 来绘制定格/逐帧动画,但是一直没想到使用场景,直到前两天在网上看到一篇说合金弹头的帖子,突然想起来可以使用逐帧动画配合雪碧图,就可以很轻松的实现游戏中常见的雪碧图动画了,说干就干,下面我们一起来试一下。

网络异常,图片无法展示
|

之前在时间函数那篇文章里有写到 css 动画除了支持贝塞尔曲线绘制平滑动画外,还支持使用 steps 来绘制定格/逐帧动画,但是一直没想到使用场景,直到前两天在网上看到一篇说合金弹头的帖子,突然想起来可以使用逐帧动画配合雪碧图,就可以很轻松的实现游戏中常见的雪碧图动画了,说干就干,下面我们一起来试一下。

雪碧图

雪碧图就是将很多小的图片素材拼凑成一张大图,当需要使用其中一个素材时就直接将大图设置为背景图,然后通过 background-position 来指定显示的位置渲染对应的小图。

早期的 web 开发中经常会使用雪碧图来减少图片数量,避免过多的图片请求,而现在雪碧图在 web 开发中其实已经很少会使用,因为随着工程化的健全和 http2.0 的普及,小图大部分会被直接转成 base64 编码直接打包进代码中,而大图使用雪碧图的话在更新时会导致缓存失效率过高,而且存在图片过大的问题,所以已经很少会见到。

逐帧动画

逐帧动画在以前的小游戏中经常会被使用,所以以前的游戏素材中会看到很多的小图,这些小图拼在一起只要保证小图切换够快就会行成动画,就和在影院看电影一样,都是一幅幅图片给人留下的视觉残留。

实操

下面我们就来实操使用 css steps 来制作一个雪碧图动画,首先要找到一张雪碧图,这个可以上网搜一搜,我这边随便找了一个洛克人的雪碧图。找到雪碧图后我们需要测量一下每一帧的大小,大部分的动画雪碧图会等分每一帧,但是如果不幸找了一张非等分的(我就是 🤦‍♂️),可能就需要费点劲将每个帧对应的 background-size 测量出来。

定义好容器的大小,背景图后,我们在 keyframes 中定义关键帧即可,由于我的雪碧图不太标准,无奈我只能定义多个关键帧:

#rock {
    width: 130px;
    height: 120px;
    background-image: url(https://www.gamedesigning.org/wp-content/uploads/2020/10/Sprite-Sheet.jpg);
    background-position: -20px 0;
}
@keyframes rock {
    0%,
    to {
        background-position: -20px -10px;
    }
    10% {
        background-position: -136px -10px;
    }
    20% {
        background-position: -252px -10px;
    }
    30% {
        background-position: -368px -10px;
    }
    40% {
        background-position: -494px -10px;
    }
    50% {
        background-position: -20px -132px;
    }
    60% {
        background-position: -136px -132px;
    }
    70% {
        background-position: -252px -132px;
    }
    80% {
        background-position: -368px -132px;
    }
    90% {
        background-position: -494px -132px;
    }
}
复制代码

如果你找到的雪碧图很规范,大可不必这么麻烦,直接定义第一帧和倒数第二帧的位置即可,当然你也可以配合使用 jump-both 直接定义倒数第一帧。

@keyframes your-sprite-ani {
    0%,
    to% {
        background-position: 0 0;
    }
    90% {
        background-position: -1000px;
    }
}
复制代码

注意定义的关键帧百分比分布由你的雪碧图的总帧数来决定,比如我的雪碧图由 10 张小图组成,所以我的百分比为 10% 一份。

定义好动画后我们直接为动画容器添加上:

@keyframes rock {
    animation: 0.8s infinite steps(1, start) rock;
}
复制代码

注意这里的 steps 数量时每个关键帧中切换所需要的数量,因为我的雪碧图不标准,所以我是在关键帧定义中写死了位置,每一帧只需要一个 step,如果你是标准动画雪碧图,记得将其改为你的动画关键帧数量。

修改完成后我们就能看到这样一个动起来的小洛克人:

网络异常,图片无法展示
|

不过原地跑步有点奇怪 🤔,还是给他加个移动效果吧:

#rock {
    width: 130px;
    height: 120px;
    background-image: url(https://www.gamedesigning.org/wp-content/uploads/2020/10/Sprite-Sheet.jpg);
    background-position: -20px 0;
    position: absolute;
    animation: 0.8s infinite steps(1, start) rock, 10s infinite linear move;
}
@keyframes move {
    0% {
        left: 0;
    }
    100% {
        left: 100%;
    }
}
复制代码

为了让跑步自然一点,记得把时间曲线修改为线性函数,不然你会发现他时快时慢 😂。

网络异常,图片无法展示
|

动画完成,不过还是有一丢丢奇怪,我们再来给他加个折返跑,不然感觉像洛克人学会了瞬间移动,不过我们只有一张雪碧图,没有折返跑的雪碧图,但是不怕,我们有 CSS,直接给他来个镜像翻转:

@keyframes move {
    0% {
        left: -10%;
    }
    50% {
        left: 110%;
        transform: rotateY(180deg);
    }
    100% {
        left: -10%;
        transform: rotateY(180deg);
    }
}
复制代码

网络异常,图片无法展示
|

我晕,😂 这不对劲,忘了从 0% 到 50% 反转也会有动画了,优化一下:

@keyframes move {
    0% {
        left: -10%;
    }
    49% {
        left: 110%;
        transform: rotateY(0deg);
    }
    50% {
        left: 110%;
        transform: rotateY(180deg);
    }
    100% {
        left: -10%;
        transform: rotateY(180deg);
    }
}
复制代码

总算是正常了,可以看下效果和代码:

不一定要雪碧图

当然我们也可以看到,steps 动画本身是按照 keyframes 中定义的关键帧来切换的,如果 step 为 1 时,其实不使用雪碧图也是可以的,我们可以直接像一些小游戏一样,将人物状态拆成多张图片,然后直接在 keyframes 中切换 background-image,不过这样得在动画前预先做好图片预加载,否则可能会导致人物跑着跑着某一帧变成空白图片的问题。

总结

css steps 动画的使用场景应该还有一些,只是个人接触的较少,想不到更多了 🤦‍♂️。最近掘金在搞创意挑战赛,学会使用 css 逐帧动画,不妨去试试。

相关文章
|
2月前
|
机器学习/深度学习 前端开发 JavaScript
|
27天前
纯css3实现的百分比渐变进度条加载动画源码
纯css3实现的百分比渐变进度条加载动画特效源码
53 31
|
2月前
|
前端开发 搜索推荐 UED
实现 CSS 动画效果的兼容性
【10月更文挑战第16天】实现 CSS 动画效果的兼容性需要对不同浏览器的特性有深入的了解,并采取适当的策略和方法。通过不断的实践和优化,你可以在各种浏览器上创造出流畅、美观且兼容的动画效果,为用户带来更好的体验。在实际开发中,要密切关注浏览器的发展动态,及时掌握最新的兼容性技巧和解决方案,以确保你的动画设计能够在广泛的用户群体中得到良好的呈现。
113 58
|
12天前
|
Web App开发 移动开发 JavaScript
纯CSS3+SVG实现的节日庆祝五彩纸屑动画效果源码
这是一款基于纯CSS3+SVG实现的节日庆祝五彩纸屑动画效果源码。画面中左下角是一个圆锥形礼炮卡通效果,呈现出节日庆祝时礼花爆破、五彩纸屑纷飞的动画特效。整体动画效果采用纯css3+svg实现,没有引入任何外部图形或js脚本元素。建议使用支持HTML5与css3效果较好的火狐(Firefox)或谷歌(Chrome)等浏览器预览本源码。
31 6
|
22天前
|
前端开发 JavaScript UED
CSS滚动效果和视差滚动的原理、应用及其对用户体验的影响。从平滑滚动到元素跟随,再到滚动触发动画
本文探讨了CSS滚动效果和视差滚动的原理、应用及其对用户体验的影响。从平滑滚动到元素跟随,再到滚动触发动画,这些效果增强了页面的吸引力和互动性。视差滚动通过不同层次元素的差异化移动,增加了页面的深度感和沉浸感。文章还讨论了实现方法、性能优化及案例分析,旨在为设计师和开发者提供实用指导。
50 7
|
27天前
CSS3制作的聚光灯下倒影文字选装动画特效源码
CSS3聚光灯下倒影文字特效是一段基于CSS3实现的聚光灯下带倒影的文字旋转动画效果代码,具有真实的视觉感,同时文字还会在旋转过程中显示出灯光的反射效果,很有意思,欢迎对此段代码感兴趣的朋友前来下载使用。
29 6
|
1月前
|
移动开发 前端开发 JavaScript
除了 CSS3,还有哪些技术可以实现动画效果?
除了 CSS3,还有哪些技术可以实现动画效果?
53 5
|
27天前
纯css3加载loading发光变色动画代码
纯css3加载loading发光变色动画特效代码是一款基于css3 keyframes属性实现的发光变色圆点串联旋转loading加载动画
22 2
|
28天前
|
Web App开发 前端开发 iOS开发
CSS加载动画大全 126种
CSS加载动画大全是一个css Loaders加载动画特效汇总,一共包含126种加载动画效果,不同样式不同图案,简单实用,一览包含所有,会让你在等待的过程中,体验视觉盛宴,给用户不一般的加载体验,欢迎下载试试!代码适用浏览器:搜狗、360、FireFox(建议)、Chrome、Safari、Opera、傲游、世界之窗,是一款不错的的特效插件,希望大家喜欢!
26 2
|
29天前
|
JavaScript 前端开发
CSS3 动画和 JavaScript 动画的性能比较
具体的性能表现还会受到许多因素的影响,如动画的复杂程度、浏览器的性能、设备的硬件条件等。在实际应用中,需要根据具体情况选择合适的动画技术。