CSS动画打字

时间:2013-04-10 12:02:36

标签: html css animation

我正在尝试制作动画,就像我在打字一样。为实现这一目标,我使用了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 }
}

jsFiddle

提前致谢。

3 个答案:

答案 0 :(得分:3)

最简单的解决方案是添加:

animation-fill-mode:both;

h2(带有必要的前缀)。这样,你不会将它设置为动画之外的零宽度,因此不支持此CSS的浏览器将显示标题(我猜你正在追求的是)。请参阅this fiddle

animation-fill-mode

  

指定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>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</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