文字旅行者:一种文本加载(类似打字机)效果

我的博客首页会在一段时间后加上一个作品区域,每个区域都会点缀一点点动效。在 Nautil 的部分,我想实现一个效果,就是在 Nautil 这个单词后面,不断切换 Nautilidae, Nautilus, Nautil.js 这几个单词,效果就像用键盘输入、删除再输入的效果。

在谷歌搜索了一段时间后,我确信没有一个库能够完完整整的实现这个效果。它们都实现了输入效果,但是没有回删效果。于是,我只能自己写一个 js 库来实现这个效果。最终的效果你可以在我的博客首页看到。但是,后来我觉得,这是一个非常不错的效果,虽然在我的博客上看到的是一个输入的效果,但是实际上,对它重新思考,会发现它比这个效果的想象空间大很多。你可以用它来断句、给视频打字幕、利用文字翻语音接口朗读小说。它像一个具有生命的灵活工具,因此,我称它为“文字旅行者”(github:TextTraveler)。

遍历文本怎么才能做到对开发者友好呢?我们以“视频字幕”来举例,如果你想写一个视频字幕,你会怎样?对于我来说,我想象中的写字幕的方式,就是在剧本中打断点。那么什么样的方式可以让我们打断点呢?我想到了 ES6 的字符串模板标签。于是,一个字幕效果就出来了:

`你話三年。${[0,100,1]}三年之後又三年,${[0,100,1]}三年之後又三年!${[0,100,1]}十年都嚟緊頭啦老細!${[0,1000]}`

通过在字符串模板中加入占位符,就可以给字符串打断点了。每个断点的地方加入参数,用以控制该断点前面的文字,将会以怎样的时间或行为出现在字幕中。

如何利用这些参数呢?

使用标签函数即可。我写了 travelText 这个标签函数,它可以生成一个 text traveler 用以处理每个段落。

const traveler = travelText`你話三年。${[0,100,1]}三年之後又三年,${[0,100,1]}三年之後又三年!${[0,100,1]}十年都嚟緊頭啦老細!${[0,1000]}`

接下来所有的事情就交给 traveler 去做。但他实际上只是一个记录者,你可以通过 on 方法监听他记录的内容,并作出相应的界面修改。

而为了更方便的实现我想要的那个效果,我又写了 createTextWriter 函数,它直接在一个 DOM 元素中不断的根据 traveler 的记录情况重写 html 中的文本,从而达到我想要的效果。

一切的一切都在 github 上。