50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Form Wave(表单label波动效果)
📅 我们继续 50 个小项目挑战!—— FormWave
组件
仓库地址:https://github.com/SunACong/50-vue-projects
项目预览地址:https://50-vue-projects.vercel.app/
🎯 组件目标
构建一个美观、动态的登录表单,重点在于实现带有浮动标签(floating label
)的输入框体验,提升交互感知和视觉效果,适合作为任何登录注册模块的基础模板。
🛠️ 技术实现点
- 使用 Vue3 +
<script setup>
编写响应式逻辑。 - 使用 TailwindCSS 完全控制样式,特别是浮动文字的动画。
- 实现
focus
/blur
状态下标签文字的动画浮动效果。 - 使用
v-model
实现双向绑定,结合focus
状态精准控制浮动逻辑。
🧱 组件实现
<!-- 🌈 模板部分 Template -->
<template><div class="flex h-screen items-center justify-center bg-gray-800 text-gray-300"><div class="rounded-2xl bg-gray-500/60 p-12 text-center"><h1 class="text-4xl font-bold text-gray-300">Please Login</h1><form><!-- Email 输入框 --><div class="form-control relative mt-10 border-b-2 border-b-white"><inputclass="peer relative z-10 w-full bg-transparent py-3 text-white focus:border-sky-300 focus:outline-none"type="text"requiredv-model="emailValue"@focus="activeInput = 'email'"@blur="handleBlur('email')" /><label class="pointer-events-none absolute top-4 left-0"><!-- ✨ 字符级浮动动画 --><spanv-for="(letter, idx) in 'Email'.split('')":key="idx":class="['inline-block min-w-[5px] text-lg transition-all duration-300','transform-gpu',{'-translate-y-8 text-sky-300':activeInput === 'email' || emailValue,},]":style="{transitionDelay: `${idx * 50}ms`,transitionTimingFunction: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',}">{{ letter }}</span></label></div><!-- Password 输入框 --><div class="form-control relative mt-10 border-b-2 border-b-white"><inputclass="peer relative z-10 w-full bg-transparent py-3 text-white focus:border-sky-300 focus:outline-none"type="password"requiredv-model="passwordValue"@focus="activeInput = 'password'"@blur="handleBlur('password')" /><label class="pointer-events-none absolute top-4 left-0"><!-- ✨ 字符级浮动动画 --><spanv-for="(letter, idx) in 'Password'.split('')":key="idx":class="['inline-block min-w-[5px] text-lg transition-all duration-300','transform-gpu',{'-translate-y-8 text-sky-300':activeInput === 'password' || passwordValue,},]":style="{transitionDelay: `${idx * 50}ms`,transitionTimingFunction: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',}">{{ letter }}</span></label></div><!-- 登录按钮 --><buttonclass="mt-10 w-full rounded bg-blue-500 px-4 py-2 font-bold hover:bg-blue-600 focus:ring-2 focus:ring-blue-400 focus:outline-none"type="submit">Login</button><p class="mt-10">Don't have an account?<a href="#" class="text-blue-400 hover:underline">Register</a></p></form></div></div>
</template>
🧩 重点效果实现
<!-- ⚙️ 脚本部分 Script -->
<script setup>
import { ref } from 'vue'// 输入值响应式变量
const emailValue = ref('')
const passwordValue = ref('')// 当前聚焦的输入项
const activeInput = ref(null)// 失焦逻辑:如果输入框为空,则取消浮动状态
const handleBlur = (inputName) => {if ((inputName === 'email' && !emailValue.value) ||(inputName === 'password' && !passwordValue.value)) {activeInput.value = null}
}
</script>
- 标签浮动是通过
translate-y
配合activeInput
或绑定值来实现的。 - 使用
transition-delay
实现了字符级别的延迟动画,让文字一个个浮动。 - 利用
cubic-bezier
定义自定义缓动函数,提升动画的弹性和自然感。
🎨 TailwindCSS 样式重点讲解
类名 | 作用 |
---|---|
peer / relative z-10 | 确保 input 在 label 之上,供 label 状态判断使用 |
-translate-y-8 | 控制文字上浮距离 |
transition-delay | 实现文字一个个浮动的动画延迟 |
transform-gpu | 使用 GPU 加速动画,提高性能和流畅度 |
focus:outline-none / focus:ring-2 | 聚焦时视觉反馈 |
min-w-[5px] | 保证字符宽度一致,不会断行 |
🧾 常量定义 + 组件路由建议
constants/index.js
添加组件预览常量:
{id: 8,title: 'Form Wave',image: 'https://50projects50days.com/img/projects-img/8-form-wave.png',link: 'FormWave',},
router/index.js
中添加路由选项:
{path: '/FormWave',name: 'FormWave',component: () => import('@/projects/FormWave.vue'),},
路由守卫可后续扩展身份验证逻辑,跳转到注册或首页。
🧠 小结
完成了通用场景下的表单样式界面,可以为你以后的表单设计以及登录页面提供一些灵感进行参考!!!🚀
👉 下一篇,我们将完成声音组件 Sound Board
组件,可以实现点击发出对应的声音!🚀
相关文章:

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Form Wave(表单label波动效果)
📅 我们继续 50 个小项目挑战!—— FormWave组件 仓库地址:https://github.com/SunACong/50-vue-projects 项目预览地址:https://50-vue-projects.vercel.app/ 🎯 组件目标 构建一个美观、动态的登录表单࿰…...

双目相机深度的误差分析(基线长度和相机焦距的选择)
全文基于针孔模型和基线水平放置来讨论 影响双目计算深度的因素: 1、基线长度:两台相机光心之间距离2、相机焦距(像素): f x f_x fx(或 f y f_y fy)为焦距 f f f和一个缩放比例的乘积。在…...

Pytorch Geometric官方例程pytorch_geometric/examples/link_pred.py环境安装教程及图数据集制作
最近需要训练图卷积神经网络(Graph Convolution Neural Network, GCNN),在配置GCNN环境上总结了一些经验。 我觉得对于初学者而言,图神经网络的训练会有2个难点: ①环境配置 ②数据集制作 一、环境配置 我最初光想…...

React---day6、7
6、组件之间进行数据传递 **6.1 父传子:**props传递属性 父组件: <div><ChildCpn name"蒋乙菥" age"18" height"1,88" /> </div>子组件: export class ChildCpn extends React.Component…...

hook组件-useEffect、useRef
hook组件-useEffect、useRef useEffect 用法及执行机制 WillMount -> render -> DidMount ShouldUpdate -> WillUpdate -> render -> DidUpdate WillUnmount(只有这个安全) WillReceiveProps useEffect(callback) 默认所有依赖都更新useEffect(callback, [])&am…...
功能结构整理
C# Sxer Sxer.Base:基础子功能 Sxer.Base.Debug:打印 Sxer.Utility:工具类 Sxer.CustomFunction:独立功能点开发 Unity...
企业级开发中的 maven-mvnd 应用实践
1. 引言:Maven 在企业级开发中的挑战 1.1 Maven 构建的常见痛点 在大型 Java 项目中,Maven 是主流的构建工具,但随着项目的复杂度增加,其性能瓶颈逐渐显现: 构建速度慢:每次执行 mvn clean install 都需要重新加载插件和依赖。重复构建浪费资源:即使未修改源码,仍会触…...
yolov12毕设前置知识准备 1
1 什么是目标检测呢? 目标检测(Object Detection)主要用于识别图像或视频中特定类型物体的位置,并标注其类别。 简单来说,就是让计算机像人类一样 “看懂” 图像内容,不仅能识别出物体(如人、…...

随机游动算法解决kSAT问题
input:n个变量的k-CNF公式 ouput:该公式的一组满足赋值或宣布没有满足赋值 算法步骤: 随机均匀地初始化赋值 a ∈ { 0 , 1 } n a\in\{0,1\}^n a∈{0,1}n.重复t次(后面会估计这个t): a. 如果在当前赋值下…...

《Discuz! X3.5开发从入门到生态共建》第1章 Discuz! 的前世今生-优雅草卓伊凡
《Discuz! X3.5开发从入门到生态共建》第1章 Discuz! 的前世今生-优雅草卓伊凡 第一节 从康盛创想到腾讯收购:PC时代的辉煌 1.1 Discuz! 的诞生:康盛创想的开源梦想 2001年,中国互联网正处于萌芽阶段,个人网站和论坛开始兴起。…...
azure web app创建分步指南系列之一
什么是 Azure Web 应用? Azure Web 应用是 Azure 应用服务的一部分,是一个完全托管的平台,用于开发、部署和扩展 Web 应用程序。它支持各种编程语言和框架,例如 .NET、Java、Python、PHP 和 Node.js,使开发人员能够构建强大的 Web 应用程序,而无需担心底层基础架构。借助…...
PyTorch实战——基于生成对抗网络生成服饰图像
PyTorch实战——基于生成对抗网络生成服饰图像 0. 前言1. 模型分析与数据准备2. 判别器3. 生成器4. 模型训练5. 模型保存与加载相关链接0. 前言 我们已经学习了生成对抗网络 (Generative Adversarial Network, GAN) 的工作原理,接下来,将学习如何将其应用于生成其他形式的内…...

笔试强训:Day6
一、小红的口罩(贪心优先级队列) 登录—专业IT笔试面试备考平台_牛客网 #include<iostream> #include<queue> #include<vector> using namespace std; int n,k; int main(){//用一个小根堆 每次使用不舒适度最小的cin>>n>&…...
【Hexo】4.Hexo 博客文章进行加密
安装 npm install --save hexo-blog-encrypt1-快速使用 将“ password”添加到您的文章信息头就像这样: password: 123456 ---2-按标签加密 1.修改文章信息头如下: title: Hello World tags: - 加密文章tag date: 2020-03-13 21:12:21 password: muyiio…...
Android --- ObjectAnimator 和 TranslateAnimation有什么区别
文章目录 2. 作用范围和功能2. 动画表现3. 是否修改 View 的属性4. 适用场景5. 性能总结: ObjectAnimator 和 TranslateAnimation 都是 Android 中常用的动画类型,但它们有以下几个关键的区别: 2. 作用范围和功能 ObjectAnimator:…...
小白的进阶之路系列之四----人工智能从初步到精通pytorch自定义数据集下
本篇涵盖的内容 在之前的文章中,我们已经讨论了如何获取数据,转换数据以及如何准备自定义数据集,本篇文章将涵盖更加深入的问题,希望通过详细的代码示例,帮助大家了解PyTorch自定义数据集是如何应对各种复杂实际情况中,数据处理的。 更加详细的,我们将讨论下面一些内容…...
安卓添加设备节点权限和selinux访问权限
# 1 修改设备节点权限及配置属性设置节点值 ## 1.1 修改设备节点权限 ### 1.1.1 不会手动卸载的节点 在system/core/rootdir/init.rc中添加节点权限 在on boot下面添加 chown system system /sys/kernel/usb/host chmod 0664 /sys/kernel/usb/host ### 1.1.2 支持热插拔的…...

谷歌Stitch:AI赋能UI设计,免费高效新利器
在AI技术日新月异的今天,各大科技巨头都在不断刷新我们对智能工具的认知。最近,谷歌在其年度I/O开发者大会期间,除了那些聚光灯下的重磅发布,还悄然上线了一款令人惊喜的AI工具——Stitch。这是一款全新的、完全免费的AI驱动UI&am…...

运营商地址和ip属地一样吗?怎么样更改ip属地地址
在互联网时代,IP属地和运营商地址是两个经常被提及的概念,但它们是否相同?如何更改IP属地地址?这些问题困扰着许多网民。本文将深入探讨这两个概念的区别,并详细介绍更改IP属地地址的方法。 一、运营商地址和IP属地一…...

在QT中,利用charts库绘制FFT图形
第1章 添加charts库 1.1 .pro工程添加chart库 1.1.1 在.pro工程里面添加charts库 1.1.2 在需要使用的地方添加这两个库函数,顺序一点不要搞错,先添加.pro,否则编译器会找不到这两个.h文件。 第2章 Charts关键绘图函数 2.1 QChart 类 QChart 是…...
ChatGPT + 知网 + 知乎,如何高效整合信息写出一篇专业内容?
——写作,不是闭门造车,而是高效聚合 🧠 为什么“信息整合力”才是AI时代的核心写作能力? 现在的写作,不缺工具,也不缺资料,缺的是: 把 scattered info 变成 structured idea 的能力…...

流媒体协议分析:流媒体传输的基石
在流媒体传输过程中,协议的选择至关重要,它决定了数据如何封装、传输和解析,直接影响着视频的播放质量和用户体验。本文将深入分析几种常见的流媒体传输协议,探讨它们的特点、应用场景及优缺点。 协议分类概述 流媒体传输协议根据…...

vscode中让文件夹一直保持展开不折叠
vscode中让文件夹一直保持展开不折叠 问题 很多小伙伴使用vscode发现空文件夹会折叠显示, 让人看起来非常难受, 如下图 解决办法 首先打开设置->setting, 搜索compact Folders, 去掉勾选即可, 如下图所示 效果如下 看起来非常爽 ! ! !...

JAVA-springboot整合Mybatis
SpringBoot从入门到精通-第15章 MyBatis框架 学习MyBatis心路历程 2022年学习java基础时候,想着怎么使用java代码操作数据库,咨询了项目上开发W同事,没有引用框架,操作数据库很麻烦,就帮我写好多行代码,就…...

深度学习pycharm debug
深度学习中,Debug 是定位并解决代码逻辑错误(如张量维度不匹配)、训练异常(如 Loss 波动)、数据问题(如标签错误)的关键手段,通过打印维度、可视化梯度等方法确保模型正常运行、优化…...

MicroPython+L298N+ESP32控制电机转速
要使用MicroPython控制L298N电机驱动板来控制电机的转速,你可以通过PWM(脉冲宽度调制)信号来调节电机速度。L298N是一个双H桥驱动器,可以同时控制两个电机的正反转和速度。 硬件准备: 1. L298N 电机控制板 2. ESP32…...
Hive的存储格式如何优化?
Hive的存储格式对查询性能、存储成本和数据处理效率有显著影响。以下是主流存储格式的特点、选择标准和优化方法: 一、主流存储格式对比 特性ORC(Optimized Row Columnar)ParquetTextFile(默认)SequenceFile数据布局…...

在部署了一台mysql5.7的机器上部署mysql8.0.35
在已部署 MySQL 5.7 的机器上部署 MySQL 8.0.35 的完整指南 在同一台服务器上部署多个 MySQL 版本需要谨慎规划,避免端口冲突和数据混淆。以下是详细的部署步骤: 一、规划配置 端口分配 MySQL 5.7:使用默认端口 3306MySQL 8.0.35࿱…...
OpenCV CUDA模块结构分析与形状描述符------在 GPU 上计算图像的原始矩(spatial moments)函数spatialMoments()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数用于在 GPU 上计算图像的原始矩(spatial moments)。这些矩可用于描述图像中物体的形状特征,如面积、质…...

QT入门学习(一)---新建工程与、信号与槽
一: 新建QT项目 二:QT文件构成 2.1 first.pro 项目管理文件,下面来看代码解析 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11TARGET main# The following define makes your compiler emit warnings if you use # any Qt feature …...