JavaScript 用纯 CSS 打造流畅的打字机动画

你或许见过这样的动态文本效果:文字像打字机一样逐个字母弹出,稍作停顿后又像被删除键清除,接着换成新的词汇重复这一过程。这种灵动的动画能让静态页面瞬间鲜活起来,但你可能不知道,实现它根本不需要 JavaScript —— 纯 CSS 就能搞定。

JavaScript 用纯 CSS 打造流畅的打字机动画

JavaScript 用纯 CSS 打造流畅的打字机动画

打字机动画的核心原理

这种动画的核心逻辑其实很简单,拆解后包含几个关键步骤:

  1. 从一段基础文本开始(比如 “我是小明,一名____设计师”);
  2. 在文本的空白位置(示例中 “____” 处),逐个字母 “输入” 第一个关键词(如 “UI”);
  3. 完整显示关键词后,暂停 1-2 秒;
  4. 按相反顺序 “删除” 这个词,回到空白状态;
  5. 对下一个关键词(如 “产品”)重复 “输入 – 暂停 – 删除” 的过程;
  6. 最后一个词不删除,保持显示状态。

同时,文本末尾会有一个闪烁的 “光标”(类似打字时的竖线),增强打字机的真实感。

第一步:用 CSS 实现闪烁光标

光标是打字机动画的 “灵魂细节”,它的实现堪称 CSS 动画的入门练习。我们可以用伪元素和关键帧动画轻松搞定。

1. 绘制光标

光标本质是一条竖线,我们可以通过 ::after 伪元素在文本末尾添加它:

1
2
3
4
5
.typewriter-text::after {
content: ""; /* 伪元素必须设置content才会显示 */
border-right: 2px solid #333; /* 2px粗的黑色竖线 */
margin-left: 3px; /* 与文本保持一点距离 */
}

2. 让光标 “闪烁” 起来

CSS 动画的核心是 “关键帧”—— 定义动画在不同时间点的状态。光标需要在 “显示” 和 “隐藏” 之间切换,opacity(透明度)属性是绝佳选择:

1
2
3
4
5
6
7
8
9
10
11
/* 定义闪烁关键帧 */
@keyframes blink {
0%, 100% { opacity: 1; } /* 开始和结束时完全显示 */
50% { opacity: 0; } /* 中间时刻完全隐藏 */
}/* 应用动画到光标 */
.typewriter-text::after {
animation: blink 0.6s linear infinite;
/* 0.6s完成一次闪烁,匀速播放,无限循环 */
}

这样,一条每秒闪烁约 1.7 次的光标就完成了。

第二步:实现文本的 “输入 – 删除” 动画

文本动画的核心是通过::before伪元素动态改变content属性 —— 在不同时间点显示关键词的不同字母组合,模拟 “输入” 和 “删除” 的过程。

1. 基础 HTML 结构

先准备一段包含 “空白位置” 的文本,用<span>标记动画区域:

1
2
3
<div class="sentence">
我是小明,一名<span class="typewriter-text"></span>设计师。
</div>

2. 静态样式设置

给文本添加基础样式,让整体更协调:

1
2
3
4
5
6
.sentence {
font-size: 24px;
font-family: "Courier New", monospace; /* 等宽字体更像打字机效果 */
text-align: center;
margin: 50px auto;
}

3. 单个词的 “输入” 动画

以关键词 “UI”(2 个字母)为例,我们需要让它从空值逐步变成完整单词。关键帧的时间点需按字母数量拆分:

  • 总动画时长设为 4 秒(可自定义);
  • 2 个字母意味着分 3 个阶段(空→1 个字母→2 个字母);
  • 每个阶段占比:100% ÷ 3 ≈ 33.3%。

关键帧代码如下:

1
2
3
4
5
6
7
8
9
10
@keyframes type-ui {
0% { content: ""; } /* 初始为空 */
33.3% { content: "U"; } /* 1/3时间点显示第一个字母 */
100% { content: "UI"; } /* 结束时显示完整单词 */
}.typewriter-text::before {
content: "";
animation: type-ui 4s 1 forwards; /* 4秒完成,播放1次,停在最后一帧 */
}

此时,文本会从 “我是小明,一名设计师” 逐渐变成 “我是小明,一名 UI 设计师”。

4. 加入 “删除” 和 “暂停” 效果

要让单词在显示后被 “删除”,只需在关键帧中反向重复 “输入” 步骤,并在中间加入停顿。仍以 “UI” 为例,总时长设为 8 秒(输入 2 秒 + 暂停 2 秒 + 删除 2 秒 + 缓冲 2 秒):

1
2
3
4
5
6
7
8
9
10
11
12
@keyframes type-delete-ui {
0% { content: ""; }
12.5% { content: "U"; } /* 1秒时输入第一个字母 */
25% { content: "UI"; } /* 2秒时输入完成 */
50% { content: "UI"; } /* 2-4秒暂停(占25%时长) */
62.5% { content: "U"; } /* 5秒时开始删除第一个字母 */
75%, 100% { content: ""; } /* 6秒时删除完成,保持空白 */
}.typewriter-text::before {
animation: type-delete-ui 8s 1 forwards;
}

5. 多单词循环动画

如果需要切换多个单词(如 “UI→产品→交互”),需按单词总长度和停顿时间计算关键帧占比。公式如下:

总步骤 =(前 n-1 个单词的字母数 ×2)+ 1 + 最后 1 个单词的字母数(×2 是因为每个词要 “输入 + 删除”,+1 是词间停顿);
总时长 = 总步骤 × 每个字母的动画时间 + 总停顿时间。

例如,3 个单词 “UI”(2 字母)、“产品”(2 汉字)、“交互”(2 汉字):

总步骤 =(2+2)×2 + 1 + 2 = 13;
若每个字母动画 0.5 秒,停顿 1 秒,总时长 = 13×0.5 + 2×1 = 8.5 秒。

按此计算关键帧时间点,即可实现多词循环。

为什么纯 CSS 比 JavaScript 更值得选?

或许你会疑惑:用 JS 不是更灵活吗?但纯 CSS 方案的优势很明显:

  • 零依赖:无需编写 JS 代码或引入第三方库(如 Anime.js),减少页面加载负担;
  • 兼容性更强:部分用户可能因浏览器设置、防火墙等禁用 JS,而 CSS 几乎不会被屏蔽;
  • 更稳定:CSS 动画由浏览器原生渲染,性能优于 JS 模拟的动画,不易出现卡顿。

当然,它也有小缺点:添加或修改单词时,需要重新计算关键帧时间点(可通过工具自动生成解决)。

用纯 CSS 实现打字机动画,本质是通过伪元素动态改变内容,配合关键帧控制时间节奏。从闪烁的光标到单词的 “输入 – 删除”,每一步都能通过基础 CSS 语法完成。这种方案轻量、稳定,还能兼容更多场景 —— 下次想给网站加动态文本时,不妨试试这个纯 CSS 方案。

 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

除特别注明外,本站所有文章均基于CC-BY-NC-SA 4.0原创,转载请注明出处。
文章名称:《JavaScript 用纯 CSS 打造流畅的打字机动画》
文章链接:https://www.xlin.cn/xlbk/20188.html
分享到: 更多 (0)

热门文章

评论 抢沙发

切换注册

登录

忘记密码 ?

切换登录

注册