Page 245 - css揭秘
P. 245

@keyframes typing {
                                                      from { width: 0 }
                                                  }

                                                  h1 {
                                                      width: 7.7em; /* 文本的宽度 */
                                                      animation: typing 8s;
                                                  }


                                                  代码看起来非常合理,对吧?但我们在图 8-23 中可以看到,它产生的
                                              结果简直就是车祸现场,跟我们想要的打字效果一点关系也没有。

                                                  你可能已经猜到问题出在哪儿了。首先,我们忘了用 white-space:
                                              nowrap; 来阻止文本折行,因此文本的行数会随着宽度的扩张不断变化。其
                                              次,我们忘了加上 overflow:  hidden;,所以超出宽度的文本没有被裁切
                                              掉。不过,当我们修复了这两个小问题之后,真正的大问题才会浮出水面
                                             (参见图 8-24)。

                                                     „ 最明显的问题是整个动画是平滑连贯的,而不是逐字显现的。
                                                     „ 另一个不那么明显的问题是,目前我们已经用 em 单位指定了宽度,
                    图 8-23                           虽然它比像素单位要好一些,但仍然不够理想。这个宽度为什么是
                    我们尝试打字动画的第一步,完                   7.7 ?我们是怎么算出来的?
                    全没有模拟出打字的感觉
                                                  我们可以用 steps() 来修复第一个问题,就像“逐帧动画”和 “闪烁效
                                              果”中所做的那样。但不幸的是,我们所需要的步进数量是由字符的数量来
                                              决定的,这显然是很难维护的,而且对于动态文字来说更是不可能维护的。
                                              不过,我们稍后将看到,可以用一小段 JavaScript 代码来把这件事情自动化。

                                                  第二个问题可以通过 ch 单位来缓解。这个 ch 单位是由 CSS 值与单位
                                             (第三版)(http://w3.org/TR/css3-values)规范引入的一个新单位,表示“0”
                    图 8-24
                                              字形的宽度。它应该是最不为人知的一个新单位,因为在绝大多数场景下,
                    我们的第二次尝试已经相当接近
                    了,但还差那么一点                 我们并不关心 0 这个字符显示出来到底有多宽。但对等宽字体来说,这是个
                                              例外。在等宽字体中,“0”字形的宽度和其他所有字形的宽度是一样的。因
                                              此,如果我们用 ch 单位来表达这个标题的宽度,那取值实际上就是字符的
                                              数量:在这个例子中就是 15。

                                                  我们把上面的这些想法综合起来:

                                                  @keyframes typing {
                                                      from { width: 0; }
                                                  }

                                                  h1 {
                                                      width: 15ch; /* 文本的宽度 */
                                                      overflow: hidden;
                                                      white-space: nowrap;
                                                      animation: typing 6s steps(15);
                                                  }






                  214   第 8 章 过渡与动画







          ඀ࠡ  JOEC
   240   241   242   243   244   245   246   247   248   249   250