基本动画很简单:定义关键帧、命名动画、应用于元素。但有时需要更复杂的技巧才能达到理想的动画效果。例如,声音均衡器可能对每个条形使用相同的动画,但它们是交错的,以产生独立动画的错觉。
最近在构建仪表板时,希望其中一个小部件的项目以交错动画的方式显示。
就像上面的声音均衡器一样,我开始使用:nth-child
选择器。我使用无序列表(<ul></ul>
)作为父容器,赋予它一个类,并使用:nth-child
伪选择器来通过animation-delay
偏移每个列表项的动画。
.my-list li { animation: my-animation 300ms ease-out; } .my-list li:nth-child(1) { animation-delay: 100ms; } .my-list li:nth-child(2) { animation-delay: 200ms; } .my-list li:nth-child(3) { animation-delay: 300ms; } /* 以此类推 */
此技术确实可以很好地交错项目,特别是如果您知道列表中在任何给定时间有多少项目。但是,当项目数量不可预测时(这正是我为仪表板构建的小部件的情况),这种方法就会失效。我确实不想每次列表中项目数量发生变化时都返回到这段代码,所以我编写了一个快速的 Sass 循环,它最多可以处理 50 个项目,并随着每个项目的增加而增加动画延迟:
.my-list { li { animation: my-animation 300ms ease-out; @for $i from 1 through 50 { &:nth-child(#{$i}) { animation-delay: 100ms * $i; } } } }
这应该可以解决问题!然而,感觉太笨拙了。当然,它不会给文件增加太多重量,但是您知道编译后的 CSS 将包含许多未使用的选择器,例如 nth-child(45)
。
一定有更好的方法。通常我会求助于 JavaScript 来查找所有项目并添加延迟,但是……这次我花了一些时间探索一下是否可以用 CSS 独自完成。
CSS 计数器怎么样?
我首先想到的是将 CSS 计数器与 calc()
函数结合使用:
.my-list { counter-reset: my-counter; } .my-list li { counter-increment: my-counter; animation-delay: calc(counter(my-counter) * 100ms); }
不幸的是,这行不通,因为规范说明计数器不能在 calc()
中使用:
calc()
表达式的组件可以是字面值或attr()
或calc()
表达式。
事实证明,一些人喜欢这个想法,但它还没有超出草案阶段。
数据属性怎么样?
在阅读了规范的摘录后,我了解到 calc()
可以使用 attr()
。并且,根据 CSS 值和单位规范:
在 CSS3 中,
attr()
表达式可以返回许多不同类型的值
这让我想到;也许数据属性可以解决问题。
- Item 1
- Item 2
- Item 3
- Item 4
.my-list li { animation-delay: calc(attr(data-count) * 150ms); }
但是我的希望破灭了,因为这个的浏览器支持非常糟糕!
此浏览器支持数据来自 Caniuse,其中包含更多详细信息。数字表示浏览器在该版本及更高版本中支持该功能。
桌面
移动/平板电脑
所以,回到绘图板。
自定义属性怎么样?
我的下一个想法是使用 CSS 自定义属性。它并不漂亮,但它有效了 ?
事实证明它也很灵活。例如,动画可以反转:
它还可以做一些完全随机的事情 并且 同时动画元素:
我们甚至可以更进一步,做一个对角线挥动:
浏览器支持并没有那么糟糕(戳戳 Internet Explorer)。
此浏览器支持数据来自 Caniuse,其中包含更多详细信息。数字表示浏览器在该版本及更高版本中支持该功能。
桌面
移动/平板电脑
CSS 的一个很棒的功能是它会忽略它不理解的东西,这要归功于级联。这意味着所有内容都将一起动画到视图中。如果这不是您的风格,您可以添加一个功能查询来覆盖默认动画:
.my-list li { animation: fallback-animation; } @supports (--variables) { .my-list li { animation: fancy-animation; animation-delay: calc(var(--animation-order) * 100ms); } }
原生 CSS 万岁
我越停下来问自己是否需要 JavaScript,就越惊讶于 CSS 本身可以做什么。当然,如果 CSS 计数器可以在 calc()
函数中使用,那将是一个非常优雅的解决方案。但就目前而言,内联自定义属性提供了一种强大而灵活的方法来解决此问题。
以上是创建交错动画的不同方法的详细内容。更多信息请关注PHP中文网其他相关文章!

对于Astro,我们可以在构建过程中生成大部分网站,但是有一小部分服务器端代码可以使用Fuse.js之类的搜索功能来处理搜索功能。在此演示中,我们将使用保险丝搜索一组个人“书签”


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

Dreamweaver Mac版
视觉化网页开发工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

SublimeText3汉化版
中文版,非常好用