加入我们私人 Slack 社区中的 1,000 多名 SEO报名下载手册
Marketing Lad

可转换的 HTML 单选按钮:权威指南

构建可访问、高转换率的 HTML 单选按钮组:语义、卡片式设计、键盘用户体验、温和验证、移动布局和 Formspree 集成。

阅读约 7 分钟已更新
本页目录39
  1. 长话短说
  2. 何时使用无线电(决策树)
  3. 正确无线电组的剖析
  4. 复制粘贴语义基线(还没有花哨的 CSS)
  5. 最小 CSS 可用性(原生外观、大目标、清晰焦点)
  6. 温和、易于访问的验证(首先使用浏览器)
  7. Custom-Styled “Card” Radios (without breaking accessibility)
  8. Copy-paste HTML
  9. 最小、健壮的 CSS
  10. 行为注释(为什么这种模式有效)
  11. 可选:温和验证(原生优先)
  12. 不烦人的验证策略
  13. 原则
  14. 基线(仅限本机)
  15. 友好的内联错误(渐进增强)
  16. 如果您使用“下一步”按钮进行选通,则仅验证该步骤。
  17. 如果您希望保留浏览器的有效性模型,请在
  18. 如果您的表单很长,请添加
  19. 客户端验证改善了用户体验,但是
  20. Formspree 集成(渐进增强)
  21. 原生 HTML(始终有效)
  22. JS 增强(良好的用户体验,更好的跟踪)
  23. 垃圾邮件控制而不影响转化
  24. 反映广播选择的主题行(干净的收件箱)
  25. 要避免的常见陷阱
  26. 国际化和包容性
  27. 语言、标签和语气
  28. 长标签和多行选项
  29. 从右到左 (RTL) 支持
  30. ARIA 之外的可访问性
  31. 测试清单(适合打印)
  32. 性能和可维护性
  33. 分析与实验
  34. 反模式(不要这样做)
  35. 最终清单
  36. 资源
  37. 规格和创作模式
  38. 参考指南
  39. 测试和工具

单选按钮看起来很简单。一键点击,一种选择。然而,它们也是损害用户体验和可访问性的最简单方法之一。隐藏原生输入,跳过字段集和传说,或者过于积极地进行验证,您将发布一个使键盘用户感到困惑、使屏幕阅读器感到沮丧并导致转换流失的表单。

本指南向您展示如何在 2025 年正确使用无线电:快速选择、易于扫描、完全可访问且可衡量。我们将从一个干净的语义基线开始,然后在现代 CSS 上分层,这样无线电就可以看起来像卡片或分段控件,而不会破坏键盘或屏幕阅读器的行为。

您将看到实用的验证模式,不会令人烦恼,响应式布局使目标在移动设备上保持大,以及可以粘贴到任何堆栈中的生产片段。我们还将介绍分析、A/B 想法和 Formspree 设置,以便您可以立即捕获结果。

这适用于谁:设计师、前端开发人员和关心两者的营销人员无障碍和转换。不需要繁重的框架,只需要可靠的 HTML、集中的 CSS 和一点渐进的增强。

到最后,你会知道:

  • 当单选按钮击败选择、复选框或切换时
  • 如何构建可访问的单选组(字段集、图例、标签、焦点)
  • 如何在不隐藏输入的情况下设置自定义“卡”收音机的样式
  • 如何使用 HTML Constraint API 进行验证(以及消息)
  • 如何将无线电连接到 Formspree 并测量选择

长话短说

  • 使用收音机正是一个一个明确定义的集合中的选择(理想情况下是2-6 个选项),应该是立即可见。
  • 始终将收音机包裹在中<字段集>+<图例>,给他们相同姓名,并将每个选项设为可点击<标签>。
  • 不要用隐藏输入显示:无;保留它们可聚焦(例如,不透明度:0;位置:绝对;插入:0)所以制表符/箭头/空格工作。
  • 制定大目标:至少44×44像素,带有对焦环这是清晰可见的。
  • 使用进行验证HTML 约束 API(required、reportValidity()),然后增强消息,而不是相反。
  • 如果您有很多选项或者不熟悉它们,请添加辅助文本在每个标签下并考虑搜索或分组反而。
  • 在移动设备上,堆叠在一栏;在宽屏幕上,2–3 列通过 CSS 网格。
  • 测量:跟踪印象、选择和提交,以及 A/B 测试期权订单和复制。
  • 对于 Formspree,保留本机 POST作为后备;添加获取仅作为渐进增强。

何时使用无线电(决策树)

Q1.用户是否只选��了一个选项?

  • 否 →使用复选框(0-多)或切换(二进制)或重新考虑任务。
  • 是 →转到 Q2。

Q2。选项是否需要一目了然?

  • 是 →使用收音机(最适合扫描和快速选择)。
  • 否(空间紧张/选项很多)→ 考虑一个选择(下拉菜单)。如果选��很重要并且可以从比较中受益,那么更喜欢收音机并重新设计布局。

Q3。有多少个选择?

  • 2–6→ 收音机是理想的选择。
  • 7–10→ 无线电仍可与分组或配合使用两栏网格;否则使用选择或可搜索列表。
  • >10→ 使用通过搜索选择或步骤首先缩小集合范围。

Q4。选项是否是相互排斥的状态?

  • 是 →收音机。
  • 没有/组合有意义 →复选框。

Q5.这个选择会引发不同的后续问题吗?

  • 是 →收音机还是可以的。显示后续内容有条件,但保留隐藏字段不符合制表符顺序和 SR 流程直至揭晓。
  • 否 →简单的无线电组。

Q6.熟悉还是描述性?

  • 熟悉的标签(例如,“小/中/大”)→ 短标签就足够了。
  • 不熟悉或高风险(例如,“技术 SEO 与内容 SEO”)→ 添加缩微版(一行描述)在每个标签下。

Q7.移动优先?

  • 是的(总是)→ 使用一列堆栈具有足够的间距和 16-18 像素的文本。推广最受挑选的选项朝顶部。

实际例子

  • 您的表格:“哪种服务?” → 收音机击败了选择,因为用户应该并排比较选项。保留 3 张带有简短潜台词的卡片(链接建设、SEO、Web 开发)。
  • 运送速度:3-4 个互斥的速度 → 收音机(潜台词中带有价格增量)。
  • 时事通讯频率:每日/每周/每月 → 收音机。
  • 兴趣(可多选)→ 不是收音机;使用复选框。

正确无线电组的剖析

复制粘贴语义基线(还没有花哨的 CSS)



您需要哪种服务?

选择一个最符合您目标的选项。




<标签>

链接建设


<标签>

搜索引擎优化


<标签>

网页设计/开发








为什么每个部分都很重要

  • <字段集>+<图例>为屏幕阅读器指定该组的名称,并为每个人设置上下文。
  • 一样姓名使输入互斥。
  • 可点击<标签>围绕每个输入给你一个巨大的点击/点击区域(44px+)。
  • 必填在第一台收音机上让浏览器本地验证该组。
  • 辅助文本(服务提示) 和错误文本(service-error) 是独立的,因此您可以显示/隐藏错误,而无需移动内容。
  • 不需要 ARIA 角色。本机无线电已经公开了正确的语义。

最小 CSS 可用性(原生外观、大目标、清晰焦点)

/* 布局和间距 */
.field 标签 {
显示:柔性;
对齐项目:居中;
间隙:.6rem;
填充:.65rem .8rem; /* 大点击目标 */
边界半径:.6rem;
光标:指针;
}

/* 键盘焦点:当输入焦点时突出显示整个标签 */
.field 标签:has(输入:焦点可见) {
轮廓:3px实心#3b82f6;
轮廓偏移:2px;
}

/* 选择状态(可选,本机点仍然显示)*/
.field label:has(input:checked) {
背景:#f1f5ff;
}

/* 错误文本 */
.error { 颜色:#b91c1c;顶部边距:.5rem;字体大小:.9rem; }

提示::有()为您提供“整张卡���的聚焦环”,而不隐藏真正的输入。如果较旧的浏览器不支持它,用户仍然可以使用收音机本身的本机聚焦环。

温和、易于访问的验证(首先使用浏览器)

让浏览器处理“您必须选择一个”部分,然后在需要时显示内联错误。

const form = document.getElementById('quote-form');
const group = document.getElementById('service-group');
const error = document.getEementById('service-error');

form.addEventListener('submit', (e) => {
// 触发原生验证 UI(有效,因为第一个单选有 `required`)
if (!form.reportValidity()) {
// 可选:也显示友好的内联错误
error.hidden = false;
group.setAttribute('aria-invalid', 'true');
e.preventDefault();
} else {
error.hidden = true;
group.removeAttribute('aria-invalid');
您应该期望(和测试)的行为:
键盘:

Tab 一次进入组;使用

  • 方向键移动;空间选择。屏幕阅读器:图例被解读为组标签;每个选项都以“已选择/未选择”状态宣布。
  • 触摸:点击标签可切换无线电(感谢标签包装)。
  • 定制风格的“卡”收音机(不破坏可访问性)复制粘贴 HTML

Custom-Styled “Card” Radios (without breaking accessibility)

Copy-paste HTML


<字段集>
选择一个计划

选择一个选项。您可以随时更改。




<标签类=“卡片”>

入门
适合小型网站


<标签类=“卡片”>

成长
最受欢迎


<标签类=“卡片”>

专业版
高级功能






最小、健壮的 CSS

:根{
--品牌:#0b5cff; --环:rgba(11,92,255,.35);
--边框:#e5e7eb; --bg:#fff; --静音:#6b7280;
--半径:14px;
}

/* 网格 */
.card-group{
显示:网格;间隙:16px;
网格模板列:重复(3,minmax(0,1fr));
}
@media(最大宽度:900px){ .card-group{ 网格模板列:1fr 1fr; } }
@media(最大宽度:640px){ .card-group{ grid-template-columns:1fr; } }

/* 卡片标签 */
.card{
职位:亲属;
显示:网格;地点项目:中心;文本对齐:居中;
间隙:6px;内边距:18px;
边框:1px 实心 var(--border);边界半径:var(--radius);
背景:var(--bg);
光标:指针;用户选择:无;
过渡:框阴影 0.15 秒,边框颜色 0.15 秒,变换 0.02 秒;
}
.card:hover{ box-shadow:0 8px 20px rgba(0,0,0,.06); }

/* 保持原生输入可聚焦:无显示:无 */
.卡片输入{
位置:绝对;插图:0;不透明度:0;
}

/* 整个卡上的键盘聚焦环 */
.card:has(输入:焦点可见){
盒子阴影:0 0 0 3px var(--ring);
边框颜色:var(--品牌);
}

/* 选择状态 */
.card:has(输入:已检查){
边框颜色:var(--品牌);
盒子阴影:0 0 0 3px var(--ring);
}

/* 内容 */
.card-title{ 字体粗细:700;颜色:#111; }
.card-sub{ 字体大小:14px;颜色:var(--静音); }

/* 错误文本 */
.error{ 颜色:#b91c1c;顶部边距:.5rem;字体大小:.9rem; }

行为注释(为什么这种模式有效)

  • 没有显示:无在输入→键盘上用户可以Tab进入;方向键移动选择;空间选择。
  • 整个卡片是可点击的,因为输入位于内标签。
  • :有()让我们设计焦��和检查没有 ARIA 黑客攻击的父卡上的状态。
  • 响应式网格给出1–3 列自动地;触摸目标保持较大。

可选:温和验证(原生优先)

const form = document.getElementById('plan');
const err = document.getElementById('计划错误');

form.addEventListener('submit', (e) => {
if (!form.reportValidity()) { // 在第一个单选上使用 `required`
err.hidden = false;
e.preventDefault();
} else {
err.hidden = true;
}
});

不烦人的验证策略

伟大的验证在需要之前是看不见的。这是一种针对无线电的方法,对用户来说快速、易于使用且舒缓。

原则

  • 本土第一。让 HTML 处理“必须选择一个”。
  • 推迟错误。在用户尝试继续之前不要对他们大喊大叫。
  • 指出问题所在。宣布错误、巧妙地转移焦点并保持文案简短。
  • 明确改变。一旦做出有效的选择,就消除错误。

基线(仅限本机)

仅 HTML 就可以通过强制执行规则必填在群组中的一台收音机上。


您需要哪种服务?

选择一个选项。



<标签>
<输入类型=“无线电”名称=“服务”值=“链接”必需>
链接建设

<标签>

搜索引擎优化

<标签>

网页设计/开发


这已经为您提供了:键盘箭头、选择空间和浏览器级验证。

友好的内联错误(渐进增强)

关闭浏览器的弹出窗口并处理内联消息传递,使其符合您的设计。

HTML(添加错误区域)







CSS(简单样式)

.error { 颜色:#b91c1c;顶部边距:.5rem;字体大小:.9rem; }

JS(推迟错误,正确宣布)

const form = document.getElementById('quote');
const group = document.getElementById('svc');
const err = document.getElementById('svc-err');
const radios = form.querySelectorAll('input[name="service"]');

让尝试=假; // 仅在用户尝试继续后才显示错误

函数 hasSelection() {
return [...radios].some(r => r.checked);
}

function showError(msg='请选择一个选项。') {
err.textContent = 消息;
err.hidden = false;
group.setAttribute('aria-invalid', 'true');
// 将错误附加到所描述的内容,以便 SR 接下来宣布它
group.setAttribute('aria-描述者', 'svc-hint svc-err');
}

函数clearError() {
错误.隐藏 = true;
group.removeAttribute('aria-invalid');
group.setAttribute('aria-描述者', 'svc-hint');
}

form.addEventListener('submit', (e) => {
attempts = true;
if (!hasSelection()) {
e.preventDefault();
showError();
// 将组带入视图并将焦点放在第一个单选按钮上
radios[0].focus();
group.scrollIntoView({ behavior: 'smooth', block: 'center' });
} 其他 {
}
}
// 不要太早唠叨;一旦他们选择了一些东西,就清楚了

radios.forEach(r => {
r.addEventListener('change', () => {
if (尝试)clearError();
});
});
为什么这有效

没有浏览器工具提示气泡;用户看到错误

  • 内联小组旁边。屏幕阅读器会听到
  • 传说,然后错误,感谢咏叹调描述者。仅出现错误
  • Errors only appear 之后提交尝试(或返回修复时)。温和的每步骤验证(多步骤形式)

如果您使用“下一步”按钮进行选通,则仅验证该步骤。

document.getElementById('nextBtn').addEventListener('click', () => {

if (!hasSelection()) {
showError();
} else {
clearError();
// 前进到下一步...
}
});
使用 Constraint API 自定义消息(可选)

如果您希望保留浏览器的有效性模型,请在

上设置自定义消息第一群组中的广播。const firstRadio = 无线电[0];

form.addEventListener('submit', (e) => {
if (!hasSelection()) {
firstRadio.setCustomValidity('请选择一个选项。');
// 触发原生 UI;或调用 form.reportValidity()
e.preventDefault();
form.reportValidity();
} else {
FirstRadio.setCustomValidity('');
}
});
当您需要本机“气泡”加上您自己的文本时,请使用此方法,否则请坚持使用上面的内联方法以获得一致的 UI。

错误摘要(对于长格式)

如果您的表单很长,请添加

顶部摘要链接到问题区域。


函数 showSummary() {
const sum = document.getElementById('错误摘要');
sum.hidden = false;
sum.querySelector('a').focus(); // SR 宣布警报
}
服务器端和网络回退

客户端验证改善了用户体验,但是

总是也在服务器上(或通过您的提交服务)进行验证。如果提交失败,返回���面: validate on the server (or by your submission service) too. If submission fails, return the page with:

  • 上一个选择依然存在,和
  • The 相同的内联错误小组旁边。

Formspree 集成(渐进增强)

即使 JavaScript 失败,也能让无线电正常工作,然后进行增强以实现更顺畅的致谢和更好的分析。

原生 HTML(始终有效)

<形式
id="报价"
行动=“https://formspree.io/f/your_form_id”
方法=“POST”
>
<字段集>
您需要哪种服务?

选择一个选项。



<标签类=“卡片”>

链接建设
获得高质量的反向链接。


<标签类=“卡片”>

搜索引擎优化
提升排名和流量。


<标签类=“卡片”>

网页设计/开发
快速、移动优先的网站。



<标签>
全名
<输入类型=“文本”名称=“名称”自动完成=“名称”必需>


<标签>
电子邮件
<输入类型=“电子邮件”名称=“电子邮件”自动完成=“电子邮件”必需>











谢谢!我们会��快与您联系。



这给你带来了什么:

  • 与 JS 关闭一起工作(有利于 SEO、可靠性)。
  • 浏览器处理“必须选择一个”(第一个广播上必需)。
  • Formspree 收到服务,姓名,电子邮件,和_主题。

JS 增强(良好的用户体验,更好的跟踪)

拦截提交、验证、发送获取,并显示内联感谢(或重定向)。

<脚本>
(function(){
const form = document.getElementById('quote');
const okMsg = document.getElementById('form-success');
const errMsg = document.getElementById('form-error');
const SubmitBtn = form.querySelector('button[type="submit"]');

// 可选:捕获 UTM + 页面上下文
函数appendMeta(fd){
const url = new URL(location.utm_medium','utm_campaign','utm_term','utm_content'].forEach(k=>{
const v = url.searchParams.get(k);
if(v) fd.append(k, v);
}); fd.append('page_url', location.href); if (document.referrer) fd.append('referrer', document.referrer);
form.addEventListener('submit', async (e) => {
// 使用原生有效性(包括无线电要求)
const fd = new FormData(form); // 如果已填充,则不发送蜜罐
if (fd.get('company')) return; // 静默删除 bots

commitBtn.disabled = true; submitBtn.textContent = '正在提交...'; errMsg.hidden = true;
const res = wait.action, {
method: 'POST',

headers: { 'Accept': 'application/json' }
});

if(res.ok){
okMsg.hidden = false;
if (fd.get('company')) return; // silently drop bots
appendMeta(fd);

submitBtn.disabled = true;
const original = submitBtn.textContent;
submitBtn.textContent = 'Submitting…';
okMsg.hidden = true; errMsg.hidden = true;

try{
const res = await fetch(form.action, {
method: 'POST',
body: fd,
headers: { 'Accept': 'application/json' }
});

if(res.ok){
form.reset();
okMsg.hidden = false;

// Optional: fire analytics
if (window.gtag) gtag('event','generate_lead',{method:'formspree', service: fd.get('service')});

// 可选:成功后重定向
// setTimeout(()=> location.href = '/thank-you/', 1200);
} 其他 {
errMsg.hidden = false;
}
} 抓住 {
errMsg.hidden = false;
}最后{
提交Btn.disabled = false;
SubmitBtn.textContent = 原始内容;
}
});
})();

笔记

  • 设置接受:application/json所以 Formspree 返回 JSON,您可以清楚地决定成功/失败。
  • 使用form.reportValidity()因此,浏览器会在您发送之前强制执行单选选择和电子邮件格式。
  • 保留原生行动/方法所以表单在没有 JS 的情况下仍然可以工作。

垃圾邮件控制而不影响转化

  • 蜜罐(如上所述)以零摩擦捕获许多机器人。
  • 时间:添加隐藏开始于当页面加载时;忽略提交的速度比 2 秒快。
  • 内容信号:如果您看到重复的垃圾值,请在 Formspree 规则或后处理中过滤它们。
<输入类型=“隐藏”名称=“started_at”id=“started_at”>
<脚本>
document.getElementById('started_at').value = Date.now();

// 在发送之前在提交处理程序中:
const 开始 = Number(fd.get('started_at'));
if (Date.now() - 开始 < 2000) 返回; // 看起来像机器人

反映广播选择的主题行(干净的收件箱)

您可以量身定制_主题从所选电台:

const service = fd.get('service'); // 例如,“seo”
fd.set('_subject', `来自联系表单的新 ${service} 潜在客户`);

要避免的常见陷阱

  • 使用隐藏收音机显示:无。使用不透明度:0;位置:绝对;插图:0位于标签内,因此键盘仍然可以使用。
  • 忘记字段集/传说。屏幕阅读器依赖它们来获取上下文。
  • 早期过度验证。提交/下一步后显示错误,然后在用户修复组后立即清除。
  • 不捕捉上下文。添加页面网址,引荐来源,和UTM领域,你稍后会感谢自己。

国际化和包容性

语言、标签和语气

  • 使用页面的郎(并切换每个区域设置页面): ...
  • 保持标签简短并描述性,避免特定文化的术语。
  • 更喜欢中立措辞(“选择一个计划”)而不是假设(“你的预算是多少?”)。
  • 本地化错误和辅助文本一个简单的字典,键为document.documentElement.lang。
常量 i18n = {
en: { select: '请选择一个选项。' },
es: { select: 'Elige una option, por pleasure.' },
ar: { 选择: ' ' ' ' }
};
const t = (k) => (i18n[document.documentElement.lang] || i18n.en)[k];
errorEl.textContent = t('选择');

长标签和多行选项

  • 让标签包裹;切勿截断关键单词。
  • 即使文本换行,也要保持命中区域较大:在上使用填充标签,而不仅仅是输入。
.card { 内联大小:100%;内边距:16px; }
.card .card-title { 字体粗细:700;行高:1.25; }
.card .card-sub { 字体大小:14px;行高:1.4; }

从右到左 (RTL) 支持

使用 CSS逻辑属性和:dir()所以你不需要单独的样式。

/* RTL 自动翻转的间距 */
.card { 内联填充:16px;填充块:16px; }

/* 尊重方向的聚焦环 */
.card:has(输入:焦点可见) {
轮廓:3px 实心 var(--ring);
轮廓偏移:2px;
}

/* 可选:特定方向的调整 */
:dir(rtl) .card-group { 方向: rtl; }

ARIA 之外的可访问性

  • 确保对比度 ≥ 4.5:1对于标签和焦点状态。
  • 触摸目标 ≥44×44 像素(填充而不是字体大小)。
  • 不要仅通过颜色来传达状态;使用边框、图标或文本。

测试清单(适合打印)

  • 语义:收音机在里面字段集带有可见的传说。
  • 键盘:Tab进入群组;箭头移动;空间选择。
  • 屏幕阅读器:传说公布;每个选项都表示已选择/未选择。
  • 焦点:上可见环整张卡(以及本机输入)。
  • 命中区域:整个标签可点击;适用于移动设备。
  • 验证:提交/下一步之前没有错误;错误在更改时清除。
  • 复制:选项很短;帮助文本澄清了差异。
  • 布局:手机上有 1 列;桌面版 2–3;没有溢出剪裁。
  • 国际化:错误/标签已本地化;长文本优雅地换行;右转正常。
  • 分析:展示、选择、提交的事件。
  • 性能:没有繁重的 UI 库;最小的 CSS;没有布局变化。

性能和可维护性

  • 赞成本机输入+ 轻量 CSS;避免用 div 替换 radio。
  • 保持 CSS 模块化(颜色、半径、环的自定义属性)。
  • 避免显示:无关于输入;使用不透明度:0;位置:绝对;插图:0因此可访问性保持不变。
  • 推迟非关键 JS;尽可能将增强功能保持在约 2–5 KB 以内。
  • 使用容器查询(如果可用)而不是嵌入表单的复杂媒体断点。
@container(最小宽度:680px){
.card-group { 网格模板列:1fr 1fr 1fr; }
}

分析与实验

跟踪意图和摩擦点:

// 当单选组可见时触发
gtag?.('event','form_step_view', { 步骤: 1, form: '联系人' });

// 选择时触发
document.querySelectorAll('input[name="service"]').forEach(r => {
r.addEventListener('change', () => {
gtag?.('event','radio_select', { group: 'service', value: r.value });
});
});

// 成功提交时触发
gtag?.('event','generate_lead', { form: 'contact', service: form.service.value });

A/B 测试:

  • 期权订单(最常选择的第一个)
  • CTA 副本(“��取我的免费提案”与“获取我的报价”)
  • 辅助文本存在

反模式(不要这样做)

  • 使用隐藏输入显示:无(破坏键盘和 SR)。
  • 失踪字段集/图例。
  • 微小的点击区域(只有小点可点击)。
  • 仅颜色选择状态;看不见的焦点。
  • 验证之前用户尝试继续。
  • 将 10-20 个选项装入无线电中;请改用可搜索的选择。

最终清单

  • 字段集+传说现在
  • 一样姓名,独特值s
  • 标签包裹输入;整张卡片可点击
  • 对焦环清晰可见
  • 必填在第一台收音机上;温和的内联错误
  • 1–3 列网格响应式大触摸目标
  • 本地化字符串;通过逻辑属性实现 RTL 安全
  • 查看/选择/提交分析
  • 服务器端验证镜像客户端规则

资源

规格和创作模式

  • HTML 标准 –<输入类型=“无线电”>:本机语义,按分组姓名,形成行为。
  • WAI-ARIA 创作实践 1.2 – 无线电组:预期的键盘行为(按 Tab 键进入组、箭头进行移动、空格进行选择)、标签模式。
  • WCAG 2.2收音机必需品:
    • 2.1.1键盘(一切都可以通过键盘操作)
    • 2.4.7焦点可见(焦点清晰可见)
    • 2.5.5目标尺寸(推荐≥44×44px���
    • 1.4.3对比度(最小)

参考指南

  • MDN:无线电输入,标签,字段集/传说、表单验证(约束验证 API)。
  • GOV.UK 设计系统 – 收音机:关于措辞和错误的优秀的、经过实战检验的指导。
  • 包容性组件 (Heydon Pickering):实用的 a11y 模式和评论。

查看我们最近的博客如何在 Ahrefs 上查找客座帖子机会(分步指南)

测试和工具

  • 斧头开发工具(浏览器扩展)- 自动 a11y 检查。
  • 无障碍洞察– 快速引导测试。
  • 灯塔– 性能+可访问性信号。
  • WebAIM 对比度检查器– 验证颜色对比度。
  • 屏幕阅读器抽查真实行为:
    • 英伟达(Windows),大白鲨(Windows),画外音(macOS/iOS),对讲(安卓)。
  • 手动键盘通:按 Tab 键进入组 → 箭头移动 → 空格选择 → 对焦环保持明显。

看看我们的概念营销评论

常见问题解答(简短实用)

1) 对于收音机来说,有多少个选项就太多了?

目标2–6。如果有 7-10 个,请分组或使用两列网格。超过 ~10,切换到选择(通过搜索)或者首先重新设计以缩小选择范围。

2) 我应该预先选择一个选项吗?

仅当有时明确多数默认而且它不会使数据产生偏差。预选可以加快完成速度,但可以减少刻意的选择。如果不确定,不要预先选择。

3)单选、选择、复选框,我该选择什么?

收音机:单选,选项应为可见并排。
选择:空间紧张或选项较多时的单一选择。
复选框:0–许多选择(不相互排斥)。

4) 我可以将收音机设计为“卡片”而不破坏可访问性吗?

是的。保留本机输入可聚焦(不要使用display:none)。输入inside the 里面<标签>,将其设置为不透明度:0;位置:绝对;插图:0;,并设置标签样式。使用:有(输入:焦点可见)和:有(输入:检查)驱动焦点/选定状态。

5) 验证无线电组的最佳方法是什么?

首先使用 HTML:放置必填在第一台收音机上并致电form.reportValidity()(或者让浏览器处理提交)。为了获得更好的 UI,请显��一个简短的内联错误靠近团体after之后第一次尝试,以及明确改变。

6) 我需要像这样的 ARIA 角色吗?角色=“无线电组”?

不适用于本机收音机。一个适当的字段集+传说已经为屏幕阅读器提供了正确的上下文。仅当您构建时才添加 ARIA完全定制小部件(如果可能的话避免)。

7) 如何处理条件后续字段(根据选择显示不同的输入)?

显示/隐藏后续after之后一个选择。隐藏时,还禁用这些控件因此不符合 Tab 键顺序且未提交。当显示出来时,明智地移动焦点并确保标签保持清晰。

8) 发货前我应该测试什么?

键盘流程、可见焦点、屏幕阅读器公告(图例读取、选定状态有声)、移动点击区域、验证计时(无早期唠叨)以及所选值坚持关于服务器端错误。

分享本文
Shahid Shahmiri

作者

Shahid Shahmiri

Founder & SEO Strategist

Shahid Shahmiri is a digital marketer who helps online businesses grow with smart marketing tactics that improve sales and leads. He is passionate and driven to grow businesses online and is responsible for analyzing marketing, SEO, growth and managing promotional and media channels.

想要这样的结果吗?

让我们根据您的利基和目标制定一个链接建设活动。