循环打字机来啦,打完一段文字,删除,打下一段

558 阅读2分钟

前言

当我们设计官网的时候,肯定都是想要那种看起来很有点动画的,不是全静态的东西,动起来的东西才会更博人眼球,但是很多时候单纯的文字我们又不知道加什么动态的效果好,这时候就可以试试打字机啦,特别是循环打字机,打完一段可以删掉在打下一段,看起来确实是不错的效果呢!快来试试吧!

页面

<div class="text">
  <p>打字机循环打字 
  <span id="typingtext"></span>
  删除后打下一段文字.</p>
</div>

css
@keyframes blink {
    0% {
            opacity: 1;
    }
    25% {
            opacity: 0;
    }
    75% {
            opacity: 1;
    }
    100% {
            opacity: 1;
    }
}
.text{
    p{
      width: 500px;
      font-size: 46px;
      font-weight: 700;
      color: #333333;
      span{
        font-size: 46px;
        font-weight: 700;
        color: #5030C0;
      }
      /*文字打完后 等待的时间是没有光标的 用动画做一个假的光标*/
      span:after {
        content: "|";
        animation: blink 1s infinite;
        animation-timing-function: step-end;
      }
    }
}

关键代码

var typing = {
    el: document.getElementById("typingtext"),
    maxSpeed: 150,//最大输入速度 
    minSpeed: 50,//最小输入速度
    textList: [
        "马上国庆节啦", 
        "祝大家", 
        "国庆节快乐哦",
        "Happy Every day"
    ],//输入文字集合
    listIndex: 0,//列表的索引
    text: '',//当前显示的句子文字
    tempText: "",//临时句子截取文字
    indexes: 0,//光标索引
    delSpeed: 2,//删除文字速度
    cursorText: "|",//光标文字 
    wait: 2000,//文子输入完成后等待时间删除
    waitInput: 0,//等待n毫秒后开始输入
    timer: null,//定时器
    isStop: true,//是否停止
    cacheFun: null,//停止时函数记录
    
    cleanTimer() {//清除定时器
        if (this.timer) return;
        clearTimeout(this.timer);
        this.timer = null;
    },
    
    getRanSpeed() {//获取随机停止时间
        return Math.floor(Math.random() * (this.maxSpeed - this.minSpeed + 1)) + this.minSpeed;
    },
    
    getNowText(i) {//设置并获取当前文字
        this.indexes = typeof i == "number" ? i : this.indexes;
        this.tempText = this.text.substr(0, this.indexes);
        return this.tempText;
    },
    
    waiting(ms) {//等待函数
        return new Promise((resolve, reject) => {
            typing.cleanTimer();
            typing.timer = setTimeout(resolve, ms);
        })
    },
    
    render(hc) {//设置 ‘el’的显示文字
    //等待的时候 变量hc为true 所以是不会显示光标的 所以css里面我自己给加了光标闪烁效果
        this.el.innerHTML/*innerText*/ = this.getNowText() + (hc ? "": this.cursorText);
    },
    
    backspace() { //循环删除
        if (typing.indexes > 0) {
            typing.waiting(typing.delSpeed).then(() => {//删除
                typing.indexes --;
                typing.render();
                typing.backspace();
            });
        } else {//删除完成
            if (typing.listIndex >= typing.textList.length) typing.listIndex = 0;
            typing.text = typing.textList[typing.listIndex];
            typing.listIndex++;
            typing.waiting(typing.waitInput).then(typing.loop);//等待输入
        }
    },
    
    loop() {
        if (typing.text.length <= typing.indexes) {//当前文字打完了
            typing.render(true);//输出完成 
            typing.waiting(typing.wait).then(typing.backspace);//等待删除
        } else {
            typing.indexes ++; //设置下一次显示的文字索引               
            typing.render();//显示到页面
            typing.waiting(typing.getRanSpeed()).then(typing.loop);//等待删除
        }
    },
    
    start() {//开始 
        typing.backspace();
    }
};
//测试
typing.start();

总结

注释写的非常详细都在里面了,可以结合gif看代码,快写起来吧!