跳转到内容

CheckboxGroup 复选框组 ​

从一组选项中选择任意多项。

用法 ​

从一组选项中选择任意多项

通知方式
邮件
短信
推送通知

组件结构 ​

加粗的是必需部件。

data-scope="checkbox-group":root · label · item · indicator · item-text · hidden-input · select-all-trigger

示例 ​

全选与半选 ​

使用 itemValues 计算全选和半选状态

通知方式
邮件
短信
推送通知

横向排布 ​

使用 orientation 设置排列方向

通知渠道
邮件
短信
推送

禁用与只读 ​

禁用项不可操作,只读项仍可聚焦

整组禁用
芝士
培根
整组只读
芝士
培根
单项禁用
芝士
松露

尺寸 ​

size 决定方框与条目文字的几何档位,组标题不随档

sm
邮件
短信
md
邮件
短信
lg
邮件
短信

设计指引 ​

何时使用 ​

  • 用于偏好设置、筛选条件和批量选择。

何时不用 ​

特性 ​

  • collection 提供选项文本与禁用状态。
  • 全选触发器自动计算全选与半选状态。
  • orientation 设置横向或纵向排列。
  • 方框是字段家族的控制盒:不填底、描边与无影,勾中后以语气色填充;整行接 Action Control row 档,悬停 / 按下换面不缩放,方框随行换到承载面阶梯的下一档。

组合 ​

  • 每一项都是一个复选框,全选触发器是组内额外的一项,半选状态由组计算。
  • 在表单中以整组的值数组作为一个字段参与校验与提交。

最佳实践 ​

  • 使用简短、互不重叠的选项标签。
  • 保持选项顺序稳定。

反模式 ​

  • 用复选框组表达互斥选项。
  • 将全选项放在列表末尾。

API 参考 ​

产物 ​

层值
自定义元素<xh-checkbox-group>
Vue 组件XhCheckboxGroupIndicator XhCheckboxGroupItem XhCheckboxGroupItemText XhCheckboxGroupLabel XhCheckboxGroupRoot XhCheckboxGroupSelectAllTrigger
组合式函数useCheckboxGroup
状态机checkboxGroupMachine
皮肤@xihan-ui/styles/checkbox-group.css

Props ​

属性类型必填说明
collectionCheckboxGroupNode[]条目数据,显示文本与禁用的事实源。提供后条目部件只需声明 value。 未提供时回到文本与禁用都写在条目部件上的方式。
valuestring[]选中值集合。提供即受控:cell 直读 prop,写入只发 onValueChange 不落内部值。
defaultValuestring[]
itemValuesstring[]组内全部条目的值,按书写顺序声明;未提供时 checkedState 退化为 unchecked / indeterminate 两态。
disabledboolean整组禁用:每一项随之禁用,且隐藏输入不参与提交。
readOnlyboolean只读:仍可聚焦与朗读,但用户不可修改。
invalidboolean校验失败标注,写入每个条目的 aria-invalid。
namestring表单字段名;提供后每个条目的隐藏输入才带 name,同名多值一并提交。
orientationOrientation视觉排布,默认 vertical。只输出 data-orientation,不输出 aria-orientation。
toneTone语气:brand / neutral / success / warning / danger / info,决定勾选方框使用哪族颜色。
sizeSize尺寸:sm / md / lg,决定方框与文字的几何档位。
onValueChange(details: CheckboxGroupValueChangeDetails) => voidvalue 变化意图回调;受控时是唯一出口,非受控时随内部写入一并通知。

CheckboxGroupNode ​

collection 的元素。

字段类型必填说明
valuestring是
labelstring展示文本;默认回退为 value。
disabledboolean条目禁用:仍可聚焦、仍占一个 Tab 停靠点,但不可修改,全选也跳过它。

事件 ​

自定义元素将载荷放在 detail;Vue 使用同名 emit。

事件载荷说明
value-changeCheckboxGroupValueChangeDetails选中值变化;detail 为 { value: string[] }

插槽 ​

仅列出带载荷的插槽。

Vue 组件插槽载荷说明
XhCheckboxGroupRootdefaultCheckboxGroupRootSlotProps
XhCheckboxGroupRootlabel—
XhCheckboxGroupRootitemCheckboxGroupNodeMeta

React 适配器 props ​

只列各组件自己声明的那些:继承自 ComponentPropsWithRef 的 DOM 属性不在其中,根组件上与上面 Props 表同名的也不重复列。Vue 的对应物是上面的插槽表。

React 组件属性类型必填说明
XhCheckboxGroupItemvaluestring是
XhCheckboxGroupItemdisabledboolean默认交给 connect 查询 collection,写死 false 会覆盖数据中的禁用。
XhCheckboxGroupRootlabelReactNode标题文字。提供后不必再写 label 部件。
XhCheckboxGroupRootrenderItem(node: CheckboxGroupNodeMeta) => ReactNode每个条目的自定义内容;未提供时使用 collection 中的 label。
XhCheckboxGroupRootchildrenSlotChildren<CheckboxGroupRootSlotProps>

状态 ​

公开状态写入 data-state。

部件取值
item'checked' | 'unchecked'
indicator'checked' | 'unchecked'
item-text'checked' | 'unchecked'
hidden-input'checked' | 'unchecked'
select-all-triggerresolveCheckedState(value, prop('itemValues') ?? [])

以下名称仅用于内部状态机。

状态:idle

事件:VALUE.SET · ITEM.TOGGLE · ALL.TOGGLE · FORM.RESET · PRESS.START · PRESS.END

判据:editable · canPress

connect API ​

getXxxProps() 返回对应部件的宿主属性。

成员类型说明
valuestring[]
collectionreadonly CheckboxGroupNodeMeta[]由 collection 推导的条目元信息,按数据顺序排列;未提供 collection 时为空数组。
checkedStateCheckboxGroupCheckedState
disabledboolean
readOnlyboolean
invalidboolean
isChecked(value: string) => boolean
setValue(next: string[]) => void整体替换选中集合。程序化入口,不受 readOnly 拦截。
toggleValue(value: string) => void切换某个值;整组禁用或只读时无效。
getRootProps() => T['element']
getLabelProps() => T['element']
getItemProps(props: CheckboxGroupItemProps) => T['element']
getIndicatorProps(props: CheckboxGroupItemProps) => T['element']
getItemTextProps(props: CheckboxGroupItemProps) => T['element']
getHiddenInputProps(props: CheckboxGroupItemProps) => T['input']条目的表单影子:一份视觉隐藏的原生 checkbox,由条目内部渲染。
getSelectAllTriggerProps() => T['element']全选 / 半选的父复选框。必须写在 root 之内,它依靠祖先链找到本组。

无障碍 ​

键盘 ​

规格出处:W3C APG

按键生效条件行为
Tab / Shift+Tabfocus enters or leaves the group组内有几个条目就有几个 Tab 停靠点(禁用条目也留一个),容器自己不占位;单选组的"整组一个停靠点"在这里不成立
Spacefocus on item, group editable and item not disabled翻转该条目的选中态;改不动时放行按键给页面滚动
Spacefocus on select-all-trigger, group editable可用条目未全选则一并勾上,已全选则一并取消;禁用条目不受影响
Spaceheld on item / select-all-trigger, group editable and item not disabled按住期间该行投影 data-pressed,与指针 :active 同一副按压面(行换面、方框随行换底,不缩放);抬起或失焦撤下,按住途中整组转入禁用或只读也撤下。role=checkbox 只有 Space 是激活键,Enter 不进按压面;选中与按压互相独立

ARIA ​

以下属性由 connect 生成。

部件属性值
rootaria-labelledbylabel 部件的 id
rootrole'group'
itemaria-checked'true' | 'false'
itemaria-disabled'true' | 'false'
itemaria-invalid'true' | 'false'
itemaria-readonly'true' | 'false'
itemrole'checkbox'
indicatoraria-hidden'true'
hidden-inputaria-hidden'true'
select-all-triggeraria-checked'true' | 'mixed' | 'false'
select-all-triggeraria-disabled'false' | 'true'
select-all-triggeraria-labelledbylabel 部件的 id select-all-trigger 部件的 id
select-all-triggeraria-readonly'true' | 'false'
select-all-triggerrole'checkbox'

样式参考 ​

皮肤 ​

@xihan-ui/styles/checkbox-group.css 使用 [data-scope="checkbox-group"][data-part="root"] 部件选择器,位于 xihan.components 层。覆盖样式使用 xihan.overrides。

forced-colors: active 下另有一套规则:颜色交给系统,边框与状态标记改用系统色关键字。

数据属性 ​

由 connect 生成;条件不成立时不输出无值属性。

部件属性值
rootdata-disabled''(条件成立时才出现)
rootdata-invalid''(条件成立时才出现)
rootdata-orientationprops.orientation
rootdata-readonly''(条件成立时才出现)
rootdata-sizeprops.size
rootdata-toneprops.tone
itemdata-disabled''(条件成立时才出现)
itemdata-pressed''(条件成立时才出现)
itemdata-state'checked' | 'unchecked'
itemdata-xh-action-control''
itemdata-xh-action-display'always'
itemdata-xh-action-profile'row'
itemdata-xh-action-size'xs'
itemdata-xh-action-variant'ghost'
indicatordata-disabled''(条件成立时才出现)
indicatordata-state'checked' | 'unchecked'
item-textdata-disabled''(条件成立时才出现)
item-textdata-state'checked' | 'unchecked'
hidden-inputdata-disabled''(条件成立时才出现)
hidden-inputdata-state'checked' | 'unchecked'
select-all-triggerdata-disabled''(条件成立时才出现)
select-all-triggerdata-pressed''(条件成立时才出现)
select-all-triggerdata-readonly''(条件成立时才出现)
select-all-triggerdata-stateresolveCheckedState(value, prop('itemValues') ?? [])
select-all-triggerdata-xh-action-control''
select-all-triggerdata-xh-action-display'always'
select-all-triggerdata-xh-action-profile'row'
select-all-triggerdata-xh-action-size'xs'
select-all-triggerdata-xh-action-variant'ghost'

CSS 变量 ​

本组件公开覆盖槽由独立皮肤的实际消费位生成;默认来源、作用部件和状态均与 CSS 同源。

变量部件CSS 属性状态默认来源说明
--xh-checkbox-group-gaprootgapdefault--xh-space-2checkbox-group 的 root 部件 gap 覆盖槽。
--xh-checkbox-group-icon-sizeroot--xh-icon-sizedefault--xh-_checkbox-group-glyphcheckbox-group 的 root 部件 --xh-icon-size 覆盖槽。
--xh-checkbox-group-indicator-bgindicator
root
select-all-trigger
background-colordefaulttransparentcheckbox-group 的 indicator、root、select-all-trigger 部件 background-color 覆盖槽。
--xh-checkbox-group-indicator-bg-checkedindicator
select-all-trigger
background-coloris([data-state='checked'], [data-state='indeterminate'])
state=checked
state=indeterminate
--xh-_checkbox-group-accentcheckbox-group 的 indicator、select-all-trigger 部件 background-color 覆盖槽。
--xh-checkbox-group-indicator-bg-checked-pressedindicator
item
root
select-all-trigger
background-colordisabled
is(:active, [data-pressed])
is([data-state='checked'], [data-state='indeterminate'])
not([data-disabled])
not([data-readonly])
pressed
readonly
state=checked
state=indeterminate
--xh-_tone-activecheckbox-group 的 indicator、item、root、select-all-trigger 部件 background-color 覆盖槽。
--xh-checkbox-group-indicator-bg-disabledindicator
item
root
select-all-trigger
background-colordisabled--xh-bg-subtlecheckbox-group 的 indicator、item、root、select-all-trigger 部件 background-color 覆盖槽。
--xh-checkbox-group-indicator-bg-pressedindicator
item
root
select-all-trigger
background-colordisabled
is(:active, [data-pressed])
not([data-disabled])
not([data-readonly])
pressed
readonly
--xh-_checkbox-group-host-bg-pressedcheckbox-group 的 indicator、item、root、select-all-trigger 部件 background-color 覆盖槽。
--xh-checkbox-group-indicator-borderindicator
select-all-trigger
borderdefault--xh-border-controlcheckbox-group 的 indicator、select-all-trigger 部件 border 覆盖槽。
--xh-checkbox-group-indicator-border-checkedindicator
select-all-trigger
border-coloris([data-state='checked'], [data-state='indeterminate'])
state=checked
state=indeterminate
--xh-_checkbox-group-accentcheckbox-group 的 indicator、select-all-trigger 部件 border-color 覆盖槽。
--xh-checkbox-group-indicator-border-disabledindicator
item
root
select-all-trigger
border-colordisabled--xh-border-defaultcheckbox-group 的 indicator、item、root、select-all-trigger 部件 border-color 覆盖槽。
--xh-checkbox-group-indicator-border-hoverindicator
item
root
select-all-trigger
border-color@media (hover: hover)
disabled
hover
invalid
not([data-disabled])
not([data-invalid])
not([data-readonly])
not([data-state='checked'])
not([data-state='indeterminate'])
readonly
state=checked
state=indeterminate
--xh-border-control-hovercheckbox-group 的 indicator、item、root、select-all-trigger 部件 border-color 覆盖槽。
--xh-checkbox-group-indicator-border-invalidindicator
root
border-colorinvalid--xh-border-invalidcheckbox-group 的 indicator、root 部件 border-color 覆盖槽。
--xh-checkbox-group-indicator-fgindicator
select-all-trigger
background-color
color
default
state=checked
state=indeterminate
--xh-_checkbox-group-on-accentcheckbox-group 的 indicator、select-all-trigger 部件 background-color、color 覆盖槽。
--xh-checkbox-group-indicator-fg-disabledindicator
item
root
select-all-trigger
colordisabled--xh-fg-disabledcheckbox-group 的 indicator、item、root、select-all-trigger 部件 color 覆盖槽。
--xh-checkbox-group-indicator-font-sizeindicator
select-all-trigger
font-sizedefault
state=checked
state=indeterminate
--xh-_checkbox-group-glyphcheckbox-group 的 indicator、select-all-trigger 部件 font-size 覆盖槽。
--xh-checkbox-group-indicator-radiusindicator
select-all-trigger
border-radiusdefault--xh-shape-insetcheckbox-group 的 indicator、select-all-trigger 部件 border-radius 覆盖槽。
--xh-checkbox-group-indicator-shadowindicator
select-all-trigger
box-shadowdefaultnonecheckbox-group 的 indicator、select-all-trigger 部件 box-shadow 覆盖槽。
--xh-checkbox-group-indicator-sizeindicator
select-all-trigger
block-size
inline-size
margin-inline-start
default
state=checked
state=indeterminate
--xh-_checkbox-group-boxcheckbox-group 的 indicator、select-all-trigger 部件 block-size、inline-size、margin-inline-start 覆盖槽。
--xh-checkbox-group-item-bg-hoveritembackground-colordisabled
hover
loading
not([data-disabled])
not([data-loading])
--xh-bg-subtlecheckbox-group 的 item 部件 background-color 覆盖槽。
--xh-checkbox-group-item-bg-presseditembackground-colordisabled
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
pressed
--xh-bg-subtle-hovercheckbox-group 的 item 部件 background-color 覆盖槽。
--xh-checkbox-group-item-fgitemcolordefault
disabled
focus-visible
hover
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
pressed
--xh-fg-defaultcheckbox-group 的 item 部件 color 覆盖槽。
--xh-checkbox-group-item-fg-disableditemcolordisabled--xh-fg-disabledcheckbox-group 的 item 部件 color 覆盖槽。
--xh-checkbox-group-item-font-sizeitemfont-sizedefault--xh-_checkbox-group-font-sizecheckbox-group 的 item 部件 font-size 覆盖槽。
--xh-checkbox-group-item-gapitemgapdefault--xh-_checkbox-group-gapcheckbox-group 的 item 部件 gap 覆盖槽。
--xh-checkbox-group-item-radiusitemborder-radiusdefault--xh-shape-controlcheckbox-group 的 item 部件 border-radius 覆盖槽。
--xh-checkbox-group-label-fglabelcolordefault--xh-fg-mutedcheckbox-group 的 label 部件 color 覆盖槽。
--xh-checkbox-group-label-fg-disabledlabel
root
colordisabled--xh-fg-subtlecheckbox-group 的 label、root 部件 color 覆盖槽。
--xh-checkbox-group-label-font-sizelabelfont-sizedefault--xh-text-label-sizecheckbox-group 的 label 部件 font-size 覆盖槽。
--xh-checkbox-group-label-font-weightlabelfont-weightdefault--xh-text-label-weightcheckbox-group 的 label 部件 font-weight 覆盖槽。
--xh-checkbox-group-select-all-trigger-bg-hoverselect-all-triggerbackground-colordisabled
hover
loading
not([data-disabled])
not([data-loading])
--xh-bg-subtlecheckbox-group 的 select-all-trigger 部件 background-color 覆盖槽。
--xh-checkbox-group-select-all-trigger-bg-pressedselect-all-triggerbackground-colordisabled
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
pressed
--xh-bg-subtle-hovercheckbox-group 的 select-all-trigger 部件 background-color 覆盖槽。
--xh-checkbox-group-select-all-trigger-fgselect-all-triggercolordefault
disabled
focus-visible
hover
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
pressed
--xh-fg-defaultcheckbox-group 的 select-all-trigger 部件 color 覆盖槽。
--xh-checkbox-group-select-all-trigger-fg-disabledselect-all-triggercolordisabled--xh-fg-disabledcheckbox-group 的 select-all-trigger 部件 color 覆盖槽。
--xh-checkbox-group-select-all-trigger-font-sizeselect-all-triggerfont-sizedefault--xh-_checkbox-group-font-sizecheckbox-group 的 select-all-trigger 部件 font-size 覆盖槽。
--xh-checkbox-group-select-all-trigger-font-weightselect-all-triggerfont-weightdefault--xh-font-weight-mediumcheckbox-group 的 select-all-trigger 部件 font-weight 覆盖槽。
--xh-checkbox-group-select-all-trigger-gapselect-all-triggergapdefault--xh-_checkbox-group-gapcheckbox-group 的 select-all-trigger 部件 gap 覆盖槽。
--xh-checkbox-group-select-all-trigger-radiusselect-all-triggerborder-radiusdefault--xh-shape-insetcheckbox-group 的 select-all-trigger 部件 border-radius 覆盖槽。

动效 ​

动效角色:按压 · 状态(见动效规范)。

background-color · border-color 走 transition 过渡。时长与缓动读动效令牌,改令牌即改全局节奏。

系统开启减弱动效时由令牌层统一收敛,皮肤不另作判断。

响应式 ​

皮肤另按输入能力分档:hover: hover · pointer: coarse:同一份皮肤在触屏与带指针的设备上不一样,与视口宽度无关。

RTL ​

皮肤用逻辑属性排布(inline-start 一族),dir="rtl" 下自动镜像。

Released under The MIT License