当前位置: 首页 > news >正文

【开源宝藏】用 JavaScript 手写一个丝滑的打字机动画效果

你当前项目实现了一个非常丝滑的 打字机文字效果动画,使用的是自定义的 typical.js 脚本。下面我将给出一份逐步拆解的中文教程,帮你或其他初学者快速上手并自定义这个打字效果。


在这里插入图片描述

✨ 最终效果

打开页面后,中央会逐字显示:

Hello 
Hello world!
Welcome to the typing effect demo.

其中,文字是一个一个打出来的,中间有停顿和替换的动画效果,模拟打字体验。


🧱 第 0 步:项目结构

你的项目由以下文件构成:

typing-effect/
├── index.html       // 页面主结构,绑定 JS 调用
├── typical.js       // 实现核心打字动画的逻辑

🔤 第 1 步:HTML 结构解析(index.html)

<body>
    <div id="output"></div>

    <!-- 引入打字效果脚本 -->
    <script src="./typical.js"></script>
    <script>
        document.addEventListener('DOMContentLoaded', () => {
            const node = document.getElementById('output');

            type(node,
                'Hello ',
                1000,
                'Hello world!',
                1000,
                ' Welcome to the typing effect demo.'
            );
        });
    </script>
</body>

✅ 关键点说明

  • 页面只有一个空的 <div id="output">,用于动态输出文字。
  • type() 函数接收多个参数:
    • 字符串:逐字显示出来;
    • 数字:表示等待多少毫秒;
    • 你也可以传入函数,实现更复杂逻辑。

⚙️ 第 2 步:typical.js 核心逻辑分析

2.1 主要入口函数:type(node, ...args)

async function type(node, ...args) {
    for (const arg of args) {
        switch (typeof arg) {
            case 'string':
                await edit(node, arg);  // 文字变化动画
                break;
            case 'number':
                await wait(arg);       // 延迟等待
                break;
            case 'function':
                await arg(node, ...args); // 自定义行为
                break;
            default:
                await arg;
        }
    }
}

2.2 edit():逐字比较和更新

async function edit(node, text) {
    const overlap = getOverlap(node.textContent, text);
    await perform(node, [...deleter(node.textContent, overlap), ...writer(text, overlap)]);
}
  • getOverlap:找到当前文本和目标文本的共同部分,避免重复删除。
  • deleter:从当前文本删到重合部分。
  • writer:从重合部分写到完整文本。
  • 组合起来就是 “智能替换”

2.3 perform():每次逐步更新 textContent

async function perform(node, edits, speed = 60) {
    for (const op of editor(edits)) {
        op(node); // 每次修改文本
        await wait(speed + speed * (Math.random() - 0.5)); // 模拟人类打字速度波动
    }
}

🧪 第 3 步:可定制用法示例

你可以把这段改成你自己的文字,比如:

type(node,
    '你好,世界!',
    800,
    '欢迎来到 Typing.js 的演示。',
    1500,
    '😎 你可以无限扩展内容~',
    1000,
    '再见~'
);

或者在多个元素中交替:

const title = document.getElementById('title');
const desc = document.getElementById('desc');

type(title, '🚀 Typing Animation');
type(desc, 1000, 'This is an elegant way to present words one by one.');

🎁 拓展玩法建议

  1. 打字音效

    • 每次字符变化时播放「键盘敲击」音效。
  2. 循环播放

    • type() 外部加入循环函数,形成无限播放文字动画。
  3. 配合 CSS 闪烁光标

    • 添加 <span class="cursor">|</span> 伪元素配合动画:
    .cursor {
        display: inline-block;
        width: 1px;
        background: white;
        animation: blink 1s infinite;
    }
    
    @keyframes blink {
        0%, 50% { opacity: 1; }
        51%, 100% { opacity: 0; }
    }
    

✅ 总结

模块作用
type()接收多个动画步骤(字符串 / 等待 / 函数)
edit()根据目标文字智能删除 & 添加
writer()模拟打字效果
deleter()模拟删除效果
perform()执行每一步并添加速度差

这个项目结构简洁、逻辑清晰,是一个很适合自定义与学习 JS 动画的案例。

相关文章:

  • 软件确认测试注意事项和工具分享,确认测试软件测评中心有哪些?
  • 【报错】 /root/anaconda3/conda.exe: cannot execute binary file: Exec format error
  • 可变形交互注意力模块(DIA-Module)及代码详解
  • 基础场景-------------------(5)重载和重写的区别
  • Squidex:一个基于.Net功能强大的CMS开源项目
  • 2025年渗透测试面试题总结-某深信服-深蓝攻防实验室(题目+回答)
  • Linux 练习一 NFS和DNS
  • K-均值聚类算法:数据海洋中的分类灯塔
  • springboot的跨域是什么?遇到跨域问题如何解决?
  • 吾爱出品,文件分类助手,高效管理您的 PC 资源库
  • HTML5 拖放(Drag and Drop)学习笔记
  • AI巅峰揭秘:ChatGPT如何引领智能时代变革
  • HTTP代理的全面解读:什么是HTTP代理?HTTP代理的工作原理
  • 计算机网络 --应用层
  • 从前端切图仔到鸿蒙开发02-布局样式
  • 基于javaweb的SpringBoot雪具商城系统设计与实现系统(源码+文档+部署讲解)
  • 数据结构之排序
  • 结合DrRacket学习《如何设计程序,第二版》
  • 数据库原理及应用mysql版陈业斌实验二
  • 小迪安全-php模型,mvc架构,动态调试未授权,脆弱及安全,为引用。逻辑错误
  • 知名网站有哪些?/企业网络营销策划
  • 做网站和做推广的区别/手机创建网站免费注册
  • 建网站推广淘宝店/国外搜索网站排名
  • 东软实训网站开发/免费的网站申请
  • wordpress 预览/桂平seo快速优化软件
  • 江夏网站建设/百度文章收录查询