可使用 :placeholder-shown 伪类实现输入框为空时的样式变化,需配合 placeholder 属性,支持 Chrome 47+ 等现代浏览器,IE 不支持。

当表单输入框为空时,想让边框变红、背景变浅黄,或显示提示文字,可以利用 :placeholder-shown 伪类精准识别“未填写”状态——它只在输入框内容为空且 placeholder 可见时生效,比单纯用 :empty 或 JS 监听更轻量、更语义化。
前提:placeholder 必须存在
:placeholder-shown 的触发依赖于 input 或 textarea 元素设置了 placeholder 属性。即使 placeholder 内容为空字符串(placeholder=""),也能激活该伪类(部分浏览器支持,但建议写一个空格或有意义的占位符更稳妥)。
- ✅ 正确:
- ✅ 可用(兼容性稍弱):
- ❌ 无效:
(无 placeholder 属性)
基础样式控制示例
直接对空状态应用样式,无需 JavaScript:
input:placeholder-shown {
border-color: #ff6b6b;
background-color: #fff8f0;
outline: none;
}
input:not(:placeholder-shown) {
border-color: #4CAF50;
background-color: #ffffff;
}
这里用 :not(:placeholder-shown) 匹配“已输入内容”的状态,实现视觉反馈切换。
立即学习“前端免费学习笔记(深入)”;
配合 required 属性增强语义
若字段为必填项,建议同时加 required 属性。这样 :placeholder-shown 与 :invalid:not(:placeholder-shown) 可组合使用,区分「空」和「填了但不合法」两种错误:
-
input:placeholder-shown→ 空(初始态) -
input:invalid:not(:placeholder-shown)→ 已填但格式错(如邮箱少 @) -
input:valid→ 填写正确
例如邮箱输入框可这样分层提示:
input[type="email"]:placeholder-shown {
border-color: #ccc;
}
input[type="email"]:invalid:not(:placeholder-shown) {
border-color: #ff9800;
}
input[type="email"]:valid {
border-color: #4CAF50;
}
注意兼容性与 fallback
:placeholder-shown 在 Chrome 47+、Firefox 51+、Safari 9.1+、Edge 79+ 中支持良好。IE 完全不支持,需降级处理:
- 可结合
input[value=""](仅适用于初始化为空的静态 value)做简单 fallback - 更可靠的方式是用 JS 添加 class(如
is-empty),再用 CSS 控制,但会增加复杂度 - 现代项目中,若不需支持 IE,可放心使用,简洁高效










