label 的 for 属性必须严格匹配目标元素的 id,区分大小写且不可用 name 替代;嵌套控件于 label 内更可靠;ARIA 仅作补充,不替代原生语义。
for 属性必须严格匹配目标元素的 id
这是最常见也最容易出错的地方:浏览器不会自动把 label 和同级的 input 关联,除非显式声明。哪怕只差一个空格、大小写不一致或用了 name 而非 id,点击 label 就不会聚焦输入框。
for 的值必须和目标元素的 id 完全一致(区分大小写)id —— 仅靠 name 或位置关系无效id 在插入 DOM 前已存在且唯一label 内部更可靠当无法保证 id 全局唯一或不想管理 for 映射时,直接嵌套是更鲁棒的做法。浏览器原生支持这种结构,无需额外属性,语义清晰,无障碍兼容性也好。
input、textarea、select、button 等可交互元素label 不再需要 for 属性,也不应再设label 默认为 inline 元素,若需块级行为可加 display: block
name 替代 id 关联很多开发者误以为 能生效 —— 实际上不会。HTML5 规范明确要求 for 必须引用 id,与 name 无关。表单提交靠 name,可访问性靠 id + for。
name 用于服务器端接收字段名,不影响 label 绑定name(如复选框组)很常见,但 id 必须唯一id,再确认 for 值是否拼写一致当因架构限制(如 Web Components Shadow DOM、第三方库封装)无法设置 id 或嵌套时,可用 aria-labelledby 或 aria-label 辅助,但它不触发原生聚焦行为,仅提升屏幕阅读器体验。
邮箱格式示例:user@example.com
aria-labelledby 引用的是其他元素的 id,和 for 类似,但不激活点击
聚焦for + id 或嵌套label + id,再考虑增强id 重复,或 SSR 与 CSR 的 id 不一致。这时候嵌套写法反而最省心。