css - CSS动画关键帧百分比问题
问题描述
我之前发布过关于 CSS 关键帧动画的文章,并尝试了一种不同的延迟方式。
我有 5 个 div 的 css 连续滑块,效果很好。但是我需要删除两个 div,所以只有三个。
.wrapper{
position: relative;
height: 330px;
display: grid;
overflow: hidden;
width:600px;
background:#f1f1f1;
}
.slide {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
animation: slider 9s cubic-bezier(0.5, 1, 0.5, 1) infinite;
color:#fff;
font-size:30px;
text-align:center;
padding-top:25%;
}
.slide:first-of-type {
animation-delay: -9s;
background:red;
}
.slide:nth-of-type(2) {
animation-delay: -6s;
background:blue;
}
.slide:last-of-type {
animation-delay: -3s;
background:black;
}
@keyframes slider {
0% {
transform: translateX(0);
opacity: 1;
}
16% {
transform: translateX(0);
opacity: 1;
}
20% {
transform: translateX(100%);
opacity: 1;
}
75% {
transform: translateX(100%);
opacity: 0;
}
76% {
transform: translateX(-100%);
opacity: 0;
}
96% {
transform: translateX(-100%);
opacity: 1;
}
}
<div class="wrapper">
<div class="slide">
1
</div>
<div class="slide">
2
</div>
<div class="slide">
3
</div>
</div>
所以我尝试将动画更改为 9 秒,每个 div 3 秒。我已将 div 的延迟分别更改为 -9s、-6s、-3s,但在每个 div 滑入之间都有一个暂停。
我试图改变我认为我出错的百分比。
我想知道是否有人可以就我需要更改的百分比给我一些帮助,或者是否有一个公式可以使用,以便我将来可以在需要时切换 div 的数量?
解决方案
关键帧百分比与您的动画持续时间有关。例如:对于 10 秒动画,10% 是 1 秒标记,50% 是 5 秒标记,100% 是 10 秒标记。
如果您的整个动画长度为 9 秒,并且您有 3 张幻灯片都以 3 秒的偏移量开始,那么您需要确保您的幻灯片在关键的前 33.33%(3 秒)内完成它们的工作-帧动画并在剩余的 66.66%(6 秒)内保持隐藏状态。
现在,在您的情况下,幻灯片过渡不是即时的,因此您必须稍微超过 33.33% 才能确保您的动画很好地重叠而没有间隙。您看到的延迟就是这些差距。
因此,考虑到这一点,您可以像这样简化它们:
@keyframes slider {
/* Start left off screen */
0% {
transform: translateX(-100%);
}
/* Move to visible position within 8% of 9 seconds (less than a second). */
8% {
transform: translateX(0);
}
/* Stay until at least 3 second mark (33% of 9s). */
33.33% {
transform: translateX(0);
}
/* Move offscreen to the right while
the next slide is moving in.
Same duration as slide-in (8%), but starting at 33.33%,
so 33.33% + 8% = 41.33%.
*/
41.33% {
transform: translateX(100%);
}
/* Stay there until the end. */
100% {
transform: translateX(100%);
}
}
这里有一个片段:
.wrapper{
position: relative;
height: 330px;
display: block;
overflow: hidden;
width:600px;
background:#f1f1f1;
}
.slide {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
animation: slider 9s cubic-bezier(0.5, 1, 0.5, 1) infinite;
color:#fff;
font-size:30px;
text-align:center;
padding-top:25%;
}
.slide:first-of-type {
animation-delay: -9s;
background:red;
}
.slide:nth-of-type(2) {
animation-delay: -6s;
background:blue;
}
.slide:last-of-type {
animation-delay: -3s;
background:black;
}
.wrapper{
position: relative;
height: 330px;
display: block;
overflow: hidden;
width:600px;
background:#f1f1f1;
}
.slide {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
animation: slider 9s cubic-bezier(0.5, 1, 0.5, 1) infinite;
color:#fff;
font-size:30px;
text-align:center;
padding-top:25%;
}
.slide:first-of-type {
animation-delay: -9s;
background:red;
}
.slide:nth-of-type(2) {
animation-delay: -6s;
background:blue;
}
.slide:last-of-type {
animation-delay: -3s;
background:black;
}
@keyframes slider {
/* Start left off screen */
0% {
transform: translateX(-100%);
}
/* Move to visible position within 8% of 9 seconds (less than a second). */
8% {
transform: translateX(0);
}
/* Stay until at least 3 second mark (33% of 9s). */
33.33% {
transform: translateX(0);
}
/* Move offscreen to the right while
the next slide is moving in.
Same duration as slide-in (8%), but starting at 33.33%,
so 33.33% + 8% = 41.33%.
*/
41.33% {
transform: translateX(100%);
}
/* Stay there until the end. */
100% {
transform: translateX(100%);
}
}
<div class="wrapper">
<div class="slide">
1
</div>
<div class="slide">
2
</div>
<div class="slide">
3
</div>
</div>
我认为您不需要更改不透明度,因此我将其删除。
当然,您可以更改百分比以增加/减少动画的暂停和速度......只需记住确保显示幻灯片的关键帧与隐藏它的关键帧具有相同的持续时间(在上面的示例中 8 %)。
要在将来添加或删除幻灯片,您只需重新计算该幻灯片数量的百分比。因此,如果您添加 1 张幻灯片总共 4 张,您可以使用 25% 而不是 33.33%。
推荐阅读
- user-experience - 体验设计的设计方向是什么?
- javascript - SetInterval 不会从 HTML 表单的 onClick 事件中运行
- python - 使用带有 cuda 的 pytorch 时视频流很慢
- apache-kafka - Kafka 主题在 Leader 选举后丢失所有副本
- flutter - 飞镖清单
课堂问题 - python - 尝试将油门控制添加到 python 中的并行 API 调用
- java - 如何找出 webflux 在处理请求期间花费最多时间的地方
- python - 获取视频剪辑的最后一帧并使用moviepy扩展10个scends
- azure-data-factory - 使数据工厂中的管道失败的最简单方法?
- c - 通过 FIFO 通道传输数据时阻塞独立进程