js实现简单的循环打字效果(思路分享)

简介: 1.初始化"打字创建"属性代码类似于这样: var typing = { _el: document.getElementById("demo"), _maxSpeed: 150,//最大输入...
img_d8ec7446fcb43344bf0c289c6931760e.gif

1.初始化"打字创建"属性

代码类似于这样:

<div id="demo"></div>
<script>
    var typing = {
        _el: document.getElementById("demo"),
        _maxSpeed: 150,//最大输入速度 
        _minSpeed: 20,//最小输入速度
        _textList: ["js实现简单的循环打字效果(思路分享)", 
            "关爱单身狗成长协会 ", 
            "简书地址:https://www.jianshu.com/u/f19e29243ff6",
            "weibo:https://weibo.com/bay12580"
        ],//输入文字集合
        _listIndex: 0,//列表的索引
        _text: '',//当前显示的句子文字
        _tempText: "",//临时句子截取文字
        _indexes: 0,//光标索引
        _delSpeed: 10,//删除文字速度
        _cursorText: "_",//光标文字 
        _wait: 2000,//文子输入完成后等待时间删除
        _waitInput: 800,//等待n毫秒后开始输入
        _timer: null,//定时器
        _isStop: true,//是否停止
        _cacheFun: null,//停止时函数记录
    };
</script>

其实属性也不难理解,这里就不详细说明了~~

2.几个基本函数

//略....
var typing = {
        //略.......
        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’的显示文字
            this._el.innerHTML/*innerText*/ = this.getNowText() + (hc ? "" : this._cursorText);
        }
    };
//略....

函数测试:

//测试
typing._text = typing._textList[typing._listIndex]; 
typing.render();//一开始显示 typing._cursorText 对应字符
typing.waiting(typing._waitInput).then(()=>{//等待 typing._waitInput 毫秒后开始显示文字
    typing._indexes ++;
    typing.render();
}); 

效果:


img_ec575b8af88730a0ab423ea04403824c.gif

3.实现不断打字效果

<div id="demo"></div>
<script>
    var typing = {
         //略......
        loop() { //循环显示
            if (typing._text.length <= typing._indexes) {//是显示完成 
                typing.render(true);//输出完成 隐藏结尾的光标
            } else {
                typing.getNowText(typing._indexes + 1);//设置下一次显示的文字
                typing.render();//显示到页面
                typing.waiting(typing.getRanSpeed()).then(typing.loop);//等待删除
            }
        },
        start(){//开始 
            typing._text = typing._textList[typing._listIndex];//获取应该显示的文字
            typing.waiting(typing._waitInput).then(typing.loop);//等等开始
           //typing.loop();//你也可以立即开始
        }
    };
    //测试
    typing.start();
</script>

效果:


img_4d82767b16c9587f60569b7e36e2a30f.gif

4.实现不断打字与删除效果

<div id="demo"></div>
<script>
    var typing = {
        //略.........
        backspace() { //循环删除
            if (typing._indexes > 0) {
                typing.waiting(typing._delSpeed).then(() => {//删除
                    // typing.getNowText(typing._indexes -1);
                    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.getNowText(typing._indexes + 1);
                typing._indexes ++; //设置下一次显示的文字索引               
                typing.render();//显示到页面
                typing.waiting(typing.getRanSpeed()).then(typing.loop);//等待删除
            }
        },
        start() {//开始 
            typing.backspace();
        }
    };
    //测试
    typing.start();
</script>

效果:


img_22fc28e8518e68177bf8ea32ecbc7572.gif

5.添加暂停功能

<div id="demo"></div>
<script>
    var typing = {
        //略......
        backspace() {
            if (typing._isStop) return typing._cacheFun = typing.backspace;
             //略......
        },
        loop() {
            if (typing._isStop) return typing._cacheFun = typing.loop;//记录当前显示
            //略......
        },
        start() {
            if (!typing._isStop) return;//处于运行状态
            typing._isStop = false;
            if (typing._cacheFun) {//继续上次未完成函数
                typing._cacheFun();
                typing._cacheFun = null;
                return;
            }
            typing.render("");
            typing.cleanTimer();
            typing.backspace();
        },
        restart() {
            typing.stop();
            typing._tempText = "";
            typing._listIndex = 0;
            typing._indexes = 0;
            typing.render("");
            typing._cacheFun = null;
            typing.waiting(typing._wait).then(typing.start);//以最长时间延时来确保执行完全停止
        },
        stop() {
            if (typing._isStop) return;
            typing._isStop = true;
            typing.cleanTimer();
        }
    }; 
    typing.start();
</script>
<button onclick="typing.start()">开始</button>
<button onclick="typing.stop()">暂停</button>
<button onclick="typing.restart()">重新开始</button>

效果:


img_6afad0bf89a0dd90e3b308164e94b1fd.gif

在线查看效果

相关文章
|
1月前
|
JavaScript 前端开发 安全
JavaScript中的循环控制:while、do-while与for详解
【4月更文挑战第7天】本文探讨JavaScript的三种主要循环结构:while、do-while和for。while循环在满足条件时执行代码块,注意避免无限循环;do-while循环至少执行一次,适合先执行后判断的场景;for循环结合初始化、条件和迭代,适合遍历。理解每种循环的特点和适用场景,结合编程技巧,如使用break和continue,选择合适的循环方式,能提升代码效率和可读性。记得关注循环性能和避免不必要的计算。
19 0
|
1月前
|
JavaScript
在循环内错误使用函数定义(js的问题)
在循环内错误使用函数定义(js的问题)
11 0
|
1月前
|
JavaScript
JS使用循环求100内奇数之和
JS使用循环求100内奇数之和
16 1
|
1月前
|
JavaScript 前端开发
JS——while 循环和 do while 循环:究竟有什么区别?
JS——while 循环和 do while 循环:究竟有什么区别?
23 1
|
4月前
|
JavaScript 前端开发
【面试题】在JS循环中使用await会怎么样?
【面试题】在JS循环中使用await会怎么样?
|
4天前
|
JavaScript 前端开发
JavaScript 循环方法详解
JavaScript 循环方法详解
18 1
|
12天前
|
JavaScript 前端开发
JavaScript 条件循环语句(for 循环)
JavaScript 条件循环语句(for 循环)
|
15天前
|
前端开发 JavaScript 开发者
遍历指南:JavaScript 中的 for、for-in、for-of 和 forEach 循环详解
遍历指南:JavaScript 中的 for、for-in、for-of 和 forEach 循环详解
22 3
|
19天前
|
JavaScript 索引
JS 几种循环遍历
JS 几种循环遍历
9 0
JS 几种循环遍历
|
25天前
|
JavaScript 前端开发
js中的while循环和do while循环的区别
js中的while循环和do while循环的区别
21 8