本页目录39
- 长话短说
- 何时使用无线电(决策树)
- 正确无线电组的剖析
- 复制粘贴语义基线(还没有花哨的 CSS)
- 最小 CSS 可用性(原生外观、大目标、清晰焦点)
- 温和、易于访问的验证(首先使用浏览器)
- Custom-Styled “Card” Radios (without breaking accessibility)
- Copy-paste HTML
- 最小、健壮的 CSS
- 行为注释(为什么这种模式有效)
- 可选:温和验证(原生优先)
- 不烦人的验证策略
- 原则
- 基线(仅限本机)
- 友好的内联错误(渐进增强)
- 如果您使用“下一步”按钮进行选通,则仅验证该步骤。
- 如果您希望保留浏览器的有效性模型,请在
- 如果您的表单很长,请添加
- 客户端验证改善了用户体验,但是
- Formspree 集成(渐进增强)
- 原生 HTML(始终有效)
- JS 增强(良好的用户体验,更好的跟踪)
- 垃圾邮件控制而不影响转化
- 反映广播选择的主题行(干净的收件箱)
- 要避免的常见陷阱
- 国际化和包容性
- 语言、标签和语气
- 长标签和多行选项
- 从右到左 (RTL) 支持
- ARIA 之外的可访问性
- 测试清单(适合打印)
- 性能和可维护性
- 分析与实验
- 反模式(不要这样做)
- 最终清单
- 资源
- 规格和创作模式
- 参考指南
- 测试和工具
单选按钮看起来很简单。一键点击,一种选择。然而,它们也是损害用户体验和可访问性的最简单方法之一。隐藏原生输入,跳过字段集和传说,或者过于积极地进行验证,您将发布一个使键盘用户感到困惑、使屏幕阅读器感到沮丧并导致转换流失的表单。
本指南向您展示如何在 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 键进入组 → 箭头移动 → 空格选择 → 对焦环保持明显。
看看我们的概念营销评论
常见问题解答(简短实用)
目标2–6。如果有 7-10 个,请分组或使用两列网格。超过 ~10,切换到选择(通过搜索)或者首先重新设计以缩小选择范围。
仅当有时明确多数默认而且它不会使数据产生偏差。预选可以加快完成速度,但可以减少刻意的选择。如果不确定,不要预先选择。
收音机:单选,选项应为可见并排。
选择:空间紧张或选项较多时的单一选择。
复选框:0–许多选择(不相互排斥)。
是的。保留本机输入可聚焦(不要使用display:none)。输入inside the 里面<标签>,将其设置为不透明度:0;位置:绝对;插图:0;,并设置标签样式。使用:有(输入:焦点可见)和:有(输入:检查)驱动焦点/选定状态。
首先使用 HTML:放置必填在第一台收音机上并致电form.reportValidity()(或者让浏览器处理提交)。为了获得更好的 UI,请显��一个简短的内联错误靠近团体after之后第一次尝试,以及明确改变。
这样的 ARIA 角色吗?角色=“无线电组”? 不适用于本机收音机。一个适当的字段集+传说已经为屏幕阅读器提供了正确的上下文。仅当您构建时才添加 ARIA完全定制小部件(如果可能的话避免)。
显示/隐藏后续after之后一个选择。隐藏时,还禁用这些控件因此不符合 Tab 键顺序且未提交。当显示出来时,明智地移动焦点并确保标签保持清晰。
键盘流程、可见焦点、屏幕阅读器公告(图例读取、选定状态有声)、移动点击区域、验证计时(无早期唠叨)以及所选值坚持关于服务器端错误。
