TheaterJS:模仿人类打字效果的 JavaScript 动

2020-03-02  本文已影响0人  五花漏Z
TheaterJS是一个用于模拟人输入行为的JS库。
下面是一个简单完整的Demo,模拟了两个角色(Vader、luke)的对话,可以打开看一下运行效果和代码,然后复制代码到自己的项目中,试一试。
https://codepen.io/Zhouzi/pen/JoRazP

首先进行准备工作:

1、安装依赖npm install theaterjs
2、在你要写代码的页面引入theaterjs插件import theaterJS from 'theaterjs'

接下来开始看一下代码:

HTML:

<div class="body">
    <main class="scene">
      <!-- 此处有两个角色,vader和luke -->
      <div class="actor">
        <div class="actor__prefix">-</div>
        <div id="vader" class="actor__content"></div>
      </div>
      <div class="actor">
        <div class="actor__prefix">-</div>
        <div id="luke" class="actor__content"></div>
      </div>
    </main>
  </div>

CSS:(只有一部分)

.dark {
  color: $color-white;
  background-color: $color-black;
}
.actor__content--typing::after {//添加打字和删除时的光标
  content: '|';
  animation: blink 500ms infinite;
}

JS:

mounted(){
    //1,初始化一个theaterJS对象
    var theater = theaterJS()    
    //2,将演员添加到选角中。
    theater
      .addActor('vader', { speed: 0.8, accuracy: 0.6 })
      .addActor('luke')
    //3,将场景添加到场景中,options.autoplay为true,则播放场景。
    theater
      .addScene('vader:Luke.', 600)
      .addScene('luke:What?', 400)
      .addScene('vader:I am your father.', 400)
      .addScene('luke:Nooo...', -3, '!!! ', 600, 'No! ', 600)
      .addScene('luke:That\'s not true!', 600)
      .addScene('luke:That\'s impossible!', 400)
      .addScene('vader:Search your feelings.', 1600)
      .addScene('vader:You know it to be true.', 1000)
      .addScene('luke:Noooooooo! ', 600, 'No!', 400)
      .addScene('vader:Luke.', 600)
      .addScene('vader:You can destroy the Emperor.', 1600)
      .addScene('vader:He has foreseen this. ', 800)
      .addScene('vader:It is your destiny.', 1600)
      .addScene('vader:Join me.', 800)
      .addScene('vader:Together we can rule the galaxy.', 800)
      .addScene('vader:As father and son.', 1600)
      .addScene('vader:Come with me. ', 800)
      .addScene('vader:It is the only way.', 2000)
      .addScene(theater.replay.bind(theater))
    //4,添加在发出事件时执行的回调( ( 当场景开始/结束时、) )。
    //效果是当打字(type)和删除(erase)开始时,显示光标
    //当打字(type)和删除(erase)结束时,移除光标。
    //当vader打字(type)时,
    theater
      .on('type:start, erase:start', function () {
        theater.getCurrentActor().$element.classList.add('actor__content--typing')
      })
      .on('type:end, erase:end', function () {
        theater.getCurrentActor().$element.classList.remove('actor__content--typing')
      })
      .on('type:start, erase:start', function () {
        if (theater.getCurrentActor().name === 'vader') {
          document.body.classList.add('dark')
        } else {
          document.body.classList.remove('dark')
        }
      })
  },
先来了解几个单词的意思:

theater:戏剧;
type:打字;
erase:清除;

1、TheaterJS

需要提供一些选项来创建一个新的TheaterJS对象。
var theater = theaterJS(<options>)
参数默认描述{autoplay, locale, minSpeed, maxSpeed}

选项 默认 描述
autoplay true 如果为true,则自动播放场景(调用addScene时)
locale detect 确定在键入随机字符(错误)时使用哪个键盘。注意:"detect"是一种检测用户的语言环境并在受支持的情况下使用的选项。
minSpeed {erase:80, type: 80 } 每个键入字符之间的最小延迟(越低,速度越快)。
maxSpeed {erase:450, type: 450 } 每个键入的字符之间的最大延迟(越大,越慢)。
注意:obj1等效于obj2。
let obj1 = {
  "minSpeed ":80,
  "maxSpeed":450 
}
let obj2 = {
   "minSpeed ":{
     "erase":80,
     "type":80
  },
  
  "maxSpeed"::{
     "erase": 450,
     "type": 450
  }
}
TheaterJS对象具有两个公共(只读)属性:

theater.options:对象的选项。
theater.status:对象的状态(“正在播放”,“正在停止”或“准备就绪”)。

2、addActor

将演员添加到演员表中。

theater.addActor(<name>, <options>, <callback>)

参数默认描述

参数 默认 描述
name 用于标识角色的名称
options 0.8 accuracy (0到1之间的数字):用来决定演员犯错误的频率。speed (0到1之间的数字):用于确定actor打字的速度。
callback 角色的显示值更改时调用的函数。

注意:actor回调是在设置其显示值时调用的函数。它也可以是字符串,在这种情况下,TheaterJS将假定它是DOM选择器并查找相应的元素。然后,当值更改时,将设置元素的innerHTML。如果为目标元素指定了具有参与者名称的id,则可以放心地忽略此参数。

theater.addActor('vader')
//在这种情况下,TheaterJS将查找 #vader 元素的元素。 另外,当使用选择器字符串时,actor将有一个引用DOM元素的附加 $element 属性。

3、addScene

将场景添加到场景中,如果 options.autoplay 为 true,则播放场景。

theater.addScene(<scene>)

<scene>有五种类型

theater
.addScene('vader:Luke...') //擦除演员显示值的当前值,然后键入新值。
.addScene(800) //在播放下一个场景之前,先中断800毫秒。
.addScene('I am your father!') //将值追加到参与者值的当前显示。
.addScene(-7) //擦除7字符。
.addScene(fn) //调用fn,它接收完成的回调作为第一个参数( 调用 done() 将播放场景中的下一个场景)。

注意,addScene实际上接受了无限数量的参数,因此你可以执行以下操作:

theater
. addScene('vader:Luke... ', 800, 'I am your father!')
. addScene(-7, 'mother!')
. addScene(fn)

4、监听事件

添加在发出事件时执行的回调( ( 当场景开始/结束时的比如 ) )。

theater.on(<eventName>, <callback>)

例子:

theater
      .on('type:start, erase:start', function () {
        theater.getCurrentActor().$element.classList.add('actor__content--typing')
      })
      .on('type:end, erase:end', function () {
        theater.getCurrentActor().$element.classList.remove('actor__content--typing')
      })
      .on('type:start, erase:start', function () {
        if (theater.getCurrentActor().name === 'vader') {
          document.body.classList.add('dark')
        } else {
          document.body.classList.remove('dark')
        }
      })

参数默认描述

参数 描述
eventName 要侦听的事件的NAME
Callback 事件发布时调用的函数,回调函数将事件的NAME 作为第一个参数接收

注意:
通过使用快捷方式来侦听所有事件: theater.on('*', callback)。
事件在序列启动( sequence:start ) 并结束( sequence:end )。
比如 时发出 theater.addScene('vader:Luke.', 'vader:I am your father.') 是一个序列。
当方案开始和结束时,分别为 scenario:start 和 scenario:end 发出事件。
场景是 :end 事件侦听器中的stoppable。 表示在侦听场景 :end的回调内调用 theater.stop() 将停止场景。 这对于异步回调(。比如 动画) 非常有用。

5、播放

theater.play()

例子:

var theater =theaterJS({ autoplay:false })
theater
. addActor('vader')
.addScene('vader:Luke...')
document.querySelector('button').addEventListener('click', function () {
 theater.play()
}, false)

6、重播

theater.replay()

例子:

var theater =theaterJS();
theater
. addActor('vader')
. addScene('vader:Luke...')
. addScene(theater.replay)

7、停止

theater.stop()

例子:

var theater =theaterJS()
theater
. addActor('vader')
. addScene('vader:Luke... ', 'I am your father...')
document.querySelector('button').addEventListener('click', function () {
 theater.stop()}, false)

8、getCurrentActor

返回当前正在播放的演员。

var theater =theaterJS()
theater
. addActor('vader')
. addScene('vader:Luke...')
. addScene(function (done) {
 var vader = theater.getCurrentActor()
 vader.$element.classList.add('dying')
   done()
 })
上一篇下一篇

猜你喜欢

热点阅读