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

当表单输入框为空时,想让边框变红、背景变浅黄,或显示提示文字,可以利用 :placeholder-shown 伪类精准识别“未填写”状态——它只在输入框内容为空且 placeholder 可见时生效,比单纯用 :empty 或 js 监听更轻量、更语义化。
前提:placeholder 必须存在
:placeholder-shown 的触发依赖于 input 或 textarea 元素设置了 placeholder 属性。即使 placeholder 内容为空字符串(placeholder=""),也能激活该伪类(部分浏览器支持,但建议写一个空格或有意义的占位符更稳妥)。
- ✅ 正确:
<input placeholder="请输入姓名"> - ✅ 可用(兼容性稍弱):
- ❌ 无效:
<input>(无 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 完全不支持,需降级处理: