css3 loading动画之打字效果

前言

最近在重温《css权威指南》,看到第5章字体时font-family属性有一个关键字叫monospace,也就是等宽字体:每一个字符的宽度都是等宽的。
这个monospace字体,一开始就是因为技术局限性,打字机无法实现字母宽度自适应而使用的一种字体。

//代码块中使用了等宽字体,字母i的宽度与字母m的宽度是一样的。
var i = 'iiiiiiii';
var m = 'mmmmmmmm';

而在非代码块中:
var i = 'iiiiiiii';
var m = 'mmmmmmmm';
使用的就是宽度自适应的字体,字母i明显比字母m要窄。

那么这个属性的等宽特点有什么应用场景呢?

应用场景

我想到的一个应用场景就是利用宽度来实现具有打字效果的loading动画:

  1. 有闪烁的光标;
  2. 文本为loading...;
  3. 固定时间间隔显示一个字符;
  4. 能够循环显示。

实现效果

循环播放的loading动画

实现思路

首先是文档结构:

<!--只有一行p标签。-->
<p class="load-text">loading...</p>

其次是最重要的css代码:

/*光标动画*/
@keyframes caret {
    50% {border-color: transparent;}
}

/*文本动画:从宽度为0开始*/
@keyframes text {
    from {width: 0;}
}

.load-text {
    width: 11ch;
    margin: 0 auto;
    overflow: hidden;
    word-break: keep-all;
    background: rgba(181, 219, 136,0.2);
    color: #b1f1f3;
    border-right: 3px solid #000000;
    font: bold 400% monospace;
    animation: caret 0.5s step-end infinite ,text 5s infinite steps(11);
}

最后是代码解释:

光标的实现

利用p标签的右边框,设置0.5s动画将其边框色改为transparent即可。


光标动画

动态打字的实现

动态打字效果的本质就是p标签的宽度从0增加到文本的宽度时,其文本会逐个展示出来。那么如何控制每一次增加的正好是一个字符的宽度呢?


p标签的宽度在不断增加

这就要说到两个关键的东西:font-family:monospace和ch长度单位

monospace之前已经讲过了,而ch这个单位相信很多前端同行都没有听说过,按照标准,1ch就是当前字体环境中数字 0 的宽度,那么在字体为monospace的情况下,1ch就是所有字符的宽度。

理解了这两个东西,我们就可以在css中设置p标签的字体为monospace,同时宽度设置width:11ch,因为loading....一共有10个字符,但是关键帧应当有(0,1,2,3,4,5,……,10)一共11个,所以添加一个字符的宽度。

除了这两个关键属性外,就是样式的设置了。overflow:hidden;和word-break:keep-all;是为了防止中文字符在p标签宽度不够的情况下出现自动换行的bug。

animation:text 5s infinite steps(11);是利用了steps()值设定步长,因为一共11ch的长度,所以设定11个步长。然后设置infinite来实现无限循环。
注意:汉字的长度是2个字符长度,设定的步长和宽度要X2。

源码

我把源码放在自己的工具仓库了,欢迎star。
tools/loading

总结

我在写这篇文章之前,看过很多网上实现打字机效果的demo,大部分都是配合js或者jquery插件来实现,方法的使用范围较广,但是代码量较多。而实际上只需要利用monospace和ch长度单位就可以实现简单的打字机效果。所以说合理利用css的某些属性能够帮助我们减少一定的工作量。

题外话

这段时间,我也在看张鑫旭的博客,从2009年一直到2016年的每一篇文章,他理解的css和我理解的css真的是两个层面。不得不说我以前还是停留在表面,没有深入去思考css实现效果的原理和机制,跟资深的前端程序员比起来自己真是井底之蛙。希望以后能努力学习知识,有一天能够与这些大神共事。

非常感谢你能够看完这篇文章,如果有什么意见,欢迎在评论中指出。非常乐意与各位交流学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容