大家好,我是大华!今天给大家分享一个超实用的input输入框效果。 在用户点击时会有一个非常丝滑的标签上浮动画,底部还会有颜色变化,大大提升了用户的体验。
一个好看且交互流畅的表单能够:
1.提升用户体验,让填写表单不再枯燥 2.明确当前焦点位置,减少用户输入错误 3.让页面看起来更专业、更现代化
效果预览
当用户点击输入框时,原本在输入框内的标签会平滑上浮并改变颜色,同时底部会出现一条颜色条从中间向两边展开,非常酷炫!

完整源码Github地址在文章末尾。
代码实现详解
HTML 结构
首先,我们来看一下基础的 HTML 结构:
html
<div class="input-container">
<input
type="text"
v-model="form.name"
@focus="activeField = 'name'"
@blur="activeField = null"
placeholder=" "
required
>
<label>您的姓名</label>
<div class="underline"></div>
<span class="hint">请输入您的真实姓名</span>
</div>
这里有几个关键点:
1.我们使用placeholder=" "设置了一个空白的占位符,这是实现动画效果的关键; 2.@focus和@blur事件用于追踪当前哪个输入框被激活; 3.label标签是我们要做动画的元素; 4.underline是底部那条动画线条; 5.hint是输入框获得焦点时显示的提示文字;
CSS 样式
接下来是让这一切动起来的 CSS 代码:
css
.input-container {
position: relative;
width: 100%;
height: 50px;
margin-bottom: 25px;
}
.input-container input {
width: 100%; /* 输入框宽度填满容器 */
height: 100%; /* 输入框高度填满容器 */
border: none; /* 去掉默认边框 */
font-size: 16px; /* 设置字体大小 */
border-bottom: 2px solid #c0c0c0; /* 只显示底部边框,浅灰色 */
padding-top: 15px; /* 顶部内边距,为标签上浮留出空间 */
background-color: transparent; /* 透明背景 */
transition: all 0.3s ease; /* 所有样式变化都有0.3秒的平滑过渡 */
}
.input-container label {
position: absolute; /* 绝对定位,可以精确控制位置 */
bottom: 10px; /* 初始位置:距离底部10px(在输入框内部) */
left: 0; /* 左边对齐 */
color: #808080; /* 灰色文字 */
pointer-events: none; /* 禁止鼠标事件,让点击能穿透到下面的输入框 */
transition: all 0.3s ease; /* 所有样式变化都有0.3秒的平滑过渡 */
}
.input-container .underline {
position: absolute; /* 绝对定位 */
bottom: 0; /* 贴底部对齐 */
height: 2px; /* 线条高度(粗细) */
width: 100%; /* 宽度填满容器 */
background-color: #2c6fdb; /* 蓝色背景 */
transform: scaleX(0); /* 初始状态:水平方向缩放为0(完全隐藏) */
transition: all 0.3s ease; /* 所有样式变化都有0.3秒的平滑过渡 */
}
/* 核心动画效果 - 标签上浮 */
.input-container input:focus ~ label, /* 当输入框获得焦点时,选择后面的label兄弟元素 */
.input-container input:not(:placeholder-shown) ~ label { /* 当输入框有内容时(placeholder不显示时),选择后面的label兄弟元素 */
transform: translateY(-25px); /* 向上移动25像素(标签上浮效果) */
font-size: 14px; /* 字体变小 */
color: #2c6fdb; /* 文字颜色变为蓝色 */
}
/* 核心动画效果 - 底部线条展开 */
.input-container input:focus ~ .underline, /* 当输入框获得焦点时,选择后面的underline兄弟元素 */
.input-container input:not(:placeholder-shown) ~ .underline { /* 当输入框有内容时,选择后面的underline兄弟元素 */
transform: scaleX(1); /* 水平方向缩放为1(完全显示,线条展开效果) */
}
这里使用了 CSS 的兄弟选择器~,当输入框获得焦点或者有内容时,会触发标签和底部线条的动画效果。
transform: translateY(-25px)让标签向上移动 transform: scaleX(1)让底部线条从 0 扩展到完整宽度 transition: all 0.3s ease让所有变化都有 0.3 秒的平滑过渡
Vue 3 交互逻辑
最后是 Vue 3 的 JavaScript 部分:
javascript
const { createApp, ref } = Vue;
createApp({
setup() {
const form = ref({
name: '',
email: '',
password: ''
});
const activeField = ref(null);
const submitForm = () => {
// 表单验证逻辑
if (!form.value.name || !form.value.email || !form.value.password) {
alert('请填写所有必填字段');
return;
}
if (!validateEmail(form.value.email)) {
alert('请输入有效的邮箱地址');
return;
}
if (form.value.password.length < 8) {
alert('密码长度至少为8个字符');
return;
}
alert(`提交成功!\n姓名: ${form.value.name}\n邮箱: ${form.value.email}`);
};
const validateEmail = (email) => {
const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return re.test(email);
};
return {
form,
activeField,
submitForm
};
}
}).mount('#app');
这里我们使用了 Vue3 的 Composition API:
ref用于创建响应式数据form对象保存所有输入框的值activeField跟踪当前激活的输入框submitForm函数处理表单提交和验证
技术要点
1. 定位技巧
使用position: relative在输入容器上创建了一个定位上下文,然后使用 position: absolute将标签、底部线条和提示文字精确定位在输入框内。
2. CSS 选择器的妙用
通过:focus伪类和:not(:placeholder-shown)伪类,我们可以检测输入框是否获得焦点或是否有内容,从而触发不同的样式。
3. 过渡动画
transition: all 0.3s ease这一行代码让所有可动画的属性变化都有平滑的过渡效果,ease函数让动画开始和结束更加自然。
4. 兄弟选择器
CSS 中的~兄弟选择器让我们可以根据输入框的状态来改变其后面兄弟元素的样式,这是实现这个效果的关键。
实际应用建议
- 颜色搭配 :你可以根据你的品牌色调整
#2c6fdb这个颜色值 - 动画时长 :
0.3s的过渡时间很适合,不建议太长,否则会感觉响应慢 - 提示文字:提示文字要简洁明了,真正帮助用户理解需要输入什么
- 响应式设计:这个组件本身是响应式的,但你可以根据需要添加媒体查询调整不同屏幕尺寸下的表现
扩展思路
你还可以尝试:
- 添加输入验证的实时反馈
- 增加密码强度指示器
- 为不同的验证状态(正确、错误)设置不同的颜色
- 添加加载动画当表单提交时
结语
这个Vue3输入框动画效果不仅美观,而且代码结构清晰,易于理解和修改。 通过CSS和Vue3的巧妙结合,我们实现了一个既实用又炫酷的交互组件。
Github完整源码地址:github.com/1344160559-...
本文首发于公众号:程序员刘大华,专注分享前后端开发的实战笔记。关注我,少走弯路,一起进步!
📌往期精彩
《MySQL 为什么不推荐用雪花ID 和 UUID 做主键?》