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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Golang包导入路径与命名规范示例
上一篇 2026年5月10日 11:07:22
FastAPI 中如何解析用逗号分隔的多个 Query 参数?
下一篇 2026年5月10日 11:07:24

相关推荐

  • 在vscode中怎么运行html_vscode运行html文件方法【教程】

    1、使用Live Server扩展可实现自动刷新预览,安装后右键选择Open with Live Server即可在浏览器中实时查看HTML页面效果。 如果您在使用VSCode编写HTML文件,但不知道如何快速预览页面效果,可以通过多种方式在浏览器中运行HTML文件。以下是几种常用的实现方法: 一、…

    2026年5月10日
    000
  • 自定义HTML视频控件:精确控制键盘快进/快退行为

    本教程详细讲解如何自定义HTML “ 元素的默认键盘控制行为,特别是左右箭头键的视频快进/快退步长。文章指出,仅使用 `event.preventDefault()` 不足以完全阻止浏览器默认行为,还需要结合 `event.stopPropagation()` 来确保自定义逻辑独立生效,从而实现精…

    2026年5月10日
    000
  • 用css解决标题显示字数超出省略号代替的方法

    标题字数超出场景: 最左边这栏我不行让他换行,怎么办呢? 步骤一:内容超出宽度时隐藏超出部分的内容 步骤二:当对象内文本溢出时显示省略标记(…) 立即学习“前端免费学习笔记(深入)”; 下面是解决办法: table{width:100px;table-layout:fixed;/* 只有…

    2026年5月10日
    000
  • 在HTML文件中嵌入Mermaid图表教程

    本教程详细介绍了如何在HTML文件中直接嵌入和渲染Mermaid图表。通过引入Mermaid CDN库并进行简单的初始化配置,用户可以轻松地在网页中展示流程图、时序图、甘特图等多种类型的图表,无需依赖外部工具或复杂的构建流程,实现图表内容的动态化与可视化。 引言:Mermaid图表与HTML集成 M…

    2026年5月10日
    100
  • HTML代码怎么实现版本控制_HTML代码版本控制方法与Git工具使用指南

    HTML代码需要版本控制以实现错误回溯、团队协作、功能迭代和代码审计,使用Git可通过初始化仓库、添加文件、提交修改、推送至远程仓库等步骤管理代码,常用命令包括git status、git diff、git log等,冲突时需手动编辑解决并重新提交。 HTML代码的版本控制,简单来说,就是追踪和管理…

    2026年5月10日
    000
  • 关于CSS选择器种类及使用介绍

    常用的有标签选择器、类选择器、ID选择器等等,其实还有很多,在接下来的文章中为大家详细介绍下这些选择器的种类及其使用 首先说主要都有哪些先择器 1.标签选择器(如:body,p,p,ul,li) 2.类选择器(如:class=”head”,class=”head_…

    用户投稿 2026年5月10日
    000
  • 学习 Django 时的关键主题

    1. Django 基础知识 项目结构:了解 Django 项目的基本结构(例如,settings.py、urls.py、wsgi.py)。应用程序:了解 Django 应用程序如何在项目中工作以及如何创建和管理它们。URL 和路由:定义 URL 模式并将它们链接到视图。视图:编写基于函数的视图(F…

    2026年5月10日
    100
  • Angular中如何通过点击区域外来隐藏组件内容?

    巧妙运用angular指令,轻松实现点击区域外隐藏组件 在Angular应用开发中,常遇到需要在点击组件外部区域时隐藏该组件的需求,例如点击下拉菜单外部关闭菜单。本文将介绍如何使用ng-click-outside指令优雅地解决此问题。 首先,你需要安装ng-click-outside依赖: npm …

    2026年5月10日
    000
  • 如何在点击的Div中获取正确的ID

    本文旨在解决动态生成的HTML元素中,点击事件发生时,如何准确获取与该元素关联的ID值的问题。通过事件委托和DOM遍历,我们将提供一种可靠的方法,确保在复杂的动态环境中,始终能获取到正确的ID,避免因选择器错误而导致的数据获取错误。 在动态生成的HTML结构中,经常会遇到点击事件需要获取特定ID的情…

    2026年5月10日
    000
  • React组件跨域导出与样式封装指南

    本文详细阐述了如何将React组件及其样式安全地导出并嵌入到外部Web页面中,解决了传统方法中样式丢失和命名冲突的问题。通过利用Webpack进行样式内联打包以及CSS Modules实现样式隔离,确保组件在外部环境中保持其预期的视觉效果,同时避免对宿主页面的影响,提供了一套专业且高效的解决方案。 …

    2026年5月10日
    100
  • 如何使用 CSS 实现渐变边框并显示完整的边框效果?

    css 渐变边框的实现与显示效果 想要实现渐变边框,可以使用 border-image 属性。它可以设置边框图片,而渐变色可以通过 linear-gradient() 函数来定义。 示例代码: border-image: linear-gradient(rgba(255, 255, 255, 0.0…

    2026年5月10日
    000
  • 实现水平滚动文本的淡出效果

    实现水平滚动文本的淡出效果实现水平滚动文本的淡出效果实现水平滚动文本的淡出效果实现水平滚动文本的淡出效果

    本文将介绍如何使用 CSS 实现水平滚动文本的淡出效果,尤其是在非均匀背景下,传统线性渐变方案不适用的情况下。我们将通过结合 linear-gradient 和 background-clip 属性,创建一个在水平滚动时两侧逐渐淡出的文本效果。 实现原理 核心思路是利用 CSS 的 linear-g…

    2026年5月10日 用户投稿
    200
  • 怎么用php登录_PHP用户登录验证与身份认证方法

    答案:常见PHP登录验证方法包括基于Session的用户状态跟踪、Token认证、密码哈希存储、验证码防破解及HTTPS安全设置。首先启动session并验证用户凭证,匹配后设置$_SESSION[‘user_id’]标识登录;后续请求通过检查会话变量判断登录状态。对于API…

    2026年5月10日
    000
  • 认识html 锚文本A标签

    html a目录 html a语法 锚文本作用 html a应用实例 锚文本实例截图 立即学习“前端免费学习笔记(深入)”; html a锚文本适用范围 html a应用扩展 以下是pCSS5整理关于html a、html超链接基础教程,希望对超链接CSS样式学习之前可以理解html中a标签的知识及…

    用户投稿 2026年5月10日
    000
  • 正则表达式:精确匹配所需字符串,排除其他干扰

    本文旨在帮助读者理解如何编写更精确的正则表达式,以从一组字符串中提取特定模式,同时避免不必要的匹配。通过分析一个实际案例,我们将学习如何使用否定预查、非捕获组和字符类等技巧,来优化正则表达式,使其更符合需求。 正则表达式是一种强大的文本处理工具,但编写一个既能匹配目标字符串,又能排除其他类似字符串的…

    用户投稿 2026年5月10日
    000
  • JavaScript定时器实现多图片同步切换教程

    本教程详细讲解如何利用JavaScript的setInterval函数,实现网页中多张图片(如背景图、号召性用语图和顶部图)的同步循环切换。通过维护一个共享的索引,确保所有图片在预设的时间间隔内,按照各自的图片序列同时更新,从而创建流畅且一致的视觉动态效果。 引言 在网页设计中,动态视觉效果能够极大…

    2026年5月10日
    000
  • 掌握CSS层叠上下文:将下拉菜单叠加在地图之上

    本文将深入探讨如何利用css的position和z-index属性,解决将下拉菜单等交互元素精确叠加在全屏背景元素(如地图)上方的问题。通过调整元素的定位方式和层叠顺序,确保下拉菜单在视觉上处于地图之上,实现更灵活和用户友好的界面布局。 在现代网页设计中,将交互式UI元素(如下拉菜单、模态框)叠加在…

    2026年5月10日
    200
  • JavaScript中的柯里化(Currying)和部分应用(Partial Application)有何区别?

    柯里化将多参数函数转为单参数函数链,每次调用返回新函数直至参数齐全;部分应用则预先固定部分参数,生成接收剩余参数的新函数,可一次传多个参数。例如curriedAdd(1)(2)(3)需逐个传参,而partialMultiply = multiply.bind(null, 2, 3)后直接调用part…

    2026年5月10日
    000
  • HTML注释怎么实现时间戳记录_使用注释标注代码更新时间

    答案:HTML注释时间戳可用于追踪代码修改历史、协助团队协作、定位问题和提醒维护;通过编辑器插件或构建工具自动化生成;应遵循ISO 8601格式、保持简洁并定期清理;但存在易被篡改、缺乏版本控制、增加文件体积等局限,需结合Git等系统使用。 使用HTML注释来记录时间戳,核心在于利用注释标签 ,并在…

    2026年5月10日
    100
  • JavaScript 的 super 关键字在类继承中是如何解析和绑定的?

    super关键字在JavaScript类继承中用于调用父类构造函数、方法和属性,其绑定基于类定义时的静态连接而非动态绑定。在子类构造函数中必须调用super()以初始化父类并绑定this;在实例方法中使用super.method()时,会从父类原型查找方法;在静态方法中则访问父类的静态方法。Java…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信