定价

Checkbox 使用手册

v1.3.0 · @snowui-design-system/components

许可阅读:首次阅读组件文档、源码或 npm 使用流程,先读完整 LICENSE;同任务同版本去重。公开 API 配置与内部实现修改分别按许可处理;全部组件使用统一运行包,源码权益以许可为准。

组件介绍

选择一个或多个独立选项,支持选中、未选中和部分选中状态,适合表单与批量选择。

使用选择

用于独立开关或多项选择。互斥单选用 Radio,立即生效的二态设置用 Switch;DataTable 选择列优先使用其内置选择协议。

  • 独立布尔状态使用 bind:checked;多选数组使用 bind:group 并为各项提供稳定 value。

  • indeterminate 表示部分选中;与 checked 分开管理。提供标签或 ariaLabel,禁用使用 disabled。

快速开始

以下示例展示推荐的基本组合。更多场景与组合限制见后文。

<script lang="ts">	import { Checkbox } from '@snowui-design-system/components';	let subscribed = $state(false);</script> <Checkbox bind:checked={subscribed}>Email me product updates</Checkbox>

API

关键字 类型 默认值 描述
checked boolean false 选中状态(双向绑定)
group any[] — 多选值数组,配合 value 双向绑定
value any — 表单值
size ResourceSize | number — 组件尺寸(像素,梯度与 Icon 一致:12/16/20/24/28/32/40/48/80)
disabled boolean false 禁用状态
indeterminate boolean false 不确定状态(双向绑定)
onCheckedChange (checked: boolean) => void — 原生复选状态变化后的回调
ariaLabel string — 无可见 label 时的无障碍名称
singleLine boolean true 默认标签与控件保持单行,附件不压缩;窄宽时原始标签可省略显示并保留完整可访问名称,不复制 children。复杂多行内容可显式设为 false,由该内容拥有布局。需要全文提示时组合 Text lines={1}。
gap number — 继承 Frame 的间距 Token 序号;省略时使用原组件间距,显式值覆盖组件间距。有效间距至少 4 CSS px,包含零值、根字号及 gap-scale 缩放;较大首选值保留。
children Snippet — 标签内容
enableResponsive boolean false 启用响应式
enableContext boolean false 启用上下文

未重新声明的继承能力请查所属基础组件文档;本表只列本组件源码具名公开属性。

使用边界与详细说明

布局模型

主布局模型:内联外壳布局。定义见 ../../../specs/maintainers/LayoutProtocol.md §12.4(源码参考:specs/maintainers/LayoutProtocol.md)。

Checkbox 属于“控件视觉体 + label”的内联外壳子类:

  • 根节点保持 inline-flex,内容整体 Hug。

  • .snowui-checkbox-visual 是固定 Hug 的控件视觉体。

  • .snowui-checkbox-label 是可选标签,空间充足时 Hug,受限时允许收缩并单行省略;原始内容及完整原生名称保留。

  • visual 与 label 的距离由 --snowui-checkbox-gap 管理,可通过 gap 或 --snowui-checkbox-gap-override 设置首选值;有效间距至少 4 CSS px。

  • size 表示包含透明留白的控件占位尺寸,不改变 label 的布局策略。

  • 四周留白为 size / 16,可见图形宽高为 size × 0.875;例如 size={32} 占位 32×32px、图形 28×28px、四边各 2px。留白与图形随 size、根字号和尺寸 Token 等比缩放,留白仍可点击。

  • 留白由共享控件壳持有,label 位于壳外;内边框继续按名义 size 的 0.0625 计算,圆角、Dot 与选中环按可见图形尺寸计算。


使用示例

<script>  import { Checkbox } from '@snowui-design-system/components';  let checked = $state(false);  let indeterminate = $state(false);</script>   <Checkbox bind:checked>复选框</Checkbox>  <Checkbox bind:indeterminate>不确定状态</Checkbox>  <Checkbox bind:checked size={24}>大号复选框 (24px)</Checkbox>  <Checkbox checked disabled>禁用复选框</Checkbox>

Unchecked(未选中)

  • 空的方框

  • 灰色边框

Checked(选中)

  • 显示勾选图标

  • 主题色背景和边框

Indeterminate(不确定)

  • 显示横线图标

  • 主题色背景和边框

  • 常用于"全选"场景

图标

  • 勾选图标: 选中状态显示

  • 横线图标: 不确定状态显示

  • 使用 28×28 SVG 描边路径绘制,随组件尺寸缩放并继承选中态颜色

无障碍性

  • 使用原生 <input type="checkbox"> 确保键盘导航

  • 支持 Tab 键聚焦

  • 支持 Space 键切换

  • 支持 indeterminate 属性

  • 禁用状态下 tabindex=-1

单个复选框

<script lang="ts">  import { Checkbox } from '@snowui-design-system/components';  let checked = $state(false);</script> <Checkbox bind:checked>同意条款</Checkbox>

全选/部分选中

<script>  import { Checkbox, Frame } from '@snowui-design-system/components';   let items = $state([    { id: 1, checked: false },    { id: 2, checked: false },    { id: 3, checked: false }  ]);   let allChecked = $derived(items.every(item => item.checked));  let someChecked = $derived(items.some(item => item.checked) && !allChecked);</script>  <Frame class="flex flex-col gap-2 p-4">  <Checkbox    checked={allChecked}    indeterminate={someChecked}    onclick={() => {      const newState = !allChecked;      items.forEach(item => item.checked = newState);    }}  >    全选  </Checkbox>   <Frame class="flex flex-col gap-2 pl-6 border-l border-black-10">    {#each items as item}      <Checkbox bind:checked={item.checked}>选项 {item.id}</Checkbox>    {/each}  </Frame></Frame>

样式规则 (Style Spec)

属性 值 说明
Class .snowui-checkbox 组件根类名
CSS 行为 组件自管 hover 视觉由组件内部选择器声明
Tag label 语义化标签,点击区域包含文字

2. 默认样式 (Defaults)

  • Display: inline-flex, align-items: center

  • Gap: 首选 var(--gap-1),缩放和零值下的有效间距仍至少为 4 CSS px。

  • Cursor: pointer (Disabled 时为 default)

  • Font: var(--text-14) (14px), line-height: var(--leading-14) (20px)

3. CSS 变量 (Variables)

组件使用 CSS 变量实现等比缩放:

--snowui-checkbox-size: var(--size-4); /* 基准 16px */--snowui-checkbox-size-resolved: var(--snowui-checkbox-size-override, var(--snowui-checkbox-size));--snowui-checkbox-radius: calc(var(--snowui-checkbox-visual-size) * 0.3125); /* 可见尺寸的 31.25% */--snowui-checkbox-radius-resolved: var(--snowui-checkbox-radius-override, var(--snowui-checkbox-radius));--snowui-checkbox-border-width: calc(var(--snowui-checkbox-size-resolved) * 0.0625); /* 16px 时 1px,32px 时 2px */--snowui-checkbox-border-width-resolved: var(--snowui-checkbox-border-width-override, var(--snowui-checkbox-border-width));--primary: var(--primary, var(--black-100, #000000)); /* 使用全局 Primary Token (默认黑色) */

Unchecked

  • Visual: 透明背景 + var(--black-20) 边框

  • Icon: 勾选与横线均不可见

  • Hover: 填充保持不变;独立 inset 覆盖层在基础 20% 黑色边框上再叠加 20% 黑色,默认等效约 36% 黑色;仅此状态适用 StyleSpec §2.4.3 例外

Checked / Indeterminate

  • 触发: 原生 input 的 :checked / :indeterminate 通过 sibling 选择器驱动

  • Visual: var(--primary) 背景 + 边框

  • Icon: color: var(--static-white-100);checked 使用路径绘制,indeterminate 保留缩放 / 透明度过渡

  • Hover: 填充与 inset 边框统一在主色上混合 20% Static White

Disabled

  • Attr: [data-disabled="true"]

  • Style: opacity: 0.5, pointer-events: none, cursor: default

5. 交互细节

  • 点击区域: 原生 <input> 使用 position: absolute; inset: 0 覆盖整个 label 区域,确保点击响应灵敏。

  • Focus: 支持键盘导航,聚焦时显示 20% primary 的 Ring。

  • 动画:

    • 容器: hover 填充与 inset 边框使用相同颜色和时序

    • checked 勾选: 参考 Fluid Functionalism 的 pathLength 语义,进入使用 200ms ease-out 绘制;取消选择时以常规 150ms ease-out 随底色淡出,不反向绘制

    • indeterminate 横线: 与 Radio 状态动效一致,使用 150ms ease-out

    • prefers-reduced-motion: reduce: 取消视觉体、勾选与横线过渡,直接显示最终状态

Checkbox 样式覆盖

先阅读 完整 LICENSE;同任务、同版本、同范围去重。

优先用组件公开 Props 匹配合适样式,尽可能保留原有视觉。确需改写时按 样式选择与改写顺序 使用自己的 class(含项目已有 Tailwind)或实例 style。以下名称来自源码实际消费的公开 override;先核对目标作用域,不修改私有 DOM。采用 SnowUI Token 时选择正确类别,外部应用不被要求安装一方 utilities。

变量 用途与默认参考
--snowui-checkbox-border-width-override 边框宽度(默认值见组件源码)
--snowui-checkbox-color-override color(默认值见组件源码)
--snowui-checkbox-gap-override gap(默认 var(--gap-1) = 4px)
--snowui-checkbox-label-font-size-override label font-size(默认值见组件源码)
--snowui-checkbox-label-line-height-override label line-height(默认值见组件源码)
--snowui-checkbox-motion-duration-override 动效时长(默认值见组件源码)
--snowui-checkbox-motion-easing-override 动效曲线(默认值见组件源码)
--snowui-checkbox-overlay-color-override 覆盖层颜色(默认值见组件源码)
--snowui-checkbox-overlay-opacity-override 覆盖层不透明度(默认值见组件源码)
--snowui-checkbox-primary-override 主色(默认值见组件源码)
--snowui-checkbox-radius-override border-radius(默认随尺寸动态计算)
--snowui-checkbox-size-override 整体尺寸(尺寸 px,默认值见组件源码)

设计指南 · Token · 组合边界

Checkbox 类型与状态

必填属性:无具名必填属性。

可双向绑定:bind:checked、bind:group、bind:indeterminate。

继承声明:Omit<FrameProps, "size">。继承能力以基类公开文档为准;Omit 中的字段已排除,不能按基类原样使用。

共享 Frame API · 返回 API

以下为公开属性实际引用的类型声明,来自源码;Svelte Snippet 表示内容片段,ComponentProps 表示对应组件的 Props。

ResourceSize

来源:components/src/context.ts

export type ResourceSize = 12 | 16 | 20 | 24 | 28 | 32 | 40 | 48 | 80;