answer provided by spacegeek224 是在正确的轨道上,但它是部分的,这就是为什么你仍然看到它有问题。
根据您的代码,li 元素的初始width 是30em,并且在动画的关键帧中指定width 应该为from 0em 设置动画。当在一个元素上设置了animation-delay 并且没有指定animation-fill-mode: backwards 时,该元素将继续保持在@keyframes 之外指定的状态,直到经过延迟时间。这就是为什么所有li 从一开始就对您可见的原因。
如果指定了animation-fill-mode: backwards,则元素将继续保持其第一个关键帧(即0% 或from)的状态,直到经过延迟时间。因此,元素将在延迟期间占用width: 0,因此在动画开始之前变得不可见。
根据W3C Spec:
如果“animation-fill-mode”的值为“backwards”,则动画将在“animation-delay”定义的时间段内应用关键帧中定义的属性值,该关键帧将开始动画的第一次迭代'。
要注意的另一件事是,如果您希望所有元素一个接一个地设置动画,那么它们的延迟应该设置为等于所有先前元素完成它们所需的总时间动画。所以:nth-child(2) 上的延迟是3s,:nth-child(3) 应该是4.5s 等等。
演示:
应用上述两个更正,下面的 sn-p 将根据您的需要工作。
body {
background: #272822;
padding-top: 10px;
}
li {
color: white;
font-family: "Courier";
font-size: 16px;
margin: 10px 0 0 10px;
white-space: nowrap;
overflow: hidden;
width: 30em;
animation: type 1.5s steps(30, end) backwards;
}
li:nth-child(2) {
animation-delay: 1.5s;
}
li:nth-child(3) {
animation-delay: 3s;
}
li:nth-child(4) {
animation-delay: 4.5s;
}
li:nth-child(5) {
animation-delay: 6s;
}
li:nth-child(6) {
animation-delay: 7.5s;
}
.red {
color: red;
}
.green {
color: green;
}
.white {
color: white;
}
.yellow {
color: yellow;
}
@keyframes type {
from {
width: 0;
}
}
@keyframes type2 {
0% {
width: 0;
}
50% {
width: 0;
}
100% {
width: 100;
}
}
<div class="codeWriteOn">
<ul class="MonokaiBright">
<li>
<span><</span><span class="red">ul</span>
<span class="green">class</span>=<span class="yellow">“markup”</span><span>></span>
</li>
<li class="project1">
<span><</span><span class="red">li</span>
<span class="green">class</span>=<span class="yellow">“project1”</span><span>></span>
<!-- ">" --><span>Project-1<</span><span class="red">/li</span><span>></span>
</li>
<li class="project2">
<span><</span><span class="red">li</span>
<span class="green">class</span>=<span class="yellow">“project2”</span><span>></span>
<!-- ">" --><span>Project-2<</span><span class="red">/li</span><span>></span>
</li>
<li class="project3">
<span><</span><span class="red">li</span>
<span class="green">class</span>=<span class="yellow">“project3”</span><span>></span>
<!-- ">" --><span>Project-3<</span><span class="red">/li</span><span>></span>
</li>
<li class="project4">
<span><</span><span class="red">li</span>
<span class="green">class</span>=<span class="yellow">“project4”</span><span>></span>
<!-- ">" --><span>Project-4<</span><span class="red">/li</span><span>></span>
</li>
<li>
<</span><span class="red">/ul</span><span>></span>
</li>
</ul>
</div>
替代方法:
在不添加animation-fill-mode: backwards 的情况下使动画正常工作的另一种方法是将li 元素的默认width 设置为0,然后对其进行动画处理to30em 而不是对其进行动画处理@987654349 @0。这意味着在延迟期间width 仍将是0,因此li 将不可见。
但是,在这种情况下,应添加animation-fill-mode: forwards 以使li 保持其最终关键帧的状态。否则,动画完成后它会变回不可见(width: 0)。
body {
background: #272822;
padding-top: 10px;
}
li {
color: white;
font-family: "Courier";
font-size: 16px;
margin: 10px 0 0 10px;
white-space: nowrap;
overflow: hidden;
width: 0;
animation: type 1.5s steps(30, end) forwards;
}
li:nth-child(2) {
animation-delay: 1.5s;
}
li:nth-child(3) {
animation-delay: 3s;
}
li:nth-child(4) {
animation-delay: 4.5s;
}
li:nth-child(5) {
animation-delay: 6s;
}
li:nth-child(6) {
animation-delay: 7.5s;
}
.red {
color: red;
}
.green {
color: green;
}
.white {
color: white;
}
.yellow {
color: yellow;
}
@keyframes type {
to {
width: 30em;
}
}
@keyframes type2 {
0% {
width: 0;
}
50% {
width: 0;
}
100% {
width: 100;
}
}
<div class="codeWriteOn">
<ul class="MonokaiBright">
<li>
<span><</span><span class="red">ul</span>
<span class="green">class</span>=<span class="yellow">“markup”</span><span>></span>
</li>
<li class="project1">
<span><</span><span class="red">li</span>
<span class="green">class</span>=<span class="yellow">“project1”</span><span>></span>
<!-- ">" --><span>Project-1<</span><span class="red">/li</span><span>></span>
</li>
<li class="project2">
<span><</span><span class="red">li</span>
<span class="green">class</span>=<span class="yellow">“project2”</span><span>></span>
<!-- ">" --><span>Project-2<</span><span class="red">/li</span><span>></span>
</li>
<li class="project3">
<span><</span><span class="red">li</span>
<span class="green">class</span>=<span class="yellow">“project3”</span><span>></span>
<!-- ">" --><span>Project-3<</span><span class="red">/li</span><span>></span>
</li>
<li class="project4">
<span><</span><span class="red">li</span>
<span class="green">class</span>=<span class="yellow">“project4”</span><span>></span>
<!-- ">" --><span>Project-4<</span><span class="red">/li</span><span>></span>
</li>
<li>
<</span><span class="red">/ul</span><span>></span>
</li>
</ul>
</div>
注意:
在上面的 sn-p 中,在第一行之后可能看起来有很长的延迟/暂停,但这不是关键帧的问题。这是因为即使在整个文本变得可见之后,该元素仍会以完整宽度 (30em) 进行动画处理。
在下面的 sn-p 中,我为每个 li 元素添加了一个 background,以便您可以直观地了解我的意思。
body {
background: #272822;
padding-top: 10px;
}
li {
color: white;
font-family: "Courier";
font-size: 16px;
margin: 10px 0 0 10px;
white-space: nowrap;
overflow: hidden;
width: 30em;
background: mediumslateblue;
animation: type 1.5s steps(30, end) backwards;
}
li:nth-child(2) {
animation-delay: 1.5s;
}
li:nth-child(3) {
animation-delay: 3s;
}
li:nth-child(4) {
animation-delay: 4.5s;
}
li:nth-child(5) {
animation-delay: 6s;
}
li:nth-child(6) {
animation-delay: 7.5s;
}
.red {
color: red;
}
.green {
color: green;
}
.white {
color: white;
}
.yellow {
color: yellow;
}
@keyframes type {
from {
width: 0;
}
}
@keyframes type2 {
0% {
width: 0;
}
50% {
width: 0;
}
100% {
width: 100;
}
}
<div class="codeWriteOn">
<ul class="MonokaiBright">
<li>
<span><</span><span class="red">ul</span>
<span class="green">class</span>=<span class="yellow">“markup”</span><span>></span>
</li>
<li class="project1">
<span><</span><span class="red">li</span>
<span class="green">class</span>=<span class="yellow">“project1”</span><span>></span>
<!-- ">" --><span>Project-1<</span><span class="red">/li</span><span>></span>
</li>
<li class="project2">
<span><</span><span class="red">li</span>
<span class="green">class</span>=<span class="yellow">“project2”</span><span>></span>
<!-- ">" --><span>Project-2<</span><span class="red">/li</span><span>></span>
</li>
<li class="project3">
<span><</span><span class="red">li</span>
<span class="green">class</span>=<span class="yellow">“project3”</span><span>></span>
<!-- ">" --><span>Project-3<</span><span class="red">/li</span><span>></span>
</li>
<li class="project4">
<span><</span><span class="red">li</span>
<span class="green">class</span>=<span class="yellow">“project4”</span><span>></span>
<!-- ">" --><span>Project-4<</span><span class="red">/li</span><span>></span>
</li>
<li>
<</span><span class="red">/ul</span><span>></span>
</li>
</ul>
</div>