前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库CSS :placeholder-shown 伪类用途
HTML表单与输入

placeholder-shown 能判断输入框真的有值吗?

:placeholder-shown 匹配正在显示占位提示的控件,常用于浮动标签或空输入样式。它依赖 placeholder 和显示状态;不能当作 :valid 或“用户是否填写过”的通用替代。

前端进阶之旅 · 一题精讲更新于 2026.09.29
HTML#表单与输入#表单
先看核心答案读代码示例
理解线索

占位显示与表单有效性分开

  1. placeholder为可编辑字段提供短提示
  2. :placeholder-shown匹配当前显示占位提示的状态
  3. :not(...)反选当前不显示占位提示的控件

未设置 placeholder 的空输入框,不会因为“空”就自动匹配该伪类。

核心回答

先记住这个答案

:placeholder-shown 关注的是占位提示是否正在显示,而不是表单值是否合法。空文本框写了 placeholder 时通常命中;输入内容后不命中,:not(:placeholder-shown) 可用于浮动标签样式。但没有占位提示的空框、只输入了空格的框、或不支持占位的控件,都不能简单用这条伪类判断“用户已填写”。

  • 需要占位提示才可能命中
  • 输入值出现后通常不再命中
  • 空格也是输入内容
  • 校验状态应看 :valid 或 :invalid

浮动标签为什么常用它

设计希望输入为空时标签出现在框内,输入后标签移到上方。占位状态可触发这个视觉切换,但真实标签仍要用 <label>,不能只放一个会消失的 placeholder。

输入后移动可见标签HTML
<label class="field">
  <input id="city" name="city" placeholder=" " required>
  <span>城市</span>
</label>
<style>
.field input:not(:placeholder-shown) + span { transform: translateY(-1.2rem); }
</style>

这里的空格占位只是让伪类有可显示的提示状态;真正给字段命名的是可见文本与标签元素。用户输入后,伪类不再命中,标签位置改变。 页面初始已有值时也会进入“不显示占位”的状态,正好避免标签盖住预填内容。但“有值”不等于“合法”,例如 URL 格式错误仍可能不显示占位。

别用占位状态替代校验

:placeholder-shown 与 :invalid 的判断基准不同。一个必填框空着可能既显示占位又无效;用户输一个空格后占位消失,但业务上可能仍要拒绝全空白内容。

要表示必填、格式和范围错误,应使用原生约束、:valid、:invalid 或脚本读取 validity。占位文案最好是示例或短提示,不要把完整填写要求藏在里面,因为开始输入后它就消失。

浮动标签常用 input:not(:placeholder-shown) 判断“当前有值”,但它依赖输入框确实设置了 placeholder。没有占位文本时,不要假设选择器仍能代表空值状态。浏览器自动填入的值也要实测:页面初始化、自动填充、用户删除输入,都可能让标签位置改变。让标签始终可见比把唯一字段名藏进 placeholder 更稳,因为占位文字会在输入后消失,不能代替 <label>。

回答前,多想一步

容易答错的地方

认为没有 placeholder 的空框也会命中
伪类要求占位提示处于显示状态;没有占位提示就不能靠它识别空值。
把 :not(:placeholder-shown) 当作有效值
它只说占位没显示,无法证明输入满足格式或业务规则。
试着用自己的话回答

面试官还会怎么问?

只输入一个空格时会怎样?

输入框已有内容,占位通常不显示;需要拒绝空白字符串时应单独校验。

浮动标签可以完全用 placeholder 吗?

不建议。<label> 提供稳定名称,placeholder 输入后消失,不能替代字段标签。

type="number" 的占位状态能统一依赖吗?

不同控件的占位支持和呈现可能不同,设计前要在目标浏览器实际测试,别把该伪类当成所有输入类型的通用状态。

从一道题,走向一组知识

把知识连起来

表单与输入

单选框靠 name 怎样分组,多个 checked 谁生效?

单选框没有这类占位文本,分组应靠 name。

表单与输入

range 不写 value 时默认是多少,和 number 有何区别?

滑块总有数值,也不适合用占位状态表达“未选择”。

参考资料

  • HTML:表单与输入参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 浮动标签为什么常用它
  3. 别用占位状态替代校验
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑