单选按钮互斥的关键在于共享相同的name属性值,id属性仅用于label绑定且必须唯一;应使用显式for绑定提升可访问性;初始选中用checked布尔属性,由服务端控制。
HTML 单选按钮组()本身不“单选”,关键在于是否共享同一个 name 属性值 —— 只有同名的 radio 才能互斥选择。
name 值才能互斥浏览器只根据 属性判断哪些 radio 属于同一组。不同
namename 值的 radio 完全独立,哪怕视觉上挨着放,也能同时选中。
name="gender"
name="gender",另一个写 name="sex" 或漏写 name
id 可以各不相同(也必须不同),它只用于关联 ,不影响单选逻辑 包裹或绑定提升可用性点击文字无法触发 radio 选择,是新手最常忽略的体验缺陷。解决方式有两种,推荐显式 for 绑定:
包裹 → 有效,但不利于样式分离和可访问性for + id → 推荐,语义清晰,支持屏幕阅读器,CSS 选择器也方便(如 label[for="opt1"])checked,不要用 value 或 JS 模拟checked 是布尔属性,只需存在即生效。服务器返回数据时,应由后端决定哪个 radio 加上该属性,前端不要靠 JS “补选”。
(多余值)document.querySelector('[value="pro"]').click()(可能触发事件副作用,且 DOM 尚未就绪时失败)checked,而非依赖客户端存储再 JS 设置小圆圈默认尺寸在手机上难点击,且缺乏语义化描述会影响读屏软件识别。
label 的 padding,而非缩放 input 自身) 内有明确文本,避免仅靠图标或空格alt 描述,或通过 aria-label 补充(但优先用真实文字)disabled 属性,不要仅靠 CSS 灰掉 + pointer-events: none,否则键盘用户仍可聚焦真正让单选“生效”的,从来不是标签写法多漂亮,而是 name 是否一致、checked 是否由服务端可控、label 是否真正可交互 —— 其余都是锦上添花。