:placeholder-shown伪类检测浏览器是否渲染占位符文本,而非输入框内容是否为空。它作为状态开关,配合label元素实现悬浮效果::placeholder-shown时标签沉底,:not(:placeholder-shown)时标签上浮。需注意选择器顺序、placeholder属性存在性及浏览器兼容性,单靠该伪类无法处理聚焦状态。
:placeholder-shown 伪类并非用于“直接实现悬浮占位符”,它本质上只是一个状态开关。真正驱动标签上浮动作的是 label 元素,而 :placeholder-shown 的作用是向浏览器传递信号:“当前 placeholder 文本正在显示,说明输入框内容为空。”与 :focus 或利用 JavaScript 判断 value === "" 的方式相比,这种方法更加可靠且轻量。下面逐步解析其实现原理。
:placeholder-shown该伪类的匹配逻辑并非“检测输入框内容是否为空”,而是“检测浏览器是否正在渲染 placeholder 文本”。如果输入框未设置 placeholder 属性(即使设置为空字符串 placeholder=""),浏览器不会启用占位逻辑,因此 :placeholder-shown 始终为 false。以下几个细节容易被忽视:
长期稳定更新的攒劲资源: >>>点此立即查看<<<
placeholder=" "(空格)与 placeholder="" 均合法,但后者更为简洁,可避免空格被误读为实际提示文本。placeholder 属性必须直接写在 HTML 中。通过 JavaScript 动态设置(例如 input.setAttribute('placeholder', ''))在某些旧版 Safari 中可能无法触发伪类。placeholder 属性后,即使 input 值为空,:placeholder-shown 也不会匹配——这并非 Bug,而是规范所规定的行为。:placeholder-shown 与 :not(:placeholder-shown) 的分工浮动标签的两种关键状态正是通过这两个伪类来区分:
input:placeholder-shown + label → label 保持原始位置(下沉状态)。input:not(:placeholder-shown) + label → label 上浮并缩放(当用户已输入内容,或失去焦点但非空时)。:not(:placeholder-shown) 的规则必须写在 :placeholder-shown 之后,否则会被覆盖。:placeholder-shown 会立即失效。这是它比 JavaScript 的 trim() 方法更底层的优势,但也是一个陷阱:粘贴不可见字符会导致“看似为空,实则不浮动”的情况。:placeholder-shown 实现完整浮动逻辑该伪类仅能回答“placeholder 是否正在显示”,而无法提供“是否获得焦点”或“是否通过校验”的信息。以下常见组合缺一不可:
input:focus-within + label → 解决“输入框为空但已聚焦,此时 label 应上浮”的场景。input:valid + label → 用于 required 字段,当校验通过后保持 label 上浮状态。:placeholder-shown 无法区分“空且聚焦”和“空且未聚焦”两种状态,视觉上会缺失一次关键动画。::-webkit-input-placeholder 作为回退样式。一个极易被忽视的点:浮动效果依赖于 label 的定位上下文。如果未给 label 设置 position: relative,那么 transform: translateY() 会以视口为基准进行偏移,导致标签“飘出屏幕”。这并非动画编写错误,而是定位链中断所致。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述