JavaScript 实现自动打字机效果:递归与定时器详解

作者:代码拾荒

时间:2026-10-26

浏览:582

本文详细介绍如何使用 JavaScript 实现自动打字机文字显示效果。通过结合 setTimeout 定时器与递归函数,控制字符串逐字输出。文章解析了核心变量定义、递归终止条件判断及 DOM 更新逻辑,并提供完整的 HTML、CSS 及 JS 代码示例,帮助开发者快速掌握该前端交互技巧。

文章目录

前言

近期在处理一个产品需求时,对方希望文字能够以类似自动打字机的形式逐字显现。借此机会完成功能的同时,我将实现方法整理记录如下,供有类似需求的开发者参考。

1、实现思路

该需求的核心目标是模拟自动打字机的文字输出效果,即文字逐个出现。最终需要展示的文字内容在开始前已确定或已获取完毕。

具体实现上,需要将完整的文字字符串进行拆分。在每次执行中,比上一次多显示一个字符,同时清除之前的显示状态,逐步累积展示内容。

由于涉及文字的逐次累加显示,必须引入递归机制。递归的关键在于设定停止阈值,因此需要判断当前累加的索引值与字符串总长度之间的关系,当满足条件时停止递归执行。

2、html布局和css样式

本功能无需复杂的视觉样式,布局仅使用一个 div 元素。为还原打字机场景,背景设置为黑色,文字颜色设为白色,以营造科技感,相关代码如下:

<div class="word"></div>
 
<style>
    body {
       background: #000;
    }
    .word {
       margin: 100px;
       width: 500px;
       height: 30px;
       padding: 2px 10px;
       font-size: 26px;
       color: #FFF;
       font-weight: bold;
    }
</style>

3、预定义前置变量

代码中需预定义最终显示的字符串内容;定义获取 DOM 元素的变量;定义索引变量用于累加计算;定义定时器变量,通过 setTimeout 方法实现真实打字的延时特效;预定义获取字符串长度的变量;以及定义用于存储当前阶段显示内容的变量。此处共定义了 6 个关键变量,代码如下:

var wordStr = '2023年,喜迎新春,玉兔吉祥';
var wordDom = document.querySelector('.word');
 
var num = 0;
var wordTimeout = null;
var wLength = wordStr.length;
var showWord = '';

4、动效过程解析

以模拟字符串“2023年,喜迎新春,玉兔吉祥”为例,显示过程依次为:首次显示“2”,第二次显示“20”,第三次显示“202”,依此类推。通过之前预定义的 num 值进行累加,最终完整展示字符串。第一步代码逻辑如下:

showWord += wordStr.charAt(num);
wordDom.innerHTML = showWord;

此时 num 值为 0,利用字符串的 charAt 方法获取固定索引的字符(即“2”)。为了模拟真实打字需要时间的效果,引入 setTimeout 函数,具体实现如下:

wordTimeout = setTimeout(() => {
     showWord += wordStr.charAt(num);
     wordDom.innerHTML = showWord;
}, 300)

这仅展示了第一个字符。为了实现文字的持续累加、计算与渲染显示,需要添加回调机制以确保持续执行,代码如下:

function autoWord() {
    wordTimeout = setTimeout(() => {
       showWord += wordStr.charAt(num);
       wordDom.innerHTML = showWord;
       num++;
 
       autoWord();  // 递归调用
    }, 300)
}
autoWord();

递归的核心在于持续执行直至达到阈值后停止。

if (num < wLength) {
   autoWord();
} else {
   window.clearTimeout(wordTimeout);
   wordTimeout = null;
}

5、完整源代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自动打字机</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body {
            background: #000;
        }
        .word {
            margin: 100px;
            width: 500px;
            height: 30px;
            padding: 2px 10px;
            font-size: 26px;
            color: #FFF;
            font-weight: bold;
        }
    </style>
</head>
<body>
    <div class="word"></div>
 
    <script>
        var wordStr = '2023年,喜迎新春,玉兔吉祥';
        var wordDom = document.querySelector('.word');
 
        var num = 0;
        var wordTimeout = null;
        var wLength = wordStr.length;
        var showWord = '';
 
        function autoWord() {
            wordTimeout = setTimeout(() => {
                showWord += wordStr.charAt(num);
                wordDom.innerHTML = showWord;
                num++;
 
                if (num < wLength) {
                    autoWord();
                } else {
                    window.clearTimeout(wordTimeout);
                    wordTimeout = null;
                }
            }, 300)
        }
        autoWord();
        
    </script>
</body>

6、结语

我们在岁月中不断前行,常感压力不大,却不知未来该何去何从。这就像这个递归函数,受控于人,周而复始,甚至让人忘记了思考。

有时我们需要一个阈值,让自己停下来思考,即便可能暂时想不出答案。

前言

至此,关于 JS 实现自动打字机动效的文章介绍完毕。更多相关 JS 自动打字机内容,请搜索本站历史文章或继续浏览下方相关文章,感谢大家的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章