假设您希望一个元素在循环中以一种状态持续 9 秒,以另一种状态持续 1 秒。
状态之间没有过渡动画,只是直接切换。
前几天我一直在思考如何实现这个功能,Sarah Drasner 向我展示了,可以使用关键帧之间非常短的距离来从一种状态切换到另一种状态。 例如,从 59.999% 切换到 60%。 在 10 秒的正常动画持续时间内,这里没有过渡动画的机会。
查看 CodePen 上 Chris Coyier 的 使用快速关键帧切换状态。
可能更简洁的方法是,如果使用步骤,例如 steps(1)
,您甚至不需要使用 .999 技巧。
div {
...
animation: color 10s steps(10) infinite both;
}
单个关键帧 / 单个步骤切换器
这让我偶然发现了另一个非常奇怪的 CSS 现象。 您可能会认为,如果您使用 steps(1)
,则根本不会发生任何变化,对吗? 因为只有一步? 并非如此,当您使用 steps(1)
时,实际上有 2 步,原因尚不清楚。 我们可以利用这一点。
假设我们要实现本文的原始前提:一种状态持续 9 秒,另一种状态持续 1 秒。 例如,
1-1-1-1-1-1-1-1-1-2
您可以执行以下操作
div {
...
background: orangered;
animation: color 10s steps(1) infinite both;
}
@keyframes color {
90% {
background: teal;
}
}
该 div 仅以 teal
状态持续 1 秒! 然后切换回 orangered
状态。 将关键帧更改为 70%,您将获得
1-1-1-1-1-1-1-2-2-2
将其更改为 10%,您将获得
1-2-2-2-2-2-2-2-2-2
查看 CodePen 上 Chris Coyier 的 2efd2dc514da5485073acd6f4b9f3dab。
更改状态并“保持不变”
我们现在掌握了一个非常酷的技巧,可以用来在定时循环中更改状态。 如果您不想使用循环部分,可以使动画运行一次,然后保持不变,例如
div {
...
background: orangered;
animation: color 10s steps(1) forwards;
}
@keyframes color {
90% {
background: teal;
}
}
我们只删除了使动画重复的 infinite
关键字,并使用了 forwards
关键字,该关键字表示“当动画到达末尾时,保持最后状态的样式”。 (both
关键字也能实现这一点。)
但是,如何通过用户交互从一种状态切换到另一种状态? 甚至这也有可能! 想象一个动画,它的持续时间非常长(比如,几天又几天)。 您可以将用户交互绑定到该动画中的位置(状态)跳转。 这是一个简单的演示,其中单击链接会触发 :target
状态,从而触发动画跳转到关键帧中的位置,并为该状态设置样式。
查看 CodePen 上 Chris Coyier 的 关键帧状态切换器。
只是些技巧,伙计们。 我们将在本世纪一直陪伴着您。
你们玩得太开心了! 太棒了!
还有一些需要注意的地方
steps(1)
相比,step-start
和step-end
定时函数 更容易处理。 默认情况下,steps(1)
等效于step-end
,但您也可以使用steps(1, start)
。如果您为 50% 的值设置了一个关键帧,
step-start
会在动画开始时立即跳到该值,然后在动画时间超过 50% 时,它会立即跳到下一个值(或者,如果您没有下一个关键帧,则恢复为基础值)。 相反,使用step-end
或steps(1)
时,动画将保持在基础值,直到您到达 50% 的点,然后它将跳到 50% 关键帧中的值,并保持该值,直到您到达下一个关键帧的时间点(或到达 100% 的时间)。如果动画以反向或交替方向运行,每个帧的
end
和start
位置(相对于整个时间轴)不会发生变化。 整个动画会倒着播放,每个值的时间相同。如果您希望基于交互启动和停止动画,可以使用
animation-play-state
属性,它的值有running
和paused
。然而,对于仅在交互时更改一次状态,我建议您完全放弃
@keyframes
,而是在:target{}
规则中设置新状态?仅供参考…
PS
为什么在您提交评论时,Markdown 列表会变成没有间距的段落? 它们在预览中效果很好!
测试无序列表
列表项 2
测试有序列表
列表项 2
测试包含段落的有序列表(项目之间有空行)
列表项 2
在预览中显示的效果
PPS,图像嵌入在预览中也有效。 以下是链接:https://s3-us-west-2.amazonaws.com/s.cdpn.io/91525/CSS-Tricks-Comment-Preview-Lies.png
您好 Amelia,我非常喜欢您关于放弃
@keyframes
的想法。 您可以在 pen 中演示您的解决方案吗? 谢谢!除非您指的是像 http://codepen.io/anon/pen/ENXOvw 这样简单的解决方案
很酷。 这在任何情况下都非常有用。 但是我正在考虑用它来替换我构建移动切换结构的旧方法。 我的意思是,纯 CSS 比使用前端框架的导航切换 JavaScript 来实现更轻量级。 感谢您的想法。
好主意,我可能会尝试一下。 感谢您分享。
#WeMakeWebsite
您好,很棒的技巧,一直在寻找避免使用 JavaScript 的方法。 但是有一个问题,我无法弄清楚如何通过单击 X 来关闭导航层。 有人可以指点我正确的方向吗? 谢谢。
也许您可以提供一些 CodePen 代码,这样我们就可以帮助您。
干杯
大家好。 =)
很简单:当您单击带有 [href=”#menu”] 的切换器时,#menu 会获得其 :target 状态。 当您单击关闭按钮(带有 [href=”#0”])时,:target 状态会从 #menu 更改为 #0。
感谢 Azragh。 祝您愉快