我正在尝试制作动画,就像我在打字一样。为实现这一目标,我使用了CSS动画'步骤'
动画本身效果很好。但是,如果我想为多行文本设置动画,它们都会同时开始播放。我没有给我预期的效果。 (在一个<br>
中使用<h1>
尝试,切断了文字,但同时又开始了动画。)
为了解决这个问题,我将下一行文本放在<h2>
中,并为每行文本设置动画延迟。这很有效,但是在动画开始之前文本是可见的。
我希望在动画开始播放之前隐藏文字,以便真正实现&#39;现场打字&#39;影响。
任何人对我如何实现这一点有任何想法?
HTML
<div class="content">
<h1>Hi there! My name is Jeff.</h1>
<h2>And I create cool stuff.</h2>
</div>
CSS
.content h1 {
background:white;
opacity:0.7;
white-space:nowrap;
overflow:hidden;
border-right: 3px solid black;
-webkit-animation: typing 2s steps(26, end),
blink-caret 1s step-end 2s;
}
.content h2 {
background:white;
opacity:0.7;
white-space:nowrap;
overflow:hidden;
border-right: 3px solid black;
-webkit-animation: typing 2s steps(26, end),
blink-caret 1s step-end infinite;
-webkit-animation-delay:3s;
}
@-webkit-keyframes typing {
from { width: 0; }
to { width:400px; }
}
@-webkit-keyframes blink-caret {
from, to { border-color: transparent }
50% { border-color: black }
}
提前致谢。
答案 0 :(得分:3)
最简单的解决方案是添加:
animation-fill-mode:both;
到h2
(带有必要的前缀)。这样,你不会将它设置为动画之外的零宽度,因此不支持此CSS的浏览器将显示标题(我猜你正在追求的是)。请参阅this fiddle。
指定CSS动画之前应如何将样式应用于其目标 并在执行后
在此实例中将其设置为both
意味着您的h2
在开始执行之前的宽度为0
,宽度为{{ 1}}之后。
答案 1 :(得分:1)
由于评论已经包含了一个解决方案,也许这可能是另一种方法 - 通过使用超时并在开头设置visibility: hidden
(为了简化我只是使用jQuery来设置visiblitiy)。
包含以下CSS规则:
.content {
visibility: hidden;
}
您可以使用JavaScript:
window.setTimeout(function() {
$('#contentdiv h1').css('visibility', 'visible');
}, 100);
window.setTimeout(function() {
$('#contentdiv h2').css('visibility', 'visible');
}, 3100);
请参阅jsFiddle
答案 2 :(得分:0)
不是OP的问题,但万一其他人认为这有用:
我希望能够键入动画文本的 pararaph ,单个<p>
标记,其中可能包含要包装的文本,并生成未知数量的实际行。将简单的线性动画应用于p
标签本身是行不通的,所以相反,我采用了几个&#34; hider&#34;覆盖文本段落的元素,每一行高,然后我会为每个元素设置动画,使它们缩小,从它们下面的文本行中显示字符。
HTML看起来像这样:
<div class="container">
<!-- container div is required to set absolute positions within it, so that .typing and .hiders exactly overlap -->
<p class="typing">
This paragraph of text will be animated
with a "typewriter" style effect, and it
will continue to work even if it splits across
multiple lines. Well, in this case, up to a
maximum of 5 lines, but you get the picture.
</p>
<div class="hiders">
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
</div>
</div>
您需要一个容器,并使用.typing
定位.hiders
元素和absolute
,以便它们彼此重叠:
.container {
position: relative;
font-family: Consolas, monospace;
}
.typing {
position: absolute;
top: 0;
margin: 0;
z-index: -1;
}
.hiders {
margin: 0;
position: absolute;
top: 0;
width: 100%;
}
动画将应用于p
内的每个.hiders
:
.hiders p {
position: relative;
clear: both;
margin: 0;
float: right; /* makes animation go left-to-right */
width:0; /* graceful degradation: if animation doesn't work, these are invisible by default */
background: white; /* same as page background */
animation: typing 2s steps(30, end);
animation-fill-mode: both; /* load first keyframe on page load, leave on last frame at end */
}
.hiders p:nth-child(2) {
animation-delay: 2s;
}
.hiders p:nth-child(3) {
animation-delay: 4s;
/* etc */
这是最后的小提琴:
https://jsfiddle.net/hjwp/514cLzxn/
灵感来源:Lea Verou