Skip to content

Checkbox · Radio · Switch 选择器套装

一套清晰、友好的手绘风选择器,覆盖多选、单选与即时开关场景。三个组件都保留原生键盘语义,同时提供可跨越 Shadow DOM 的状态事件。

选择提示多项并存使用 Checkbox,互斥选项使用 Radio,立即生效的二元设置使用 Switch。

类型

Checkbox 多选框

indeterminate 表示“部分选择”。用户点击半选项后,组件会退出半选状态并进入普通选中或未选中状态。

基础多选框选项 A选项 B
半选多选框部分选择
卡片多选 标准功能 适合日常使用 扩展功能 包含更多能力
html
<super-checkbox>选项 A</super-checkbox>
<super-checkbox checked>选项 B</super-checkbox>
<super-checkbox indeterminate>部分选择</super-checkbox>

<super-checkbox variant="card" checked>
  <feature-icon slot="icon"></feature-icon>
  扩展功能
  <span slot="description">包含更多能力</span>
</super-checkbox>

variant="card" 提供完整卡片点击区域;icondescription Slot 用于补充图形和次级说明。基础多选仍使用默认的 default 变体。

Radio 单选框

同一根节点下拥有相同 namesuper-radio 会保持互斥;使用方向键可以在启用的同组项目间循环选择。

基础单选框选项 A选项 B
按钮单选选项 A选项 B
卡片单选 标准版 基础功能 高级版 更多功能
html
<fieldset>
  <legend>选择方案</legend>
  <super-radio name="plan" value="standard" checked>标准版</super-radio>
  <super-radio name="plan" value="pro">高级版</super-radio>
</fieldset>

<super-radio variant="button" name="view" value="list">列表</super-radio>
<super-radio variant="button" name="view" value="card" checked>卡片</super-radio>

button 变体提供胶囊式选项,card 变体提供更大的内容区域;二者都保留内部原生 Radio 的键盘与可访问语义。

Switch 开关

默认 Slot 提供固定说明;checked-label / unchecked-labelchecked-icon / unchecked-icon 可以随状态切换内容,不需要引入图标库。

基础开关
带文字开关关闭开启
图标开关 显示模式 跟随当前阅读偏好
html
<super-switch aria-label="深色模式">
  <moon-icon slot="unchecked-icon"></moon-icon>
  <sun-icon slot="checked-icon"></sun-icon>
  深色模式
  <span slot="description">夜间阅读更加舒适</span>
</super-switch>

<super-switch aria-label="消息提醒">
  <span slot="unchecked-label">关闭</span>
  <span slot="checked-label">开启</span>
</super-switch>

尺寸

大、中、小三档尺寸会同步调整指示器、轨道、间距与文字。组内建议保持同一尺寸。

多选项单选项
/

多选项单选项
/

多选项单选项
/
html
<super-checkbox size="large">大号</super-checkbox>
<super-radio size="medium" name="size">中号</super-radio>
<super-switch size="small" aria-label="小号开关"></super-switch>

状态

悬停与聚焦列使用固定演示样式;普通组件可以直接交互体验真实状态。

默认悬停选中禁用

Checkbox

未选择未选择已选择未选择

Radio

未选择未选择已选择未选择

Switch

关闭关闭开启关闭

Checkbox 半选

部分选择部分选择全部选择部分选择

校验与提示

validation 表达结果语义,helper-text 提供说明。错误状态会给内部控件添加 aria-invalid="true",错误提示使用 role="alert";其他提示使用礼貌播报。

多选成功已同意协议
多选警告接收活动通知
单选错误支付宝
开关帮助自动同步
html
<super-checkbox
  checked
  validation="success"
  helper-text="可以继续提交"
>已同意协议</super-checkbox>

<super-radio
  name="payment"
  validation="error"
  helper-text="请选择支付方式"
>支付宝</super-radio>

常用组合与布局

选择器不内置 Group 或卡片容器。使用原生 fieldset / legend 提供分组语义,再用业务布局决定纵向、横向、卡片或列表形态。

消息渠道邮件短信站内信
默认付款方式微信支付宝银行卡
设置开关组消息提醒深色模式自动保存
横向排列选项 A选项 B选项 C
♧ 消息提醒接收系统消息推送
☾ 深色模式夜间阅读更加舒适
☁ 自动备份自动上传并保存数据
html
<fieldset>
  <legend>默认付款方式</legend>
  <super-radio name="payment" value="wechat">微信</super-radio>
  <super-radio name="payment" value="alipay" checked>支付宝</super-radio>
</fieldset>

状态同步

三个组件分别派发独立的跨框架事件,事件都支持冒泡并穿过 Shadow DOM。不要只读取初始 attribute;用户操作后应读取事件 detail 或组件 property。

js
document.addEventListener("super-checkbox-change", (event) => {
  console.log(
    event.detail.name,
    event.detail.value,
    event.detail.checked,
    event.detail.indeterminate,
  );
});

document.addEventListener("super-radio-change", (event) => {
  console.log(event.detail.name, event.detail.value, event.detail.checked);
});

document.addEventListener("super-switch-change", (event) => {
  console.log(event.detail.name, event.detail.value, event.detail.checked);
});

无障碍

  • 为一组相关选项使用原生 fieldsetlegend,不要只依赖视觉边框表达分组。
  • Radio 组必须位于同一根节点与同一个最近的 form 中,并使用相同且非空的 name。组内仅当前选中项(没有选中项时为首个启用项)进入 Tab 顺序;聚焦后可使用上、下、左、右方向键循环选择启用项。
  • 有可见文字时,默认 Slot 会参与内部原生控件的可访问名称;纯图标或无文字 Switch 必须提供 aria-label
  • disabled 会让内部原生控件不可操作且不可聚焦。不要仅用降低透明度模拟禁用。
  • indeterminate 是独立视觉状态,并不等于 checked。业务中的“全选”逻辑仍需由消费者根据子项状态计算。

API

Checkbox Attributes / Properties

名称类型默认值说明
checkedbooleanfalse当前是否选中,并反射到 attribute
indeterminatebooleanfalse是否处于部分选择状态,并反射到 attribute
disabledbooleanfalse禁止操作并移出 Tab 顺序
requiredbooleanfalse转发给内部原生 Checkbox 的必选语义
variantdefault | carddefault基础或卡片布局
sizelarge | medium | smallmedium组件尺寸
validationnone | success | warning | error | infonone校验视觉与辅助语义
namestring空字符串转发给内部控件,并包含在事件详情中
valuestringon事件中返回的业务值
helper-textstring空字符串控件下方的帮助或错误信息
aria-labelstring空字符串转发给内部 Checkbox 的可访问名称

Radio Attributes / Properties

名称类型默认值说明
checkedbooleanfalse当前是否选中,并反射到 attribute
disabledbooleanfalse禁止操作并移出 Tab 顺序
requiredbooleanfalse转发给内部原生 Radio 的必选语义
variantdefault | button | carddefault基础、胶囊按钮或卡片布局
sizelarge | medium | smallmedium组件尺寸
validationnone | success | warning | error | infonone校验视觉与辅助语义
valuestringon事件中返回的业务值
namestring空字符串同根节点、同最近表单的同名组件构成互斥组
helper-textstring空字符串控件下方的帮助或错误信息
aria-labelstring空字符串转发给内部 Radio 的可访问名称

Switch Attributes / Properties

名称类型默认值说明
checkedbooleanfalse当前是否开启,并反射到 attribute
disabledbooleanfalse禁止操作并移出 Tab 顺序
requiredbooleanfalse转发给内部原生 Checkbox 的必选语义
sizelarge | medium | smallmedium组件尺寸
validationnone | success | warning | error | infonone校验视觉与辅助语义
namestring空字符串转发给内部控件,并包含在事件详情中
valuestringon开关事件中返回的业务值
helper-textstring空字符串控件下方的帮助或错误信息
aria-labelstring空字符串转发给内部 role="switch" 控件的可访问名称

Events

组件名称detail说明
Checkboxsuper-checkbox-change{ checked, indeterminate, name, value, originalEvent }选中或半选状态因用户操作发生变化
Radiosuper-radio-change{ checked, value, name, originalEvent }用户选择一个未选中的单选项
Switchsuper-switch-change{ checked, name, value, originalEvent }开关状态因用户操作发生变化

所有事件均设置 bubbles: truecomposed: true

Methods

三个组件提供相同的宿主方法:

名称说明
click()触发内部原生控件;禁用时无操作
focus(options?)聚焦内部原生控件
blur()移除内部原生控件焦点

Slots

组件名称说明
Checkbox默认 Slot选项文字或消费者内容
Checkboxicon卡片或选项中的装饰图标
Checkboxdescription与控件关联的次级说明
Radio默认 Slot选项文字或消费者内容
Radioicon卡片或选项中的装饰图标
Radiodescription与控件关联的次级说明
Switch默认 Slot固定说明文字
Switchdescription与控件关联的次级说明
Switchunchecked-label关闭状态显示的文字
Switchchecked-label开启状态显示的文字
Switchunchecked-icon关闭状态显示在滑块内的图标
Switchchecked-icon开启状态显示在滑块内的图标

组件不绑定图标库,图标 Slot 可以接收 SVG、图标组件或简单文本符号。

CSS Parts

组件Part说明
Checkboxcontrol / input可点击标签容器 / 内部原生 Checkbox
Checkboxindicator / mark方形指示器 / 对勾或半选标记
Checkboxicon / content / label / description / helper图标、内容、主文字、次级说明与辅助信息
Radiocontrol / input可点击标签容器 / 内部原生 Radio
Radioindicator / dot圆形指示器 / 选中圆点
Radioicon / content / label / description / helper图标、内容、主文字、次级说明与辅助信息
Switchcontrol / input可点击标签容器 / 内部原生 Checkbox
Switchtrack / thumb轨道 / 滑块
Switchunchecked-icon / checked-icon两种状态的滑块图标容器
Switchcontent / label / unchecked-label / checked-label内容、固定说明与两种状态文字容器
Switchdescription / helper次级说明 / 校验或帮助信息

CSS Custom Properties

常用视觉 token 如下;其余尺寸 token 也可以在宿主上按场景覆盖。

css
super-checkbox {
  --super-checkbox-border-color: #34445f;
  --super-checkbox-background: #fffef9;
  --super-checkbox-checked-background: #3978e9;
  --super-checkbox-checked-color: #fff;
  --super-checkbox-hover-color: #3fa66a;
  --super-checkbox-focus-color: #356df3;
  --super-checkbox-rotation: -0.35deg;
  --super-checkbox-card-background: #fffef9;
  --super-checkbox-card-checked-background: #f3f7ff;
  --super-checkbox-card-padding: 13px 16px;
}

super-radio {
  --super-radio-border-color: #34445f;
  --super-radio-background: #fffef9;
  --super-radio-checked-color: #3978e9;
  --super-radio-hover-color: #3fa66a;
  --super-radio-focus-color: #356df3;
  --super-radio-rotation: -0.4deg;
  --super-radio-option-background: #fffef9;
  --super-radio-option-checked-background: #dff3df;
  --super-radio-option-padding: 9px 15px;
}

super-switch {
  --super-switch-background: #d6d9de;
  --super-switch-checked-background: #68c875;
  --super-switch-border-color: #6b7280;
  --super-switch-checked-border-color: #2e7738;
  --super-switch-focus-color: #356df3;
  --super-switch-rotation: -0.3deg;
}

可调整的尺寸 token 包括 Checkbox 的 --super-checkbox-size--super-checkbox-gap--super-checkbox-font-size,Radio 的 --super-radio-size--super-radio-dot-size--super-radio-gap--super-radio-font-size,以及 Switch 的 --super-switch-width--super-switch-height--super-switch-thumb-size--super-switch-gap--super-switch-font-size

表单限制

三个组件当前都不是 form-associated Custom Element。内部原生控件用于语义、键盘与焦点行为,但宿主的 name / value 不会自动进入原生表单提交数据,也没有公开 formvaliditycheckValidity() 或表单重置契约。需要提交时,请在 super-*-change 事件中同步应用状态,或显式同步到表单字段;不要依赖 Shadow DOM 内部实现。