Radio 单选框
原生 <input type="radio"> 增强,支持单选组键盘导航(radiogroup 模式)、数据驱动与卡片形态。
基础用法
基础用法
同名 name 的 radio 互斥(组件跨 Shadow DOM 同步);无 name 时各自独立,互斥请用同名或 oas-radio-group。
尺寸
三档尺寸(size)
size 同时控制圆点尺寸与字号;组上设置时统一下发子项,子项显式 size 优先。
单选组(键盘可达)
单选组(radio-group)
组通过 value 受控,子项 value 作为选项标识;组会统一管理单选互斥。
组遵循 WAI-ARIA radiogroup 键盘模式:Tab 一次进入组(停在选中项,无选中时停首个非禁用/非只读项),↑ ↓ ← → 移动即选中(循环回绕、跳过禁用项),Home / End 跳首末可用项。原生 input 各藏于 Shadow DOM,浏览器同名方向键分组跨 Shadow 失效,组件在 host 层补齐了 roving tabindex 与方向键处理。
单个禁用
单个 disabled
单项 disabled 只禁该项:不可点击、不可聚焦(原生 disabled 语义),组内其余项不受影响;整组禁用走 oas-radio-group 的 disabled(见下)。
禁用
禁用
只读
只读(readonly)
readonly 与 disabled 的表单语义分立:可聚焦、可进 Tab 序、值照常提交,但点击(含 Space)与方向键均不切换。单项也可单独设置。
校验态
校验态(status,支持单项级)
组级 status 下发全部子项;单项显式 status 优先于组下发。status="error" 自动联动 aria-invalid="true";卡片形态下校验色落在描边。
辅助文本与标签位置
辅助文本(description)与标签位置(label-position)
description 属性渲染为标签下方次要文本(选项级副文本);也支持 <span slot="description"> 分发富文本(优先于属性)。label-position="start" 把文本移到圆点的起始侧(RTL 下自动镜像)。
自定义指示器
自定义指示器(checked-icon 插槽)
插槽内容接管选中态图标(template[slot] 或直接放元素皆可);未选态显示默认空心圆轮廓,宿主可用 ::part(box) 覆写(见下例:两态全自定义)。
两态全自定义(checked-icon 插槽 + ::part(box))
自定义指示器是「项级」开关:只有带了
checked-icon插槽的项才进入自定义模式(原生圆点隐藏、.box成为未选态载体)——所以上例两项都带插槽;组内要统一外观,需每项都带。
组横排
组横排(direction)
默认 direction="vertical" 纵向堆叠;horizontal 横向排布并自动换行。
数据驱动
options 数据通道
options JSON 属性与子元素声明式双通道并存:options 显式时数据驱动优先(渲染进组件内部,声明式子项让位)。字段:label / value / disabled / description。数据驱动的子项同样参与键盘导航。
卡片形态
卡片形态(variant=card)
variant="card" 切换为卡片皮肤:整块可点、选中描边着色、hover 反馈;默认插槽放标题等富内容,description 作副文本。卡片项可入组(组 value 照常驱动、键盘导航照常工作),也可单独使用。
事件
事件(oas-change / oas-focus / oas-blur)
单项派发 oas-change(detail: { checked, value })、oas-focus / oas-blur;组派发 oas-change(detail: { value },点击与方向键选中都会触发)与组级 oas-focus / oas-blur(子项间转移不误报)。
required 必填
required 必填(原生校验链)
required 驱动原生校验链(form-associated):未填时 checkValidity() 为 false(valueMissing),原生表单提交被阻止;填写后自动恢复 :valid。
required 同样支持组级:oas-radio-group required 走 form-associated 原生校验链,组内无选中项时 valueMissing 阻止原生表单提交(FormData 以组的 name 提交选中值,无选中不提交)。
组级 required(radio-group)
未选择就点击提交:浏览器弹出 valueMissing 校验气泡、表单不提交,页面提示「请先选择方案」;选中后再提交则显示提交值。
当前值可经公开 value property 读/写(对齐原生 radio.value):提交值语义——value 属性缺省回落 'on',与选中态分立(是否提交由 checked 决定);el.value = 'x' 写入受控 value 属性并同步 FormData 提交口径,不派发事件。
API
oas-radio
属性
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
checked | 是否选中 | boolean | — |
description | 辅助文本:渲染为标签下方次要说明;slot="description" 分发富文本时优先 | string | — |
disabled | 禁用 | boolean | — |
label-position | 标签位置:end(默认,框左文右)/ start(文左框右;RTL 下自动镜像) | — | — |
name | 原生分组名(跨 Shadow DOM 同名互斥;组内自动分配唯一 name) | string | — |
readonly | 只读:可聚焦可进 Tab 序、值照常提交,但点击(含 Space)与方向键均不切换 | boolean | — |
required | 必填标记(单元素语义:本项未选中即 valueMissing;组级任一选中语义为已知边界) | boolean | — |
size | 尺寸档:small(14px)/ medium(默认 16px)/ large(18px),圆点与字号联动;组级设置统向下发子项,单项显式优先 | string | medium |
status | 校验态:error / warning / success(圆点着色;error 联动宿主 aria-invalid) | string | — |
value | 选项标识 | string | null | — |
variant | 形态:default(默认)/ card(卡片:整块可点、选中描边着色、hover 反馈) | string | — |
Property(JS property;是否写回 attribute 见各行说明)
| Property | 说明 | 类型 | 默认值 |
|---|---|---|---|
value | 提交值(属性缺省回落 on;与 checked 分立,对齐原生 radio.value) | string | null | — |
事件
| 事件 | 说明 |
|---|---|
oas-blur | 单选框失去焦点 |
oas-change | 选中变化,detail: { checked, value } |
oas-focus | 单选框获得焦点 |
插槽
| 名称 | 说明 |
|---|---|
| 默认 | 标签内容(可放富文本/链接) |
checked-icon | 自定义选中指示器(template[slot] 或直接元素;未选态回落默认空心圆轮廓) |
description | 辅助文本分发通道(优先于 description 属性) |
oas-radio-group
属性
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
direction | 布局方向:vertical(默认纵向)/ horizontal(横向排布自动换行) | string | vertical |
disabled | 禁用整组(下发子项,不覆盖子项自身显式 disabled) | boolean | — |
options | 数据通道:JSON [{ label, value, disabled?, description? }],显式设置时数据驱动优先于子元素声明式 | RadioOption[] | string | — |
readonly | 只读(下发子项):可聚焦、方向键不切换 | boolean | — |
required | 组级必选校验(form-associated valueMissing,reset 恢复基线) | boolean | — |
size | 尺寸档(下发子项):small / medium(默认)/ large | string | — |
status | 校验态(下发子项):error / warning / success;单项显式 status 优先 | string | — |
value | 组值(选中项的 value) | string | — |
事件
| 事件 | 说明 |
|---|---|
oas-blur | 焦点离开组时派发 |
oas-change | 组值变化,detail: { value }(点击与方向键选中都触发) |
oas-focus | 组内任一子项获得焦点(子项间转移不误报) |
插槽
| 名称 | 说明 |
|---|---|
| 默认 | 声明式子项通道(<oas-radio> 子元素;options 显式时让位) |
label | 组标题(渲染进 legend) |