0

0

CSS中如何制作数据标签动画—文字逐个显现效果

爱谁谁

爱谁谁

发布时间:2025-07-18 13:59:01

|

491人浏览过

|

来源于php中文网

原创

css中制作数据标签文字逐个显现动画的核心思路是利用overflow: hidden和white-space: nowrap隐藏溢出文本,并结合steps()动画函数分步增加宽度以逐字显示。1. 使用等宽字体确保字符宽度一致;2. 设置初始宽度为0并隐藏溢出内容;3. 通过steps(n, end)将动画分为n步,每步显示一个字符;4. 可添加光标闪烁动画增强视觉效果;5. 对于不同长度文本,可通过css变量或javascript动态设置字符数和动画时间;6. 多个标签序列动画可通过animation-delay或nth-child伪类控制延迟实现。

CSS中如何制作数据标签动画—文字逐个显现效果

在CSS里制作数据标签的文字逐个显现动画,核心思路其实是巧妙地利用overflow: hiddenwhite-space: nowrap来隐藏文本溢出部分,再结合steps()这个动画计时函数,让文本宽度以离散的步长逐渐增加,每一次增加都恰好显现一个字符,就像打字机一样。

CSS中如何制作数据标签动画—文字逐个显现效果

解决方案

要实现这种效果,你需要一个包含文本的HTML元素,比如一个<span><div>。然后,关键的CSS来了:

.data-tag {
    font-family: monospace; /* 确保等宽字体,方便计算 */
    overflow: hidden; /* 隐藏超出容器的内容 */
    white-space: nowrap; /* 文本不换行 */
    width: 0; /* 初始宽度为0,完全隐藏文本 */
    animation: typeWriter 3s steps(20, end) forwards; /* 核心动画 */
    /* 额外添加打字机光标效果 */
    border-right: 0.15em solid orange; /* 模拟光标 */
    animation: 
        typeWriter 3s steps(20, end) forwards, /* 打字动画 */
        blinkCaret .75s step-end infinite; /* 光标闪烁动画 */
}

@keyframes typeWriter {
    from { width: 0; }
    to { width: 100%; } /* 最终宽度达到文本实际宽度 */
}

@keyframes blinkCaret {
    from, to { border-color: transparent; }
    50% { border-color: orange; }
}

HTML结构大概是这样:

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

CSS中如何制作数据标签动画—文字逐个显现效果
<span class="data-tag">这是一个数据标签</span>

这里面,steps(20, end)是魔法所在。它告诉浏览器,这个动画要分成20步完成,并且在每一步的末尾应用样式。如果你的文本有20个字符,那么每一步刚好显现一个字符。forwards则确保动画结束后,元素保持在最终状态(宽度100%)。至于光标,那就是额外的视觉增强,让效果更逼真。

为什么传统的transitionease无法实现这种逐字效果?

这个问题嘛,其实挺直观的。当你用transition或者animation的默认计时函数(比如ease, linear)去改变元素的宽度时,它们会试图让这个变化过程尽可能地平滑、连续。想想看,从0宽度到100%宽度,如果用ease,你会看到文本像是被“拉伸”出来一样,或者说,它会以一种模糊、渐进的方式显现,而不是我们想要的“一字一跳”的感觉。

CSS中如何制作数据标签动画—文字逐个显现效果

transition和那些平滑的animation-timing-function,它们的设计初衷就是为了创造视觉上的连贯性和流动感。它们会在动画过程中插值,计算出每毫秒应该处于的精确状态。但我们这种“逐字显现”的需求,本质上是一种离散的、非连续的视觉变化:一个字符完全出现,然后下一个,再下一个。这跟平滑插值的理念是相悖的。

steps(),它就是专门为这种“分步走”的动画而生的。它强制动画在指定步数内完成,并且只在每一步的结束点更新样式。当结合overflow: hiddenwhite-space: nowrap时,每一步的宽度增加就精确地揭示了一个新字符,完美模拟了打字机那种一敲一显的效果。所以,不是transitionease不够好,而是它们解决的问题类型不同。

如何应对不同长度文本的动画适配问题?

这确实是个实际操作中会遇到的麻烦事。如果你的数据标签文本长度不固定,那steps()里面的步数就不能写死,否则动画会显得太快或太慢,甚至显示不全。

Chromox
Chromox

Chromox是一款领先的AI在线生成平台,专为喜欢AI生成技术的爱好者制作的多种图像、视频生成方式的内容型工具平台。

下载

一个比较“CSS-only”的办法,是利用CSS自定义属性(变量)。你可以通过HTML元素的style属性或者JavaScript动态设置一个变量,来告诉CSS这个文本有多少个字符。

<span class="data-tag" style="--char-count: 15;">这是一个短标签</span>
<span class="data-tag" style="--char-count: 25;">这是一个稍长一点的数据标签</span>

然后CSS可以这样写:

.data-tag {
    /* ...其他样式不变... */
    animation: 
        typeWriter calc(var(--char-count) * 0.1s) steps(var(--char-count), end) forwards,
        blinkCaret .75s step-end infinite;
}

@keyframes typeWriter {
    from { width: 0; }
    to { width: calc(var(--char-count) * 1em); } /* 假设字体大小为1em,等宽字体 */
}

这里我把动画时间也和字符数关联起来了,calc(var(--char-count) * 0.1s)意味着每个字符显现0.1秒。to { width: calc(var(--char-count) * 1em); } 则是为了确保最终宽度能完全容纳所有字符,前提是使用了等宽字体(比如monospace)。

当然,最灵活、最精确的做法,可能还是得请JavaScript出马。JS可以精确地获取文本长度,然后动态地修改元素的animation-durationanimation-timing-function(特别是steps()的值)。比如,你可以监听某个事件,或者在页面加载时遍历所有.data-tag元素,计算其textContent.length,然后用element.style.setProperty('--char-count', length)来更新CSS变量,或者直接修改animation属性。这样虽然引入了JS,但解决了纯CSS难以动态适配的痛点。

如何为多个数据标签创建序列动画?

当你有多个数据标签需要逐个、或者说有间隔地显现时,我们不能让它们同时开始动画,那样就失去了“序列感”。这时,animation-delay就派上用场了。

最直接的方式是给每个标签设置不同的延迟:

<span class="data-tag tag-1">标签一</span>
<span class="data-tag tag-2">标签二</span>
<span class="data-tag tag-3">标签三</span>
/* 基础动画样式,同上,但可以去除光标动画,或者只给最后一个标签加光标 */
.data-tag {
    font-family: monospace;
    overflow: hidden;
    white-space: nowrap;
    width: 0;
    /* 动画时间步数根据实际文本长度来,这里假设都是短文本 */
    animation: typeWriter 1.5s steps(10, end) forwards; 
}

@keyframes typeWriter {
    from { width: 0; }
    to { width: 100%; }
}

.tag-1 { animation-delay: 0s; } /* 第一个立即开始 */
.tag-2 { animation-delay: 2s; } /* 第二个在第一个结束后(假设动画1.5s)再过0.5s开始 */
.tag-3 { animation-delay: 4s; } /* 第三个再延迟 */

这种硬编码的方式,如果标签数量不多还好。但一旦数量多了,或者结构是动态生成的,手动写tag-1, tag-2就太笨拙了。

CSS的:nth-child()伪类在这里能发挥大作用:

.container .data-tag {
    /* 基础动画样式 */
    animation: typeWriter 1.5s steps(10, end) forwards; 
}

/* 利用nth-child()实现递增延迟 */
.container .data-tag:nth-child(1) { animation-delay: 0s; }
.container .data-tag:nth-child(2) { animation-delay: 2s; }
.container .data-tag:nth-child(3) { animation-delay: 4s; }
/* ...以此类推,或者使用循环预处理器如Sass来生成 */

当然,如果你需要更精细的控制,比如每个标签的动画时间根据自身文本长度决定,并且还要序列播放,那JavaScript就几乎是不可避免的了。JS可以计算每个标签的动画总时长,然后为下一个标签计算出准确的animation-delay。这能确保动画的流畅衔接,避免了纯CSS在处理复杂序列时的局限性。毕竟,CSS虽然强大,但它在处理动态、依赖上下文的逻辑时,还是有其边界的。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.11.20

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

954

2023.09.19

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

530

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

576

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

6228

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

492

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

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

精品课程

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

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 42.5万人学习

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

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