讲师中心 微信公众号
AI工具推荐 视频效率加速

CSS打字机效果:如何优雅地停止闪烁光标与居中文本

小强吖_3074

小强吖_3074

发布时间:2025-12-09 14:55:52

|

188人浏览过

|

来源于php中文网

原创

css打字机效果:如何优雅地停止闪烁光标与居中文本

本教程深入探讨CSS打字机效果的实现与优化。我们将学习如何通过CSS动画精确控制文本的逐字显示,并重点解决在文本输入完成后,如何优雅地停止闪烁光标的问题。同时,文章还将介绍如何调整文本对齐方式,以实现更美观的视觉呈现,确保动画效果的完整性和专业性。

CSS打字机效果基础:原理与实现

CSS打字机效果通过模拟真实打字过程,逐字显示文本,并通常伴随一个闪烁的光标。其核心原理是利用CSS的overflow: hidden、white-space: nowrap以及width动画来控制文本的显示范围,结合border-right属性模拟光标。

让我们先看一个典型的打字机效果实现代码:

<div class="col-twelve">
   <h5>print("Hello, World!")</h5>
</div>
.col-twelve h5 {
  overflow: hidden; /* 确保内容在动画完成前不显示 */
  border-right: 0.15em solid orange; /* 模拟打字机光标 */
  white-space: nowrap; /* 保持内容在单行 */
  margin: 0 auto; /* 使其在父容器中水平居中 */
  letter-spacing: 0.15em; /* 调整字间距 */
  animation: typing 3.5s steps(50, end) forwards,
    blink-caret 0.75s step-end infinite; /* 应用打字和光标闪烁动画 */
}

/* 打字动画:逐渐增加宽度以显示文本 */
@keyframes typing {
  from {
    width: 0;
  }
  to {
    width: 35%; /* 动画结束时的宽度,应覆盖所有文本 */
  }
}

/* 光标闪烁动画:控制边框颜色实现闪烁 */
@keyframes blink-caret {
  from,
  to {
    border-color: transparent; /* 光标透明 */
  }
  50% {
    border-color: rgb(255, 255, 255); /* 光标显示 */
  }
}

代码解析:

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

  • overflow: hidden;:隐藏超出元素宽度的内容。
  • white-space: nowrap;:防止文本换行,确保所有文本都在一行。
  • border-right: 0.15em solid orange;:作为打字机光标的视觉表现。
  • margin: 0 auto;:使h5元素(块级元素)在父容器中水平居中。
  • animation: typing ... forwards, blink-caret ... infinite;:同时应用两个动画。
    • typing动画通过从width: 0到width: 35%的过渡,配合steps(50, end)(步进动画),模拟文本逐字显示。forwards属性确保动画结束后元素保持其最终状态(width: 35%)。
    • blink-caret动画则通过改变border-color在透明和白色之间切换,创建闪烁效果。infinite属性表示该动画将无限循环。

核心问题:打字动画完成后如何停止闪烁光标

在上述代码中,typing动画会在3.5秒后完成并停止,但blink-caret动画由于设置了infinite,会无限期地闪烁下去。这通常不是我们希望的效果,我们期望在文本完全显示后,光标也能停止闪烁。

解决方案:调整光标动画的迭代次数与延迟

要解决这个问题,我们需要修改blink-caret动画的属性,使其在typing动画结束后停止。一种有效的方法是计算typing动画的持续时间,然后让blink-caret动画运行相应的迭代次数,并在其结束后保持最终状态。

  1. 确定typing动画的持续时间: 原始代码中为3.5s。
  2. 计算blink-caret动画所需的迭代次数: blink-caret的单次循环持续时间为0.75s。为了使其在typing动画持续期间(或稍长一点)运行,我们需要计算 3.5s / 0.75s ≈ 4.66。因此,将其迭代次数设置为5次是比较合适的,这样它会运行 5 * 0.75s = 3.75s,略微超出打字动画,给用户一个“完成”的感知后停止。
  3. 添加forwards属性: 确保blink-caret动画在完成所有迭代后,保持其最终状态(即光标透明)。

修改后的animation属性如下:

html-to-pptx
html-to-pptx

将多页 HTML 演示文稿转换为美化的 PPTX 文件,便于分享和分发。

下载
.col-twelve h5 {
  /* ...其他属性不变... */
  animation: typing 3.5s steps(50, end) forwards,
    blink-caret 0.75s step-end 5 forwards; /* 修改光标动画属性 */
}

现在,blink-caret动画将运行5次,总计3.75秒,随后停止并隐藏光标,从而实现打字效果完成后光标自动消失的预期行为。

优化视觉呈现:文本居中对齐

在打字机效果中,除了动画的停止,文本的对齐方式也对整体视觉效果至关重要。原始代码中使用了margin: 0 auto;来使h5元素(一个块级元素)在父容器中水平居中。然而,这只居中了h5元素本身,而不是h5内部的文本内容。当h5的width在动画过程中从0增长到35%时,文本默认是左对齐的。

为了让文本在h5元素内部也保持居中对齐,我们可以添加text-align: center;属性。

.col-twelve h5 {
  overflow: hidden;
  border-right: 0.15em solid orange;
  white-space: nowrap;
  margin: 0 auto;
  letter-spacing: 0.15em;
  text-align: center; /* 添加文本居中对齐 */
  animation: typing 3.5s steps(50, end) forwards,
    blink-caret 0.75s step-end 5 forwards;
}
/* ... @keyframes 保持不变 ... */

margin: 0 auto;与text-align: center;的区别:

  • margin: 0 auto;:应用于块级元素,使其在父容器中水平居中。它改变的是元素自身的位置。
  • text-align: center;:应用于块级元素,使其内部的行内内容(如文本、图片、<span>等)水平居中。它改变的是元素内容的对齐方式。

在打字机效果中,同时使用这两个属性可以确保h5容器本身居中,并且容器内的文本在打字过程中也保持居中显示,提供更平衡和美观的视觉体验。

完整示例与综合应用

下面是结合了停止闪烁光标和文本居中对齐的完整HTML和CSS代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS打字机效果教程</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            background-color: #282c34;
            margin: 0;
            font-family: 'Courier New', Courier, monospace;
        }

        .col-twelve {
            width: 100%; /* 确保父容器有足够宽度 */
            text-align: center; /* 确保父容器内的h5能居中 */
        }

        .col-twelve h5 {
            overflow: hidden; /* 确保内容在动画完成前不显示 */
            border-right: 0.15em solid orange; /* 模拟打字机光标 */
            white-space: nowrap; /* 保持内容在单行 */
            margin: 0 auto; /* 使h5元素在父容器中水平居中 */
            letter-spacing: 0.15em; /* 调整字间距 */
            font-size: 2em; /* 调整字体大小 */
            color: #ffffff; /* 文本颜色 */
            max-width: 35%; /* 确保宽度不会超过此值,与动画to:width保持一致 */
            text-align: center; /* 确保文本在h5内部居中 */

            /* 关键动画属性 */
            animation: typing 3.5s steps(22, end) forwards, /* 22是"print("Hello, World!")"的字符数 */
                       blink-caret 0.75s step-end 5 forwards; /* 光标闪烁5次后停止 */
        }

        /* 打字动画:逐渐增加宽度以显示文本 */
        @keyframes typing {
            from {
                width: 0;
            }
            to {
                width: 35%; /* 动画结束时的宽度,应覆盖所有文本 */
            }
        }

        /* 光标闪烁动画:控制边框颜色实现闪烁 */
        @keyframes blink-caret {
            from,
            to {
                border-color: transparent; /* 光标透明 */
            }
            50% {
                border-color: rgb(255, 255, 255); /* 光标显示 */
            }
        }
    </style>
</head>
<body>
    <div class="col-twelve">
       <h5>print("Hello, World!")</h5>
    </div>
</body>
</html>

注意:

  • steps(50, end)中的数字50是原始示例中的值,通常应根据文本的实际字符数(或近似值)来设置,以确保每个字符的显示都对应一个步进。例如,"print(\"Hello, World!\")"有22个字符,所以steps(22, end)会更精确。
  • to { width: 35%; }这个值需要根据实际文本内容和字体大小进行调整,以确保35%的宽度恰好能容纳所有文本,不多不少。在实际开发中,更推荐使用max-content或通过JavaScript动态计算宽度。

注意事项与最佳实践

  1. 文本长度与动画时间匹配: steps()函数中的步数应与文本的字符数大致匹配,以获得流畅的打字效果。typing动画的duration(持续时间)也应与文本长度成正比。如果文本很长,width百分比可能不足以覆盖,或需要更大的百分比。
  2. 响应式设计: 使用width的百分比单位有助于响应式布局,但仍需测试不同屏幕尺寸下的效果。在某些情况下,可能需要使用vw单位或媒体查询来调整width的终点值。
  3. 可访问性: 对于依赖视觉动画的用户,应考虑提供替代方案,例如在动画完成后显示完整文本,或者允许用户暂停/禁用动画。为屏幕阅读器提供有意义的文本内容。
  4. JavaScript辅助: 对于更复杂的场景,例如动态加载的文本、用户交互控制动画、或者需要更精确地控制动画的开始/停止,JavaScript是更灵活和强大的选择。例如,可以通过JavaScript在typing动画结束后移除blink-caret类。
  5. 性能考量: 尽管CSS动画通常性能良好,但过度复杂的动画或在大量元素上使用动画仍可能影响页面性能。合理优化动画属性和使用硬件加速(如transform属性)是最佳实践。

总结

本教程详细介绍了如何使用CSS实现打字机效果,并着重解决了两个关键优化点:一是通过精确控制blink-caret动画的迭代次数

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2500

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

249

2026.02.03

overflow什么意思
overflow什么意思

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

3160

2024.08.15

margin在css中是啥意思
margin在css中是啥意思

在CSS中,margin是一个用于设置元素外边距的属性。想了解更多margin的相关内容,可以阅读本专题下面的文章。

837

2023.12.18

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

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

2113

2025.09.02

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

20

2026.09.30

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

40

2026.09.30

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

20

2026.09.30

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

20

2026.09.30

热门下载

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

精品课程

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

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 5.8万人学习

CSS教程
CSS教程

共754课时 | 95.6万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn