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

在线查看效果

相关文章
|
3月前
|
JavaScript 前端开发
JS循环for、for...of、for...in
本文介绍了JavaScript中不同的循环语句,包括传统的`for`循环、`for...of`循环用于遍历数组和类数组对象、`for...in`循环用于遍历对象的属性,并通过示例代码展示了它们的用法和区别。
52 6
JS循环for、for...of、for...in
|
3月前
|
JavaScript 前端开发
JavaScript基础知识-流程控制之while循环
这篇文章介绍了JavaScript中的while循环和do...while循环的基础知识,并通过一个实际案例演示了如何使用while循环计算投资增长到特定金额所需的年数。
55 2
JavaScript基础知识-流程控制之while循环
|
2月前
|
JavaScript 前端开发
js循环有几种
js循环有几种
33 0
|
4月前
|
JavaScript 前端开发
JavaScript中有哪几种循环?他们的运用场景在哪?
JavaScript中有哪几种循环?他们的运用场景在哪?
|
4月前
|
JavaScript 前端开发 索引
js的循环中foreach、for in和for of的区别
js的循环中foreach、for in和for of的区别
169 0
|
1月前
|
JavaScript
JS趣味打字金鱼小游戏特效源码
hi fish是一款打字趣味小游戏,捞出海里的鱼,捞的越多越好。这款游戏用于电脑初学者练习打字。初学者可以根据自己的水平设置游戏难度。本段代码可以在各个网页使用,有需要的朋友可以直接下载使用,本段代码兼容目前最新的各类主流浏览器,是一款非常优秀的特效源码!
29 3
|
1月前
|
JavaScript
JS趣味打字金鱼小游戏特效源码
hi fish是一款打字趣味小游戏,捞出海里的鱼,捞的越多越好。这款游戏用于电脑初学者练习打字。初学者可以根据自己的水平设置游戏难度。本段代码可以在各个网页使用,有需要的朋友可以直接下载使用,本段代码兼容目前最新的各类主流浏览器,是一款非常优秀的特效源码!
36 0
JS趣味打字金鱼小游戏特效源码
|
1月前
|
JavaScript
js动画循环播放特效源码(上班族的一天)
js动画循环播放特效是一段实现了包含形象的卡通小人吃、睡、电脑工作的网页动画,js循环动画,简单的画面设计。非常丝滑有意思,欢迎对此代码感兴趣的朋友前来下载参考。
27 2
|
3月前
|
前端开发 JavaScript
前端基础(八)_JavaScript循环(for循环、for-in循环、for-of循环、while、do-while 循环、break 与 continue)
本文介绍了JavaScript中的循环语句,包括for循环、for-in循环、for-of循环、while循环、do-while循环以及break和continue的使用。
69 1
前端基础(八)_JavaScript循环(for循环、for-in循环、for-of循环、while、do-while 循环、break 与 continue)
|
3月前
|
JavaScript 前端开发
JavaScript基础知识-forEach循环
关于JavaScript基础知识中forEach循环的介绍。
46 1
JavaScript基础知识-forEach循环