0

0

如何正确实现网页文字逐字打字效果(避免阻塞式延迟陷阱)

聖光之護

聖光之護

发布时间:2026-03-05 21:32:02

|

805人浏览过

|

来源于php中文网

原创

如何正确实现网页文字逐字打字效果(避免阻塞式延迟陷阱)

本文详解为何基于 while 循环的同步延迟(如 delay() 函数)会导致页面卡死、渲染失效,以及如何使用 setTimeout 或 async/await 实现流畅、跨浏览器兼容的逐字打字动画。

本文详解为何基于 `while` 循环的同步延迟(如 `delay()` 函数)会导致页面卡死、渲染失效,以及如何使用 `settimeout` 或 `async/await` 实现流畅、跨浏览器兼容的逐字打字动画。

原始代码中使用的 delay(val) 是一个典型的同步忙等待(busy-waiting)函数:它通过 while (t2 标签中插入的字符(如  #   <script>document.wait(val);</script>)虽已写入 HTML 文本流,却因页面被阻塞而无法及时渲染到屏幕上,视觉上表现为“无输出”或“一次性闪现”。

而 alert() 能“修复”该问题,本质是意外触发了浏览器渲染时机:alert 会中断当前脚本执行并交出控制权,使浏览器有机会完成挂起的 DOM 更新和重排(reflow)/重绘(repaint),之后再继续执行后续脚本。但这纯属副作用,不可靠(如 IE 中仍可能失败)、不友好(打断用户)、且完全违背现代 Web 开发原则。

✅ 正确解法是采用异步非阻塞延迟机制,将字符插入操作拆分为独立的微任务或宏任务,让浏览器在每次插入后获得渲染机会。

Spacely AI
Spacely AI

为您的房间提供AI室内设计解决方案,寻找无限的创意

下载

✅ 推荐方案一:基于 setTimeout 的递归打字器(兼容性最佳)

const typeWriter = (elementOrSelector, text, speed = 100) => {
  const el = typeof elementOrSelector === 'string'
    ? document.querySelector(elementOrSelector)
    : elementOrSelector;

  if (!el) throw new Error('Target element not found');

  let i = 0;
  const write = () => {
    if (i < text.length) {
      el.textContent += text[i++];
      setTimeout(write, speed); // 下一字符延后执行,释放主线程
    }
  };
  write();
};

// 使用示例
typeWriter('#demo-slow', 'Hello, World!', 150);
typeWriter('#demo-fast', 'Fast typing!', 50);
<p id="demo-slow"></p>
<p id="demo-fast"></p>

? 优势:零依赖、兼容所有现代浏览器及 IE9+;无内存泄漏风险(闭包轻量);易于调试与定制。

✅ 推荐方案二:基于 async/await 的顺序打字器(语法更直观)

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

const typeWriterAsync = async (elementOrSelector, text, speed = 100) => {
  const el = typeof elementOrSelector === 'string'
    ? document.querySelector(elementOrSelector)
    : elementOrSelector;

  if (!el) throw new Error('Target element not found');

  for (let i = 0; i < text.length; i++) {
    await sleep(speed);
    el.textContent += text[i];
  }
};

// 串行调用示例(按顺序打完一个再打下一个)
(async () => {
  await typeWriterAsync('#demo-1', 'First line.', 80);
  await typeWriterAsync('#demo-2', 'Second line.', 80);
  console.log('All done!');
})();
<p id="demo-1"></p>
<p id="demo-2"></p>

⚠️ 注意:async/await 需运行在支持 ES2017+ 的环境中(现代浏览器均支持);若需支持老旧环境,请回退至 setTimeout 方案。

❌ 常见误区与避坑指南

  • 不要使用 while(Date.now() :这是 CPU 密集型操作,冻结 UI,违反响应式设计原则;
  • 避免在循环中频繁修改 innerHTML:应优先使用 textContent(防 XSS、性能更高),或批量拼接后一次性赋值;
  • 确保目标元素存在后再调用:建议在 DOMContentLoaded 或 window.onload 后执行,或增加元素存在性校验;
  • 考虑可访问性(a11y):为打字容器添加 role="log" 和 aria-live="polite",便于屏幕阅读器播报更新。

总结

从 2004 年 Dreamweaver 时代的同步阻塞式 delay(),到 today 的异步驱动型 typeWriter,本质是 Web 运行时模型的认知升级:JavaScript 主线程必须保持“呼吸感”——每一次任务结束,都是浏览器渲染与交互的机会。 选择 setTimeout 或 async/await,不仅是技术选型,更是对用户感知性能(Perceived Performance)的尊重。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

104

2023.09.25

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

743

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

743

2023.08.10

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

151

2025.07.29

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

4206

2024.08.14

alert怎么实现换行
alert怎么实现换行

alert通过使用br标签来实现换行。更多关于alert相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

501

2023.11.07

dreamweaver是什么软件
dreamweaver是什么软件

Dreamweaver是一款由Adobe公司开发的网页设计和开发软件。Dreamweaver是一种所见即所得编辑器,允许用户在设计和编写网页时同时预览其外观和功能。本专题为大家提供dreamweaver相关的各种文章、以及下载和课程。

397

2023.08.15

asp开发工具有哪些
asp开发工具有哪些

asp开发工具有Visual Studio、Dreamweaver、FrontPage、EditPlus、UltraEdit、SQL Server Management Studio、RAD Studio、Delphi、Asp.NET和Oracle SQL Developer。更多asp开发工具相关内容,详情请阅读本专题下面的其他文章,php中文网欢迎大家前来学习。

379

2023.10.23

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

4

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号