文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何理解 CSS step 函数中的 jump-* 关键词?

2024-11-30 12:24

关注

Kapture 2022-01-25 at 10.33.11

原理其实很简单,就是一个 CSS 动画,使用的是steps阶梯函数,不断改变background-position

.logo{
  animation: random 1s steps(10) infinite;
}
@keyframes random {
  to {
    background-position: 100%;
  }
}

里面用到的小图标是这样一张图片(11个小图标)

乍一看,动画好像非常完美,其实还是有一个小小的缺陷,仔细观察,最后一个图标(点赞图标)一直没有出现过,直接被跳过了,文章评论中也有人提到并给出解决方案

但是这种方式不太稳定,background-potion需要考虑实际的帧数,也就是需要根据steps的步数改变。

除了这种方式,其实还有更好的解决方案,今天就一起来探讨这个问题

一、问题重现

为了方便观察和演示,这里用1、2、3来做一张序列帧图片,如下

然后通过 steps阶梯函数实现序列帧动画,关键实现如下

div{
  animation: random 1s steps(2) infinite;
}
@keyframes random {
  to {
    background-position: 100%;
  }
}

效果是这样的(丢失了最后一帧)

Kapture 2023-06-11 at 16.23.09

为啥这里明明有 3 帧,却要设置steps的次数为 2 ?我们不妨设置为 3 试试

animation: random 1s steps(3) infinite;

效果如下

情况就更加糟糕了,而且并不是按照1、2、3的边界变化的,还出现了中间过渡状态,显然不是我们想要的效果。

要搞清楚这个问题,需要理解steps函数中的第 2 个参数,继续往下看。

二、 steps 中的首尾帧忽略规则

steps其实有两个参数,官方语法如下

steps(  [,  ]? )

现在再来看前面的写法

steps(2)

这其实是一个简写,等同于

steps(2, end)

这是什么意思呢,end表示结束,也就是忽略最后一帧,所以上面的例子中,虽然有 3 帧,但忽略最后一帧后就只有 2 帧了,如下

在动画中就是这样,1→2→1→2...

所以,steps(2)表示将原图片分成 3 帧,但是只运行前面 2 帧,最后一帧跳过。

那么,上面的steps(3)也很好理解了吧,将原图片平均分成了 4 份,所以就出现了中间过渡状态

除了end以外,还有一个start

steps(2, start)

start表示开始,也就是忽略最前面的一帧

在动画中就是这样,2→3→2→3...

Kapture 2023-06-11 at 16.44.54

所以,steps(2,start)表示将原图片分成 3 帧,但是只运行后面 2 帧,跳过了第一帧。

那么,有没有办法分成多少帧就运行多少帧呢?当然也是有的,就是后来更新的jump-*关键词

三、steps 中jumb-*关键词

从 Chrome 77+开始,steps支持了几个以jumb-开头的关键词,分别是

下面是官方的一个函数图像(每个实心点表示一帧)

其实我还是比较习惯于用跳过来理解,前面两个就不说了,先看jumb-both

steps(1, jump-both)

去除首尾两帧后,就只剩下中间一帧了,示意如下

image-20230611170734032

最后的动画效果也只有中间一帧了,2→2→2→2...

然后是jump-none

steps(3, jump-none)

表示不跳过,有多少帧就运行多少帧

动画效果就是正常的1、2、3依次变化,1→2→3→1→2→3...

Kapture 2023-06-11 at 17.11.28

根据这个原理,文章开头的小缺陷就非常好解决了,将steps(10)改为steps(11, jump-none)即可

.logo{
  animation: random 1s steps(11, jump-none) infinite;
}
@keyframes random {
  to {
    background-position: 100%;
  }
}

这样就可以正常的看到最后一个图标了

你也可以访问以下任意链接:

之前的效果(注意对比观察最后一个点赞图标)

四、最后总结一下

其实这个特性也已经出来好几年了,但是好像很少有人知道,主要原因是这个特性使用场景不太丰富,并且有替代方案,再者,这个特性是旧属性的补充,导致在文档上不易轻易被发现(我也是无意发现的😂)。兼容性方面,Safari还是有些拉胯,需要14+才行,完整兼容性如下:

来源:前端侦探内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯