📅 我们继续 50 个小项目挑战!—— AutoTextEffect组件

仓库地址:https://github.com/SunACong/50-vue-projects

项目预览地址:https://50-vue-projects.vercel.app/。

在这里插入图片描述


利用 Vue 3 的 Composition API 和一些简单的 CSS 动画来构建一个动态的打字机效果。这个效果不仅能够逐个字符地显示文本,还能模拟删除操作,为用户带来更丰富的视觉体验。

🎯 组件目标

  • 实现逐字显现文本的打字机效果
  • 支持调节打字速度
  • 模拟删除操作,增加互动性
  • 使用 Vue 3 Composition API 管理状态与生命周期

⚙️ 技术实现点

技术点描述
Vue 3 <script setup>利用响应式变量管理显示文本、速度等状态
ref 响应式引用控制显示文本、是否删除状态和定时器ID
生命周期钩子 (onMounted, onUnmounted)自动启动/清理动画逻辑
watch 监听器实时响应打字速度变化
CSS 动画实现光标闪烁效果

🧱 组件实现

模板结构 <template>

<template><div class="flex min-h-screen flex-col items-center justify-center bg-gray-900 text-white"><div class="min-h-[3rem] p-4 text-center text-2xl font-bold">{{ displayedText }}<span class="inline-block w-[1ch] animate-ping align-bottom">|</span></div><div class="mt-8 flex flex-col items-center"><label for="speed" class="mb-2 text-lg">调节打字速度</label><input id="speed" type="range" min="50" max="500" v-model="speed" class="w-64" /><span class="mt-2">速度: {{ speed }}ms</span></div></div>
</template>

此模板包括一个用于显示打字机效果的区域和一个滑块控件,允许用户调整打字速度。

脚本逻辑 <script setup>

<script setup>
import { ref, watch, onMounted, onUnmounted } from 'vue'const fullText = '这是一个打字机效果示例,字母或汉字会一个个显示!'
const displayedText = ref('')
const speed = ref(150)const isDeleting = ref(false)
let timeoutId = null
let index = 0const typeLoop = () => {const current = fullText.slice(0, index)displayedText.value = currentif (!isDeleting.value) {if (index < fullText.length) {index++timeoutId = setTimeout(typeLoop, speed.value)} else {isDeleting.value = truetimeoutId = setTimeout(typeLoop, 1000) // 停顿后开始删除}} else {if (index > 0) {index--timeoutId = setTimeout(typeLoop, speed.value)} else {isDeleting.value = falsetimeoutId = setTimeout(typeLoop, 500) // 停顿后重新打字}}
}onMounted(() => {typeLoop()
})onUnmounted(() => {if (timeoutId) clearTimeout(timeoutId)
})watch(speed, (newSpeed) => {// 每次变速立即影响后续节奏if (timeoutId) {clearTimeout(timeoutId)timeoutId = setTimeout(typeLoop, newSpeed)}
})
</script>

这段脚本实现了核心逻辑,包括:

  • 初始化状态和设置默认值
  • 定义打字循环函数 typeLoop
  • 使用 onMountedonUnmounted 来控制动画的启动与清理
  • 使用 watch 来监听并即时响应打字速度的变化

🔍 关键功能解析

✅ 打字机逻辑

typeLoop 函数负责处理文本的显示和删除过程。它首先获取当前要显示的文本片段,然后根据是否处于“删除”模式决定是添加还是移除字符。此外,该函数还引入了短暂的停顿时间,以模拟真实的打字体验。

💡 动态调整速度

通过绑定到输入范围控件的 v-model,我们可以实时调整打字速度。一旦速度发生变化,watch 监听器会立即取消当前计时器,并根据新的速度重新启动打字循环。

🎨 光标闪烁效果

利用 TailwindCSS 的 animate-ping 类,我们可以轻松实现一个闪烁的光标效果,进一步提升用户体验。


🎨 TailwindCSS 样式重点讲解

类名作用
flex, min-h-screen, flex-col, items-center, justify-center使用 Flexbox 创建一个全屏垂直居中的布局
bg-gray-900设置背景颜色为深灰色,增加对比度和视觉层次感
text-white设置文字颜色为白色,确保在深色背景下清晰可见
min-h-[3rem], p-4, text-center, text-2xl, font-bold控制文本显示区域的高度、内边距、文本对齐方式、字体大小及加粗效果
inline-block, w-[1ch], animate-ping, align-bottom实现光标的样式设置,包括宽度(字符单位)、动画效果以及垂直对齐
mt-8, flex, flex-col, items-center调整输入范围控件和其他元素的外边距、使用Flexbox进行布局,并使其内容居中对齐
mb-2, text-lg为标签提供下边距和字体大小
w-64设置滑动条的最大宽度
mt-2给速度显示文本添加上边距

📁 常量定义 + 组件路由

constants/index.js 添加组件预览常量:

{id: 30,title: 'Auto Text Effect',image: 'https://50projects50days.com/img/projects-img/30-auto-text-effect.png',link: 'AutoTextEffect',},

router/index.js 中添加路由选项:

{path: '/AutoTextEffect',name: 'AutoTextEffect',component: () => import('@/projects/AutoTextEffect.vue'),},

🏁 总结

使用 Vue 3 的 Composition API 结合 TailwindCSS 创建一个具有交互性的打字机效果。

扩展基础的打字机效果:

  • ✅ 提供一个文本框让用户自行输入想要展示的文字。
  • ✅ 字符颜色渐变
  • ✅ 背景闪烁
  • ✅ 添加粒子爆炸或其他动画效果

👉 下一篇,我们将完成PasswordGenerator组件,一个密码生成器组件,可以对生成的密码进行配置、复制。🚀

感谢阅读,欢迎点赞、收藏和分享 😊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89158.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89158.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/89158.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[RAG] LLM 交互层 | 适配器模式 | 文档解析器(`docling`库, CNN, OCR, OpenCV)

第二章&#xff1a;LLM 交互层 在上一章中&#xff0c;我们学习了作为"项目总控"的管道协调器&#xff0c;它负责协调 RAG 系统中各个功能模块。 其中最重要的协调对象之一&#xff0c;便是负责与大型语言模型&#xff08;LLM&#xff09;进行智能交互的LLM 交互层…

Golang 并发快速上手

文章目录1. 为什么要用协程&#xff1f;1.1 进程与线程1.2 协程1.3 线程和协程的区别线程协程1.4 Go 协程&#xff08;goroutines&#xff09;和协程&#xff08;coroutines&#xff09;2.Go 协程基本内容2.1 channel2.2 select2.3 future 模式3. 实践示例3.1 并发处理多个网络…

ESP32轻松实现UDP无线通信

ESP32支持UDP通信&#xff0c;这是一种轻量级、高效的通信协议&#xff0c;适用于需要快速数据传输但对数据可靠性要求不高的场景。以下是关于ESP32如何实现UDP通信的详细说明&#xff1a; 1. UDP协议简介及其适用场景 UDP&#xff08;用户数据报协议&#xff09;是一种无连接的…

Electron实现“仅首次运行时创建SQLite数据库”

在桌面应用中&#xff0c;SQLite因其轻量、嵌入式特性成为本地存储的热门选择。但若重复初始化数据库&#xff0c;会导致数据覆盖或冗余。本文将详解如何让Electron应用仅在首次启动时创建SQLite数据库&#xff0c;后续启动直接连接现有库。一、核心逻辑与实现原理 核心思路&am…

阿里开源AI大模型ThinkSound如何为视频配上灵魂之声

目录 前言 一、当AI解决视频配音的困境 二、引入“思维链”&#xff1a;让AI像专业音效师一样思考 三、背后的技术支撑 四、未来ThinkSound会如何改变我们的世界&#xff1f; 总结 &#x1f3ac; 攻城狮7号&#xff1a;个人主页 &#x1f525; 个人专栏:《AI前沿技术要闻…

图论(1):多叉树

多叉树一、基础知识1. 图 & 树2. 模板2.1 建图二、简单循环1. 【模板】树的路径求和2. 道路修建&#xff08;改&#xff09;3. 联合权值4. 毛毛虫树三、自顶向下/自底向上1. 医疗中心2. 【模板】树的直径3. 【模板】最大子树和4. 信号放大器一、基础知识 1. 图 & 树 …

楼宇自动化:Modbus 在暖通空调(HVAC)中的节能控制(一)

引言**在当今的建筑领域&#xff0c;楼宇自动化正扮演着愈发关键的角色&#xff0c;它致力于提升建筑的舒适度、安全性以及能源效率。而暖通空调&#xff08;HVAC&#xff09;系统作为楼宇自动化中的核心部分&#xff0c;其能耗在整个建筑能耗中占比相当高&#xff0c;据相关数…

【SpringBoot】注册条件+自动配置原理+自定义starter

注册条件注入到容器内实体类型对象的属性都是null&#xff0c;这些对象并没有什么实际的意义&#xff0c;因为实体类的对象就是来封装对象的&#xff0c;结果你这些对象中什么都没有&#xff1b;解决方法是1.给这些属性赋值然后再注入bean但是这些属性又是固定的不是很好&#…

Server reports Content-Length Mismatch 的根源与解决方案

“服务器声明604字节&#xff0c;Yum却期待28680字节”——当包管理器与仓库服务器之间的信任崩塌时&#xff0c;会发生什么&#xff1f;问题重现 yum install package_name ... Interrupted by header callback: Server reports Content-Length: 604 but expected size is: 28…

基于 Python/PHP/Node.js 的淘宝 API 商品数据抓取开发教程

在电商数据分析、竞品监控等场景中&#xff0c;抓取淘宝商品数据是常见需求。淘宝开放平台&#xff08;Open Platform&#xff09;提供了标准化的 API 接口&#xff0c;通过合法途径调用可高效获取商品信息。本文将分别基于 Python、PHP、Node.js 三种语言&#xff0c;详解淘宝…

【Tensor的创建】——深度学习.Torch框架

目录 1 Tensor概述 2 Tensor的创建 2.1 基本的创建方式 2.1.1 torch.tensor 2.1.2 torch.Tensor 2.2 创建线性和随机张量 2.2.1 创建线性张量 2.2.2 随机张量 1 Tensor概述 PyTorch会将数据封装成张量&#xff08;Tensor&#xff09;进行计算&#xff0c;张量就是元素为…

Python脚本批量修复文件时间戳,根据文件名或拍摄日期

实现以下功能 更正文件的 修改时间批量修改指定文件夹中的特定后缀的文件根据文件名中的日期修改&#xff08;优先&#xff09;根据 jpg 文件属性中的拍摄日期修改根据 mp4 文件属性中的创建媒体日期修改模拟运行&#xff08;Dry Run&#xff09;模式 依赖 若需要基于jpg文件属…

[Mysql] Connector / C++ 使用

一、Connector / C 使用 要使用 C 语言连接 MySQL&#xff0c;需要使用 MySQL 官网提供的库&#xff0c;可以去官网进行下载&#xff1a;MySQL :: MySQL Community Downloads 我们使用 C 接口库来进行连接&#xff0c;要正确使用&#xff0c;还需要做一些准备工作&#xff1a…

【PDF识别改名】使用京东云OCR完成PDF图片识别改名,根据PDF图片内容批量改名详细步骤和解决方案

京东云OCR识别PDF图片并批量改名解决方案一、应用场景在日常办公和文档管理中&#xff0c;经常会遇到大量 PDF 文件需要根据内容进行分类和命名的情况。例如&#xff1a;企业合同管理系统需要根据合同编号、日期等内容自动命名 PDF 文件图书馆数字化项目需要将扫描的图书章节按…

stm32-modbus-rs485程序移植过程

背景 【modbus学习笔记】Modbus协议解析_modus协议中0.001如何解析-CSDN博客 【Modbus学习笔记】stm32实现Modbus(从机)并移植_stm32 modbus数据处理-CSDN博客 继上篇成功移植modbus从机例程之后&#xff0c;我要尝试移植主机的程序。经提醒&#xff0c;可用野火的modbus代码…

Spring MVC 执行流程详解:一次请求经历了什么?

Spring MVC 执行流程详解&#xff1a;一次请求经历了什么&#xff1f; 引言 在现代 Web 开发中&#xff0c;Spring MVC 作为 Spring 框架的重要组成部分&#xff0c;广泛应用于构建灵活、可扩展的 Java Web 应用。作为一个基于 MVC&#xff08;Model-View-Controller&#xff0…

Vue 3的核心机制-解析事件流、DOM更新、数据请求、DOM操作规范及组件库DOM操作的解决方案

文章目录概要整体介绍vue 中dom操作推荐方案实例概要 从Vue 3的核心机制出发&#xff0c;结合场景、应用与实例&#xff0c;系统化解析事件流、DOM更新、数据请求、DOM操作规范及组件库DOM操作的解决方案&#xff1a; 整体介绍 ⚡️ 一、事件流处理机制 核心机制 • 三个阶段…

Python从入门到高手9.2节-Python字典的操作方法

目录 9.2.1 字典的操作 9.2.2 字典的查找 9.2.3 字典的修改 9.2.4 字典的添加 9.2.5 字典的删除 9.2.6 今天你逛街了吗 9.2.1 字典的操作 字典类型是一种抽象数据类型&#xff0c;抽象数据类型定义了数据类型的操作方法&#xff0c;在本节的内容中&#xff0c;教同学们彻…

omniparser v2 本地部署及制作docker镜像(20250715)

关于 omniparser v2 本地部署&#xff0c;网上资料不算多&#xff0c;尤其是对于土蔷内用户&#xff0c;还是有些坑的。 1、安装步骤 可参考两个CSDN博客&#xff1a; &#xff08;1&#xff09;大模型实战 - ‘OmniParser-V2本地部署安装 链接 &#xff08;2&#xff09;…

自己写个 `rsync` + `fswatch` 实时增量同步脚本,干掉 Cursor AI、Sublime Text 的SFTP等 插件!

自己写个 rsync fswatch 实时增量同步脚本&#xff0c;干掉 Cursor AI、Sublime Text 的 SFTP等 插件&#xff01; 作为一个码农&#xff0c;我最头疼的事情之一就是编辑器同步代码到服务器这块。用过各种各样的sftp、rsync插件&#xff0c;感觉不好用。。 我琢磨着&#xff1…