当前位置: 首页 > web >正文

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | AutoTextEffect(自动打字机)

📅 我们继续 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.xdnf.cn/news/15646.html

相关文章:

  • 尚庭公寓-------图片上传接口
  • 【c++深入系列】:万字详解list(附模拟实现的list源码)
  • 【unitrix】 6.4 类型化数特征(t_number.rs)
  • JavaScript进阶篇——第六章 内置构造函数与内置方法
  • 21、鸿蒙Harmony Next开发:组件导航(Navigation)
  • 主机安全---开源wazuh安装
  • 【Unity】IL2CPP相关理论知识学习
  • Spring MVC中@PathVariable的用法详解
  • AR智能巡检:电力行业数字化转型的“加速器”
  • Java 8新特性 函数式编程实践
  • python基础②-数据结构
  • 第二十一 篇 PDF文档自动化:Python一键合并、分割、水印、提取与加密解密!你的PDF全能管家!
  • 《通信原理》学习笔记——第二章
  • 【前端】Vue3 前端项目实现动态显示当前系统时间
  • 【TVM 教程】FAQ
  • 筑牢网络安全防线:DDoS/CC 攻击全链路防护技术解析
  • Hadoop(三)
  • PyTorch 损失函数详解:从理论到实践
  • Qt小组件 - 7 SQL Thread Qt访问数据库ORM
  • Uniapp中双弹窗为什么无法显示?
  • 玩转Docker | 使用Docker部署bender个人导航页工具
  • 利用Java自定义格式,循环导出数据、图片到excel
  • 【论文阅读 | CVPR 2023 |CDDFuse:基于相关性驱动的双分支特征分解的多模态图像融合】
  • lua(xlua)基础知识点记录
  • 【前端】在Vue3中绘制多系列柱状图与曲线图
  • 量子比特耦合与系统集成:量子计算硬件的核心突破
  • 入门华为数通,HCIA/HCIP/HCIE该怎么选?
  • 2025年自动化工程、物联网与计算机应用国际会议(AEITCA 2025)
  • Java基础:分支/循环/数组
  • PLC-BMS电力载波通信技术深度解析:智能电网与储能系统的融合创新