0

0

CSS中如何实现打字效果_animation步骤控制

絕刀狂花

絕刀狂花

发布时间:2025-07-20 16:58:01

|

884人浏览过

|

来源于php中文网

原创

实现css打字效果的核心在于width动画、overflow: hidden和steps()函数的协同使用。首先,设置文本容器初始状态为overflow: hidden、white-space: nowrap和width: 0,隐藏所有内容;接着通过@keyframes定义width从0到100%或固定字符宽度(如20ch)的动画;然后应用animation-timing-function: steps(n, end),其中n为字符数,使动画分步显示字符;最后添加光标闪烁动画,通过border-right或伪元素结合独立动画实现。steps()函数将平滑过渡转为离散跳变,确保每个字符在对应步骤中瞬间显现。对于动态文本和响应式设计,需注意字符数匹配问题,必要时用javascript动态计算steps值及动画时长,并合理设置容器宽度以适配不同屏幕。

CSS中如何实现打字效果_animation步骤控制

在CSS中实现打字效果,核心在于巧妙地结合width属性的动画、overflow: hidden以及animation-timing-function中的steps()函数。这三者的协同作用,能让文本内容像打字机一样一个字符一个字符地逐步显现,而不是平滑地从左到右延伸。

CSS中如何实现打字效果_animation步骤控制

解决方案

要实现一个基础的打字效果,我们需要一个包裹文本的容器,并对其应用动画。

首先,设置文本容器的初始状态:

立即学习前端免费学习笔记(深入)”;

CSS中如何实现打字效果_animation步骤控制
  • overflow: hidden;: 这是关键,它会隐藏超出容器宽度的内容。
  • white-space: nowrap;: 确保文本不会自动换行,保持单行显示,这对于宽度动画的精确控制很重要。
  • width: 0;: 文本容器的初始宽度为零,这样所有文本都被隐藏。

接着,定义一个@keyframes动画,让容器的width从0逐渐增加到文本的实际宽度。这里的“实际宽度”通常是一个足够大的值,或者可以通过JavaScript动态获取,但在纯CSS示例中,我们可以给一个预估值或者max-content

最核心的魔法在于animation-timing-function: steps(N, end);steps()函数将动画过程分解为N个等长的步骤,而不是平滑过渡。当我们把N设置为文本字符的数量时,每一步动画的完成,就恰好对应一个字符的显现。end参数(或默认值)表示在每个步骤的末尾执行动画。

CSS中如何实现打字效果_animation步骤控制

最后,将这个动画应用到文本容器上。

<div class="typing-container">
  <p class="typing-text">你好,这是一个CSS打字效果的演示。</p>
</div>
.typing-container {
  font-family: monospace; /* 等宽字体有助于精确控制字符宽度 */
  font-size: 24px;
  margin: 50px auto;
  width: fit-content; /* 让容器宽度适应内容,方便后续动画控制 */
  max-width: 80%; /* 防止文本过长溢出 */
  border-right: 2px solid; /* 模拟光标 */
  white-space: nowrap;
  overflow: hidden;
  animation: 
    typing 4s steps(20, end) forwards, /* 20是字符数,需要根据实际文本调整 */
    blink-caret .75s step-end infinite;
}

/* 文本内容本身不需要特殊样式,它会被父容器的overflow和width控制 */
.typing-text {
  display: inline-block; /* 确保其宽度能被父容器控制 */
  /* 实际文本宽度会决定动画终点 */
}

@keyframes typing {
  from { width: 0 }
  to { width: 100% } /* 或者一个足够大的固定值,例如 20ch */
}

@keyframes blink-caret {
  from, to { border-color: transparent }
  50% { border-color: black; }
}

/* 针对长文本,可以考虑使用ch单位来精确控制宽度,1ch约等于一个字符的宽度 */
/* @keyframes typing {
  from { width: 0 }
  to { width: 20ch } 
} */

这里需要注意的是,steps(20, end)中的20需要与你的文本字符数量大致匹配。如果文本是动态的,这个数字可能需要JavaScript来计算。forwards让动画停留在最后一帧。光标动画则是一个独立的、无限循环的border-right闪烁效果。

为什么直接使用width动画会显得生硬?steps()是如何解决这个问题的?

我最初尝试做打字效果时,直觉就是动画width,结果发现文本是平滑地从左边“生长”出来的,就像墨水慢慢渗透开一样,完全没有那种字符一个个跳出来的感觉。这其实很好理解,CSS的动画默认是平滑过渡的(easelinear等),它会在动画持续时间内,将属性值从起点连续地变化到终点。width的平滑变化,意味着文本内容会像被裁剪的图片一样,逐渐露出完整的字形,而不是离散的字符显示。

steps()函数正是为了解决这种“生硬”或“连续”问题而生的。它就像一个离散的控制器,把整个动画时间轴切分成若干个等长的“步”。在每一步的开始或结束(取决于你选择start还是end),属性值会瞬间跳变到下一个预设的状态,而不是平滑过渡。对于打字效果,我们把steps()的数量设置为文本的字符数,那么每完成一个“步”,width就会恰好增加到能显示下一个字符的宽度。这样一来,视觉上就营造出了字符“跳出来”的错觉,完美模拟了打字机的逐字显示效果。它不是真的在“打字”,而是在极其精确的步进中,一点点揭示预先存在的文本。

Quinvio AI
Quinvio AI

AI辅助下快速创建视频,虚拟代言人

下载

如何让光标(caret)也动起来,模拟真实打字效果?

一个没有闪烁光标的打字效果总觉得少了点什么灵魂,对吧?它就像一个只有声音没有画面的电影。光标的闪烁,是打字机、命令行界面最经典的标志。在CSS中实现这个,思路其实很简单,我们通常会利用一个元素的border-right属性,或者一个伪元素(::after)来模拟光标。

最直接的方法就是给文本容器(或者打字效果的元素)添加一个border-right。然后,我们再定义一个独立的@keyframes动画,专门控制这个边框的颜色或透明度,让它周期性地在可见和不可见之间切换,形成闪烁效果。

比如,我们可以这样:

.typing-container {
  /* ... 其他样式 */
  border-right: 2px solid black; /* 初始光标颜色 */
  animation: 
    typing 4s steps(20, end) forwards,
    blink-caret .75s step-end infinite; /* 新增光标闪烁动画 */
}

@keyframes blink-caret {
  from, to { border-color: transparent } /* 初始和结束时透明 */
  50% { border-color: black; } /* 中间时显示黑色 */
}

这里blink-caret动画使用了step-end这个timing-function,它让颜色在50%这个时间点瞬间跳变,而不是平滑过渡,这样闪烁效果会更干脆利落,更像真实的光标。infinite则保证了光标会一直闪烁下去。

如果你的设计不允许直接在容器上加边框(比如容器有背景色或者边框本身有其他用途),你也可以考虑使用伪元素。给文本容器设置position: relative;,然后添加一个::after伪元素,将其定位在文本末尾,并设置其宽度、高度和背景色来模拟光标,再对这个伪元素进行闪烁动画。这种方法更灵活,但实现上会多一步定位的考量。不过,就打字效果而言,直接用border-right通常是最简洁有效的方案。

打字效果在不同文本长度和响应式设计中有什么需要注意的?

在实际应用中,文本长度往往不是固定的,而且我们的页面需要在各种屏幕尺寸下表现良好。这给纯CSS的打字效果带来了一些挑战,因为它本质上是基于固定字符数(steps()参数)和预设动画时长来工作的。

一个显著的问题是,如果steps()参数和文本的实际字符数不匹配,效果就会出错。字符数少了,动画结束前文本就显示完了;字符数多了,动画结束了文本还没显示完。这在纯CSS中是个硬伤,因为CSS无法动态获取文本长度。所以,对于动态文本,通常需要借助JavaScript来计算文本长度,然后动态设置steps()的参数和动画时长。例如,可以根据文本长度,设定每字符动画时长,然后计算总时长。

响应式设计方面,width: 100%或固定像素值在不同屏幕尺寸下可能会导致文本溢出或留白过多。我通常会结合使用max-width: 100%或者width: fit-content(如前面代码所示),这样容器能自动适应内容的最大宽度,同时不会超出父容器。但即便如此,@keyframesto { width: ... }的值也需要足够大以覆盖所有可能的文本长度,或者使用ch单位(字符宽度单位),例如to { width: 20ch },这在等宽字体下相对精确,但对于变宽字体则不那么可靠。

另外,光标的定位也需要注意。如果文本换行了(虽然我们通常会用white-space: nowrap避免),光标可能不会在文本末尾。还有,如果文本内容很长,动画时长设置不当,用户可能需要等待很久。所以,在设计时,要平衡好动画时长和用户体验。太快了看不清,太慢了又烦躁。

总的来说,纯CSS的打字效果对于固定、简短的文本非常适用,实现起来简洁优雅。但一旦涉及到动态内容、复杂的交互(比如暂停、回退、删除),或者对性能有极高要求时,JavaScript的介入几乎是不可避免的。JavaScript可以提供更精细的控制,例如逐字添加文本、动态调整动画参数,甚至模拟更复杂的打字机行为。但作为一种视觉增强,纯CSS方案在很多场景下已经足够出色。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

499

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

166

2023.10.07

CSS position定位有几种方式
CSS position定位有几种方式

有4种,分别是静态定位、相对定位、绝对定位和固定定位。更多关于CSS position定位有几种方式的内容,可以访问下面的文章。

83

2023.11.23

overflow什么意思
overflow什么意思

overflow是一个用于控制元素溢出内容的属性,当元素的内容超出其指定的尺寸时,overflow属性可以决定如何处理这些溢出的内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1857

2024.08.15

html边框设置教程
html边框设置教程

本教程将带你全面掌握HTML/CSS边框设置,从基础的border属性讲起,涵盖所有边框样式、圆角设置及高级技巧,帮助你快速上手实现各种边框效果。

44

2025.09.02

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

24

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

80

2026.03.06

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

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

187

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

339

2026.03.04

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 41.9万人学习

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

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