美文网首页
TheaterJS:模仿人类打字效果的 JavaScript 动

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

作者: 五花漏Z | 来源:发表于2020-03-02 16:54 被阅读0次
    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()
     })
    

    相关文章

      网友评论

          本文标题:TheaterJS:模仿人类打字效果的 JavaScript 动

          本文链接:https://www.haomeiwen.com/subject/wasvkhtx.html