For AI agents: the complete documentation index is available at https://a3s-lab.github.io/UI/v0.4.1/llms.txt, the full documentation bundle is available at https://a3s-lab.github.io/UI/v0.4.1/llms-full.txt, and this page is available as Markdown at https://a3s-lab.github.io/UI/v0.4.1/components/radio-group.md.

单选组

单选组用于呈现一小组互斥选项。适合所有选项都能在当前界面直接理解,并且用户需要选择一个值才能继续或完成当前设置的场景。

实时预览
视图密度

用法

导入 Tailwind 和完整的 A3S 样式包:

@import "tailwindcss";
@import "@a3s-lab/ui/a3s.css";

为相关的原生单选按钮设置相同的 name,为每个按钮关联可见标签,再通过 fieldset 与 legend,或 role="radiogroup" 与 aria-labelledby,为整组选择提供一个无障碍名称。

<fieldset class="fieldset">
  <legend data-variant="label">视图密度</legend>
  <div class="grid gap-3">
    <div class="field" data-orientation="horizontal">
      <input
        class="input"
        type="radio"
        id="density-default"
        name="density"
        value="default"
      />
      <label for="density-default">默认</label>
    </div>
    <div class="field" data-orientation="horizontal">
      <input
        class="input"
        type="radio"
        id="density-compact"
        name="density"
        value="compact"
        checked
      />
      <label for="density-compact">紧凑</label>
    </div>
  </div>
</fieldset>

如需按组件加载,请依次导入基础样式、Radio 结构、Field 结构与 A3S 视觉样式。CDN 等其他接入方式参见安装。

@import "@a3s-lab/ui/base.css";
@import "@a3s-lab/ui/components/radio.css";
@import "@a3s-lab/ui/components/field.css";
@import "@a3s-lab/ui/styles/a3s.css";

参数

参数值用途
分组<fieldset> 或 role="radiogroup"为相关选项建立一个有名称的语义边界
根类名radio-group应用稳定的分组布局和框架适配器契约
选项根元素<input type="radio">保留原生表单、校验、键盘与无障碍行为
classinput应用 Radio 结构和视觉样式
name相同字符串让选项互斥并只提交一个值
value稳定字符串提供提交给应用的值,不要根据显示文案临时生成
checked布尔属性标记真实的初始选择;必须由用户选择时应省略
disabled布尔属性阻止选择,并需要解释该项不可用的原因
required布尔属性要求同名原生单选组在提交前至少选择一项
aria-invalidtrue在完成校验后公开失败状态
aria-describedby元素 ID关联约束、选择后果或恢复说明

状态与变体

未选中与已选中是正常交互状态。焦点进入原生单选组后,方向键在组选项间移动并同步选择;Tab 只把整组作为一个进出位置。只有当相邻内容解释约束或恢复方式时,禁用态和错误态才有意义。

带说明

标签说明选项是什么,辅助文案解释选择后的影响。说明文字放在标签之外,并通过 aria-describedby 关联,避免辅助技术把长段说明反复读作选项名称。

密度与影响
视图密度

适合日常工作的均衡间距。

扩大点击目标并增加行间分隔。

以更紧密的视觉间距显示更多行。

卡片式选项

只有当每个选项都需要标题与后果说明时才使用卡片。data-variant="choice-card" 会把可见选项标签扩展到完整字段,让整张卡片仍然只是一个原生单选目标,同时避免无效的嵌套标记或第二层分组角色。关联的 <label> 提供无障碍名称,aria-describedby 只补充选择后果,避免辅助技术把说明重复读作名称。

工作区方案
工作区方案

适合个人和小型团队。

增加团队控制与共享审计记录。

增加组织策略与托管访问控制。

字段组

表单问题优先使用 fieldset 与 legend。图例已经提供分组名称,不要再嵌套一个名称相同的 radiogroup。

订阅方案
订阅方案

按年付费可节省两个月的费用。

禁用选项

只禁用当前不可用的选项,保留其他选择,并把不可用原因放在禁用控件旁边。

可用性
执行环境

当前未连接兼容设备。

无效

不要把已经合法预选的值标记为错误。初始状态不显示错误,只在用户尝试继续后校验;如果仍未选择,应把焦点移到第一个选项,并在用户完成选择或重置表单后清除过期的错误语义。

必选项
通知方式

RTL

在单选组或祖先元素上设置 dir="rtl"。原生键盘方向会跟随文档方向,选项的实际含义顺序仍由 DOM 决定。

كثافة العرض
كثافة العرض

تباعد قياسي لمعظم حالات الاستخدام.

مساحة أكبر بين العناصر.

تباعد أدنى للتخطيطات الكثيفة.

无障碍

  • 为整组选择提供一个简洁的无障碍名称。表单内优先使用 fieldset 与 legend;其他场景使用 role="radiogroup" 搭配 aria-labelledby 或 aria-label。
  • 每个单选按钮都需要可见 label 和稳定的提交 value。说明文字通过 aria-describedby 关联,不要把长段说明塞进无障碍名称。
  • 互斥选项必须使用同一个 name。不要通过彼此独立的按钮或只存在于应用状态中的逻辑模拟互斥。
  • 保留原生方向键行为。Tab 进入当前选项,方向键移动并选择,Tab 离开整组;不要让每个选项都成为独立 Tab 停靠点。
  • 不要给每个选项行添加 role="group"。radiogroup 或 fieldset 是唯一的分组边界。
  • 只给不可用选项设置 disabled 并保持原因可见。如果全部选项都不可用,应禁用所属表单操作并说明阻塞条件。
  • 完成校验后再显示错误。使用 required、aria-invalid="true" 与 aria-describedby 关联可恢复的错误说明,并在用户选择合法值或重置表单后清除过期的错误属性与文案。
  • 在粗指针设备上让完整点击目标至少达到 44px,视觉圆点仍保持紧凑。