Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >过渡与动画 - 逐帧动画&steps调速函数

过渡与动画 - 逐帧动画&steps调速函数

作者头像
okaychen
发布于 2018-01-05 03:48:12
发布于 2018-01-05 03:48:12
1.5K00
代码可运行
举报
文章被收录于专栏:前端那些事前端那些事
运行总次数:0
代码可运行

写在前面

上一篇中我们熟悉五种内置的缓动曲线和(三次)贝塞尔曲线,并且基于此完成了缓动效果.

但是如果我们想要实现逐帧动画,基于贝塞尔曲线的调速函数就显得有些无能为力了,因为我们并不需要帧与帧之间的过渡状态,就像上篇中所看到的,所有基于贝塞尔曲线的调速函数都会在关键帧之间进行插值运算,从而产生平滑的过渡效果。

这个特性显然很棒,平滑的效果确实是我们使用css过渡和动画所追求的。

但是在逐帧动画的场景下,这种平滑的特性恰恰毁掉了我们想要实现的逐帧动画的效果.

逐帧动画

我们经常会看到一段卡通影片、一个复杂进度的提示框、一个小loading, 我们不会单纯的选择一张GIF动画胜任,因为它的局限性和短板表现的很明显.

  • GIF图片所能使用的颜色数量被限制在256色
  • GIF不具有Alpha透明的特性,
  • GIF动画一旦生成,参数就固定在文件内部,只能通过图像处理软件去重新生成. 在某些场景下,基于图片的逐帧动画成了不错的选择。

steps()调速函数

写在前面中提到,我们不能基于贝塞尔曲线的调速函数完成我们所需要的逐帧动画,那么采用什么调速函数呢?

对,答案就是steps()调速函数,与贝塞尔曲线迥然不同的是,steps()会根据你指定的步进数量,把动画分为很多帧,而且整个动画会在帧与帧之间硬切,不会像贝塞尔曲线那样做插值处理。

通过上图我们可以很明显看出steps(8)、linear和ease的区别.

其实这种硬切效果是我们极力避免的,因此我们也很少听到关于steps()的讨论。在CSS调速函数的世界里,基于贝塞尔曲线的调速函数就像是被人追捧的白天鹅,而steps()则是旁人唯恐不及的丑小鸭。

其实无所谓好与不好,更多的是适合与不适合,我们都崇拜的贝塞尔曲线在像小"loading"这样的逐帧动画中失败了,而steps()却展示出我们想要的效果.

这个想法最初是Simurai在他的博客中推出http://simurai.com/blog/2012/12/03/step-animation,他使用steps()实现拼合图片的动画效果.让人印象深刻

codepen中查看效果

ch单位 - css值与单位第三版

有时候,我们希望一段为本字符逐个显示,模拟出一种打字的效果。这种效果在技术类网站中尤为常见,用等宽字体可以营造出一种终端命令行的感觉.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<h1>CSS is amazing!</h1>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@keyframes typing{
    from{width:0}
}
h1{
    width:7.7em;
    white-space:nowrap;
    overflow:hidden;
    animation:typing 8s;
}

我们想要模拟出一种打字效果,但是

  • 整个动画是平滑连贯的,而不是逐字显示
  • 目前我们已经使用em指定宽度是7.7,虽然他比像素单位好一些,但是仍然不够理想,这个宽度为什么是7.7em.

我们很自然的想到了使用steps()来修复第一个问题,但是不幸的是,我们所需要的步进数量是由字符的数量来决定的

CSS值与单位(第三版)规范引入了一个新的单位,表示"0"字形的宽度。大多数场景下,我们不必关心"0"字形的宽度到底有多宽,因为在等宽字体中,"0"字形的宽度和其他所有字形的宽度是一样的。因此,我们如果使用ch单位来表示h1的宽度,那取值实际上就是字符的数量:在上面的例子中就是15

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@keyframes typing{
    from{ width:0 }
}
@keyframes caret{
    50%{ border-color:transparent }
}
h1{
    width:15ch;
    overflow:hidden;
    white-space:nowrap;
    border-right:0.5em solid;
    animation:typing 6s steps(15),caret 1s steps(1) infinite;
}

但是我们还是有些疑问:

  • 这样的代码是不易维护的,当更新标题的时候,我们总是需要根据字符的数量来指定不同的宽度样式和steps()函数,这时候正是JavaScript的用武之地 function $$(selector,context){ context = context||document; var elements = context.querySelector(selector); return Array.prototype.slice.call(elements); } $$('h1').forEach(function(h1){ var len = h1.textContent.length,s = h1.style; s.width = len + 'ch'; s.animationTimingFunction = "steps(" + len + "),steps(1)" })
  • 如果浏览器不支持ch单位,我们该怎么办?这时候就需要实现样式的回退,如果不希望字体出现异常,会选择补一行em作为单位的回退样式

写在最后

这一篇主要基于steps()函数和ch单位,详细的比较了steps()调速函数和基于贝塞尔曲线调速函数的区别,虽然steps()调速函数像是旁人唯恐不及的丑小鸭,但是它亦有其独特的魅力。

参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-12-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
编辑精选文章
换一批
Css3新特性应用之过渡与动画
一、缓动效果 学习和利用贝塞尔曲线,默认支持ease,ease-in,ease-out,ease-in-out和linear等 还提供一个cubic-beizer自定义贝塞尔曲线的起点和终点 Css中只支持一条贝塞尔曲的运动,不能连续多段 对cubic-beizer中控制锚点的水平坐标与垂直坐标互换,就可以得到任何调整函数的反向版本 cubic-beizer(.1,.25,1,.25)是ease的反向调整函数 水平坐标只能在0~1的范围内,因为水平坐标表示的是时间 垂直坐标可以超过此范围,表示为运动距离
sam dragon
2018/01/17
1.1K0
妙啊!动画还可以这样控制?
今天,有在群里看到这样一个问题:有一个动画,一开始静止处于第一帧,只在用户 hover 的时候运行动画,在运行一次后停止,并且停留在最后一帧,使用 CSS 可以完成么?
Sb_Coco
2022/05/26
6120
妙啊!动画还可以这样控制?
过渡与动画 - 缓动效果&基于贝塞尔曲线的调速函数
根据用户输入的文本,通过程序自动生成的摘要,包括文章主要内容、重要细节和结论等信息。
okaychen
2017/12/22
2.9K0
手把手教你实现「京喜工厂」的CSS动画效果
今年Q1(2020年第一季度)参与了京喜事业部「京喜工厂」业务的前端开发。用户可以通过「京喜工厂」参与口罩、抽纸、大米等商品的“在线生产”,既能趣味造物,又能免费领奖品。目前可以通过「京喜」小程序首页访问该活动。
WecTeam
2020/05/21
1.5K0
网页|CSS的动画实现
一些CSS属性是可以实现动画效果,即我们可以用CSS实现动画和过渡。而动画属性的实现其实就是,属性逐渐地从一个值变化到另一个值,比如尺寸大小、数量、百分比和颜色,也就是通过设置多个节点来精确控制一个,或一组动画,常用来实现复杂的动画效果从而实现动画。动画是CSS最具有颠覆性的特征之一,接下来我们就来感受一下CSS的动画吧。
算法与编程之美
2019/11/29
1.4K0
深入浅出 CSS 动画
本文将比较全面细致的梳理一下 CSS 动画的方方面面,针对每个属性用法的讲解及进阶用法的示意,希望能成为一个比较好的从入门到进阶的教程。
Sb_Coco
2022/03/10
1.9K0
深入浅出 CSS 动画
Web - CSS3过渡与动画
transition过渡属性是css3浓墨重彩的特性,过渡可以为一个元素在不同样式之间变化自动添加补间动画。
stark张宇
2025/02/07
1320
【动画进阶】类 ChatGpt 多行文本打字效果
这个效果其实本身并非特别困难,实现的方式也很多,在本文中,我们更多的会聚焦于整个多行打字效果最后的动态光标的实现。
Sb_Coco
2024/07/02
3150
【动画进阶】类 ChatGpt 多行文本打字效果
动画:从 AE 到 Web,‘甩锅’给设计师
接下来因工作调整,应该就很少接触 H5 开发了。借此机会总结对动画的一些个人思考。
用户4962466
2019/08/02
3.5K0
记GIF动画转CSS逐帧动画工具
翻到了 2018 年左右团队支持的一个项目,当时看重构同学不断的在和设计师来回沟通调动画细节,就在想能不能提升下这里的效率,于是了解了下当时的实现过程,大概是这样的:
GhostZhang
2022/08/22
1.5K0
记GIF动画转CSS逐帧动画工具
前端动效讲解与实战
本文将从各个角度来对动画整个体系进行分类,并且介绍各种前端动画的实现方法,最后我们将总结在实际开发中的各个场景的动画选择方案。
2020labs小助手
2022/09/26
2.8K0
使用steps实现逐帧动画
开发中,一般配合精灵图实现动画效果。 将动画过程分成N份进行: animation-timing-function: steps(N); 精灵动画制作步骤 1.准备显示区域 设置盒子尺寸是一张小图的尺寸,背景图为当前精灵图。 /* 1680/12 : 保证显示区域的尺寸和一个精灵小图的尺寸相同 */ width: 140px; height: 140px; 2.定义动画 改变背景图的位置,移动的距离就是精灵图的宽度。 动画的开始状态和盒子的默认样式相同的, 可以省略开
岳泽以
2022/10/26
5090
使用steps实现逐帧动画
H5动效的常见制作手法 - 腾讯ISUX
众所周知,一个元素,动往往比静更吸引眼球; 一套操作界面,合适的动态交互反馈能给用户带来更好的操作体验; 一个H5运营宣传页,炫酷的动画特效定能助力传播和品牌打造。 近两年,小到loading动画,表
腾讯ISUX
2018/06/29
5K0
CSS3过渡与动画
   增强页面渲染性能,提前通知浏览器元素将要做什么动画,让浏览器提前准备合适的优化设置
Leophen
2019/08/23
8230
前端动画实现 - 笔记
无论动画多么简单,始终需要定义两个基本状态,即开始状态和结束状态。没有它们,我们将无法定义插值状态,从而填补了两者之间的空白。
TagBug
2023/03/17
2.3K0
前端动画实现 - 笔记
你不知道 CSS 可以做的 4 件事
这样就实现了延时1s,一共0.5s的淡入动画。其中ease是animation-timing-function的默认值。animation-timing-function使用了三次贝塞尔(Cubic Bezier)函数生成速度曲线,可以让我们的动画产生平滑的过渡。但是有的时候我们并不想要平滑的过渡,比如想要实现下面小人跑动的效果,该怎么实现呢?
桃翁
2021/09/10
1.4K0
你不知道 CSS 可以做的 4 件事
2019年了,你还不会CSS动画?
今年我面试了很多同学,只要看到简历上写“熟练掌握CSS3”的,我都会问问动画相关知识。然而我发现:都 2019 年了,还有很多同学不会 CSS 动画。
Nealyang
2019/11/04
4580
Android 逐帧动画:关于 逐帧动画 的使用都在这里了!
前言 动画的使用 是 Android 开发中常用的知识 可是动画的种类繁多、使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策 本文将详细介绍 Android 动画中
Carson.Ho
2019/02/22
1.9K0
Css3 Animation 动画原则四
连续运动是绘制动画的每一帧,姿态对应是通常由一个 assistant 在定义一系列关键帧后填充间隔。
grain先森
2019/03/29
4010
Css3 Animation 动画原则四
文字轮播与图片轮播?CSS 不在话下
我们来简单分析分析,从表面上看,确实好像只有元素的 transform: translate() 在位移,但是注意,这里有两个难点:
Sb_Coco
2022/06/12
1.9K0
文字轮播与图片轮播?CSS 不在话下
相关推荐
Css3新特性应用之过渡与动画
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验