CSS打字机效果:完成打字后停止光标闪烁的实现教程

CSS打字机效果:完成打字后停止光标闪烁的实现教程

本教程旨在解决css打字机效果中光标持续闪烁的问题。通过调整css动画的animation-delay和animation-iteration-count属性,可以实现在文本内容完全显示后,让打字光标停止闪烁并最终消失,从而提供一个更自然、完整的动画体验。

在网页开发中,CSS打字机效果是一种常见的文本动画,它能模拟文字逐个字符出现的动态过程,并通常伴随一个闪烁的光标。然而,一个常见的需求是,在文本内容完全显示后,希望这个光标能够停止闪烁,甚至消失,以表示打字过程的结束。如果处理不当,光标可能会无限期地闪烁下去,影响用户体验。

问题分析:无限闪烁的光标

我们来看一个典型的CSS打字机效果代码片段:

print("Hello, World!")
.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%; /* 假设文本宽度为35% */  }}@keyframes blink-caret {  from,  to {    border-color: transparent; /* 光标透明 */  }  50% {    border-color: rgb(255, 255, 255); /* 光标显示 */  }}

在这段代码中,typing动画负责文本的逐字显示,而blink-caret动画则控制光标的闪烁。问题的核心在于blink-caret动画的animation属性中使用了infinite关键字:

animation: blink-caret 0.75s step-end infinite;

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

infinite意味着blink-caret动画将无限次重复,导致光标永不停止闪烁。为了在打字结束后停止光标闪烁,我们需要修改blink-caret动画的迭代次数和开始时间。

解决方案:精确控制光标动画

要解决光标无限闪烁的问题,我们需要对blink-caret动画的animation属性进行以下调整:

设置动画延迟(animation-delay):让blink-caret动画在typing动画完成后才开始。设置迭代次数(animation-iteration-count):将infinite替换为一个有限的数字,例如1或3,以控制光标闪烁的次数。设置动画填充模式(animation-fill-mode):使用forwards确保动画在结束后保持其最终状态。

假设typing动画的持续时间是3.5s。如果我们希望光标在文本打完后,再闪烁一次然后消失,可以这样修改:

.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 1 3.5s forwards; /* 关键修改 */}

代码解析:

typing 3.5s steps(50, end) forwards:typing动画持续3.5秒,steps(50, end)使其像打字一样逐字出现,forwards确保动画结束后元素保持最终状态(即width: 35%)。blink-caret 0.75s step-end 1 3.5s forwards:blink-caret:动画名称。0.75s:每次闪烁的持续时间。step-end:时间函数,确保在动画周期结束时切换状态,模拟即时开关。1:迭代次数。这里设置为1,表示光标在typing动画结束后,只会闪烁一个周期。3.5s:动画延迟。这使得blink-caret动画在typing动画完成(3.5秒后)才开始执行。forwards:动画结束后,元素将保持blink-caret动画的最终状态。根据@keyframes blink-caret的定义,to状态是border-color: transparent,因此光标最终会变为透明并消失。

示例代码

将上述修改整合到完整代码中:

CSS打字机效果演示body {  display: flex;  justify-content: center;  align-items: center;  min-height: 100vh;  background-color: #282c34;  font-family: 'Courier New', Courier, monospace;  color: #fff;  margin: 0;}.col-twelve {  background-color: #333;  padding: 20px;  border-radius: 8px;  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);}.col-twelve h5 {  font-size: 2em;  font-weight: normal;  display: inline-block; /* 确保width属性生效 */  overflow: hidden; /* 确保内容在动画完成前不显示 */  border-right: 0.15em solid orange; /* 打字机光标 */  white-space: nowrap; /* 保持内容在单行 */  margin: 0; /* 移除默认外边距 */  letter-spacing: 0.15em; /* 调整字间距 */  /* 组合动画:打字动画和光标闪烁动画 */  animation: typing 3.5s steps(22, end) forwards, /* 22是"print("Hello, World!")"的字符数 */             blink-caret 0.75s step-end 1 3.5s forwards;}/* 关键帧动画定义 */@keyframes typing {  from {    width: 0;  }  to {    /* 这里的width值需要根据实际文本长度和letter-spacing调整 */    /* 假设每个字符宽度固定,可以设置为百分比或em单位 */    /* 对于"print("Hello, World!")",大约22个字符,可以根据实际渲染调整 */    width: 15.5em; /* 根据实际文本内容和letter-spacing调整 */  }}@keyframes blink-caret {  from,  to {    border-color: transparent; /* 光标透明 */  }  50% {    border-color: orange; /* 光标显示为橙色 */  }}  
print("Hello, World!")

注意事项:

width属性的计算:@keyframes typing中的to { width: …; }需要精确匹配文本内容的实际渲染宽度。如果设置过小,文本可能无法完全显示;如果设置过大,可能会出现额外的空白。一个更精确的方法是使用JavaScript动态计算文本宽度,或者通过反复调试CSS的em或ch单位来估算。在示例中,我将steps值从50调整为22(字符串字符数),并将to的width设置为15.5em,这是一个经验值,可能需要根据字体大小和letter-spacing进行微调。animation-fill-mode: forwards:这个属性非常重要,它确保动画在结束后保持其最终状态。对于typing动画,这意味着文本会保持完全显示;对于blink-caret动画,这意味着光标会保持透明状态(即消失)。光标停留或消失:如果希望光标在打字结束后消失,如本教程所示,blink-caret的forwards会使其停留在border-color: transparent状态。如果希望光标在打字结束后保持可见但不闪烁,则需要更复杂的处理。一种方法是让blink-caret在最后一次闪烁后,将其border-color设置为非透明,或者在动画结束后通过额外的CSS规则或JavaScript来覆盖border-right的颜色。但最直接的纯CSS方法是让它消失。steps()函数的第一个参数:steps(N, end)中的N通常应设置为文本的字符数,或者略大于字符数以确保平滑过渡。这与typing动画的width属性紧密相关。

总结

通过对CSS动画属性animation-delay、animation-iteration-count和animation-fill-mode的精确控制,我们可以优雅地解决CSS打字机效果中光标无限闪烁的问题。这种方法不仅保持了纯CSS的实现方式,还提供了灵活的定制选项,可以根据具体需求调整光标的闪烁次数和最终状态。理解这些动画属性的工作原理是创建复杂而流畅的CSS动画的关键。

以上就是CSS打字机效果:完成打字后停止光标闪烁的实现教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1603452.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
WordPress/WooCommerce:为产品标题添加必填属性的专业指南
上一篇 2025年12月23日 17:13:09
解决Bootstrap 5导航栏切换按钮失效问题:完整指南
下一篇 2025年12月23日 17:13:16

相关推荐

  • 如何解决前端项目中的图标管理问题?使用Composer可以轻松集成BootstrapIcons

    可以通过以下地址学习Composer:学习地址 在前端开发中,图标的选择和管理一直是一个让人头疼的问题。最近在开发一个新项目时,我遇到了一个棘手的情况:项目中需要使用大量图标,但这些图标来自不同的来源,导致样式不统一,管理起来也非常复杂。这不仅影响了项目的美观度,还严重拖慢了开发进度。 为了解决这个…

    用户投稿 2026年8月27日
    000
  • safari浏览器无法播放视频是什么问题_safari浏览器视频无法播放原因

    首先检查Safari的自动播放权限并允许特定网站播放视频,接着确认已启用JavaScript以确保播放器正常加载,然后清除浏览器缓存与网站数据解决潜在的脚本错误,更新macOS和Safari至最新版本以支持现代视频格式与DRM保护,临时禁用内容拦截或广告屏蔽扩展排除插件干扰,最后通过切换网络环境和配…

    2026年8月27日
    000
  • GreatSQL 8.4.4-4 GA (2025-10-15)

    GreatSQL 8.4.4-4 GA (2025-10-15) 版本信息 发布时间:2025年10月15日 版本号:8.4.4-4, Revision d73de75905d 下载链接:https://www.php.cn/link/b68f0b79fc8f10966e8642318429eab6…

    2026年8月27日
    100
  • Hibernate Search中嵌入/关联对象索引的深度解析与实践

    本文深入探讨了在使用Hibernate Search对关联或嵌入式对象进行索引时遇到的常见问题,特别是当尝试将嵌入对象中的特定字段纳入主实体的索引时。通过分析HSEARCH000216错误,文章详细阐述了@IndexedEmbedded与@Field注解的协同工作机制,并提供了一个具体的代码示例来演…

    2026年8月27日
    000
  • Node.js/JavaScript:高效转换嵌套对象数组为自定义字符串格式

    本文将指导您如何在Node.js或JavaScript环境中,将来自MongoDB等数据源的嵌套对象数组,高效地转换为扁平化的自定义字符串格式。通过运用Array.prototype.map()、解构赋值、展开语法和模板字面量等现代JavaScript特性,您将学会如何优雅地处理复杂数据结构,实现清…

    2026年8月27日
    000
  • 使用 Java 配合 Locale 动态 Switch 语句

    本文介绍了在 Java 中如何使用 `switch` 语句配合 `Locale` 实现动态的语言环境切换。由于 `switch` 语句的 `case` 标签必须是常量表达式,直接使用从 `ResourceBundle` 获取的值是不允许的。本文提供了两种解决方案:使用 `if-else if` 结构…

    2026年8月27日
    000
  • VSCode怎么运行多个HTML_VSCode同时启动多个网页开发调试教程

    答案:在VSCode中同时运行和调试多个HTML文件可通过Live Server插件、http-server命令行工具或配置launch.json实现;推荐使用http-server配合多根工作区进行预览,或通过launch.json的compounds功能组合多个调试配置,实现多页面协同调试,提升…

    2026年8月27日
    000
  • Java中计算对象数组特定属性的平均值与最大值教程

    本教程详细阐述了如何在java中处理包含字符串和整数变量的对象数组,以计算其中特定整数属性(如学生分数)的平均值和最大值。文章将通过一个学生管理示例,演示如何正确设计对象类、遍历对象数组、提取数值数据,并高效地进行统计计算。 在Java应用程序开发中,我们经常需要对自定义对象数组中的数据进行统计分析…

    2026年8月27日
    000
  • Linux内核版本引起系统负载load值异常的问题

    在我们运行相同java服务的两个服务器上,出现了不同寻常的情况:服务器xxx.xxx.xxx.95的负载值(load)明显高于服务器xxx.xxx.xxx.215,尽管它们的硬件配置和jvm设置完全相同。 经过仔细检查,我们发现: 1)起初,我们认为可能是阿里云宿主机的问题。经过与阿里云沟通,我们将…

    2026年8月27日
    000
  • VSCode怎么用Java语言_VSCode配置Java开发环境与项目创建教程

    答案:VSCode通过安装JDK和Java扩展包可高效开发Java,支持运行调试,配置多模块项目及远程调试,适合轻量与多语言场景,但复杂项目和企业框架支持上弱于IntelliJ IDEA。 VSCode确实是款很棒的工具,用它来写Java代码完全没问题,而且体验还挺不错的。核心就是安装Java开发工…

    2026年8月27日
    000
  • VBA与数据库——添加新的数据库驱动程序

    在前面provider字符串编写中,我们已经探讨了如何查找电脑上安装的数据库驱动程序。现在,让我们继续了解如何添加新的数据库驱动程序。 在使用Windows系统上的Office Excel时,Access数据库通常是非常方便的选择。然而,由于我在使用Access时遇到了一些问题,我转而使用了SQLi…

    2026年8月27日
    100
  • Java中使用字母表编码单词

    本文介绍了如何使用Java将单词按照给定的字母表进行编码。通过示例代码详细讲解了编码的实现过程,包括字母大小写转换、循环顺序调整以及结果输出格式化等方面,帮助读者理解并掌握该编码方法。 在Java中,我们经常需要将字符串按照特定的规则进行编码。例如,给定一个字母表,我们需要将一个单词转换为该字母表中…

    2026年8月27日
    100
  • PHP函数库设计原则是什么_PHP函数库设计最佳实践

    设计PHP函数库需遵循命名清晰、单一职责、输入验证、文档化等原则。函数名应动词开头,如sendEmail();每个函数只做一件事;参数需校验并抛出异常;添加PHPDoc注释;避免全局依赖;返回值保持一致。 设计PHP函数库时,核心目标是提升代码的可重用性、可维护性和易用性。良好的函数库不仅让开发者使…

    2026年8月27日
    100
  • 如何优雅地在LaravelBlade视图中使用图标?mallardduck/blade-boxicons助你轻松搞定!

    可以通过一下地址学习composer:学习地址 在现代 web 应用中,图标扮演着不可或缺的角色。它们不仅能美化界面,还能直观地传达信息,提升用户交互体验。然而,对于 laravel 开发者来说,将图标整合到 blade 视图中,却常常伴随着一些“甜蜜的烦恼”。 还记得那些日子吗?为了在项目中引入一…

    用户投稿 2026年8月27日
    100
  • VSCode怎么用NodeJS联想_VSCode配置Node.js智能提示与自动补全功能教程

    VSCode在Node.js项目中实现智能提示的核心是通过jsconfig.json或tsconfig.json配置文件,结合@types类型定义和语言服务解析代码结构。正确设置module、target、baseUrl、paths等选项,并安装对应@types包,可显著提升代码联想准确性;对于无类…

    2026年8月27日
    200
  • 避免命令行输出被其他线程打印信息中断

    本文旨在解决多线程环境下,命令行交互过程中,其他线程的输出信息干扰用户输入的问题。文章将阐述为何无法完全阻止此类中断,并提供几种可行的解决方案,包括重定向输出、使用命名管道以及利用 curses 库进行多线程控制台程序设计。 在多线程 Java 程序中,当一个线程(例如主线程)通过 Scanner.…

    2026年8月27日
    100
  • qq浏览器怎么批量删除重复的收藏夹_QQ浏览器重复收藏夹批量清理技巧

    首先使用QQ浏览器内置整理功能可快速批量删除重复书签,进入收藏夹后点击整理选项,系统自动扫描并允许勾选删除重复项;若重复较多,建议导出收藏夹为HTML文件,通过电脑端Excel或文本工具提取网址并删除重复内容,再重新导入;还可借助第三方书签管理工具如Raindrop.io导入数据,利用其智能识别功能…

    2026年8月27日
    200
  • Laravel与Livewire实现实时前端

    使用laravel和livewire实现实时前端可以通过以下步骤实现:1. 安装和配置livewire,使用composer安装并在视图中添加必要的样式和脚本;2. 创建livewire组件,使用命令行工具生成组件文件,并在其中定义属性和方法;3. 在laravel视图中使用livewire组件,实…

    2026年8月27日
    100
  • 如何优雅地管理PHP异步操作:使用Composer引入GuzzleHttp/Promises

    Composer在线学习地址:学习地址 告别“回调地狱”:PHP异步操作的痛点 你是否曾遇到这样的场景:你的php应用需要从多个外部服务获取数据,或者执行一些耗时的后台任务。如果这些操作都是同步进行的,那么用户就得眼睁睁地看着页面转圈,直到所有操作完成。这不仅严重影响了用户体验,也浪费了服务器资源。…

    用户投稿 2026年8月27日
    100
  • 使用Yii作为微服务架构的后端

    使用yii框架可以有效地构建微服务架构的后端。1) yii的restful api支持强大,适合定义和管理api端点。2) 依赖注入容器便于管理服务间依赖。3) 模块化设计有助于功能拆分和重组。4) 性能优化和最佳实践,如缓存和日志系统,提升服务性能和可靠性。 你想知道如何使用Yii框架来构建微服务…

    2026年8月27日
    100

发表回复

登录后才能评论
关注微信