跳转到内容

Cascader 级联选择 ​

用于从多层分类中选择完整路径。

用法 ​

按层级选择完整地区路径

收货地区

组件结构 ​

加粗的是必需部件。

data-scope="cascader":root · hidden-input · label · control · trigger · value-text · indicator · clear-trigger · positioner · content · input · search-list · search-item · column · group · group-label · item · item-text · item-description · item-suffix · item-indicator · empty · loading · footer

示例 ​

多选 ​

选择多个分类路径

采购清单

校验状态 ​

清晰标记必填错误

所属部门

这一项必填

懒加载 ​

展开分支时加载下一层数据

收货地区

搜索 ​

按完整路径筛选选项

收货地区

设计指引 ​

何时使用 ​

  • 选项具有稳定的多层结构,如地区或商品类目。
  • 用户需要逐层缩小选择范围。

何时不用 ​

特性 ​

  • changeOnSelect 允许选择中间层。
  • expandTrigger 支持点击或悬停展开。
  • multiple、cascade 与 checkedStrategy 控制多选及路径收敛方式。
  • searchable 按完整路径筛选选项。
  • 选项可逐条声明语气,不向下传导;搜索结果取整条路径末段的语气。
  • 选项可写副文本,第 2 行放一句解释,与标题同列、走 muted 档。
  • 选项行尾留一格给作者(计数、徽标)。
  • 支持按需加载、空状态、加载状态与原生表单提交。
  • 选中项使用末端标记,半选项使用横线。

组合 ​

  • 使用 label、control 与 value-text 组成字段外壳。
  • 使用 column、item 与 item-indicator 组成分级列表。

最佳实践 ​

  • 层级建议控制在三层以内。
  • 回显完整路径,避免同名末级选项产生歧义。
  • 自定义条目时保留 item-text 与 item-indicator。

反模式 ​

  • 不要在异步加载时隐藏已有列。
  • 多选时明确约定 checkedStrategy。

API 参考 ​

产物 ​

层值
自定义元素<xh-cascader>
Vue 组件XhCascaderClearTrigger XhCascaderColumn XhCascaderContent XhCascaderControl XhCascaderFooter XhCascaderGroup XhCascaderGroupLabel XhCascaderIndicator XhCascaderInput XhCascaderItem XhCascaderItemDescription XhCascaderItemIndicator XhCascaderItemSuffix XhCascaderItemText XhCascaderLabel XhCascaderLoading XhCascaderPositioner XhCascaderRoot XhCascaderSearchList XhCascaderTrigger XhCascaderValueText
组合式函数useCascader
状态机cascaderMachine
皮肤@xihan-ui/styles/cascader.css

Props ​

属性类型必填说明
collectionCascaderNode[]树数据,层级元信息与显示文本的唯一事实源。默认为空树。
valueCascaderValue选中路径。提供即受控:cell 直读 prop,写入只发 onValueChange 不落内部值。 单条路径是简写,内部一律归一为路径集合。
defaultValueCascaderValue
namestring原生字段名,每条选中路径提交一项 JSON 字符串数组。
formstring关联的原生表单 ID;指定后覆盖祖先表单归属。
openboolean展开态。提供即受控:内部不再自行修改,只发 onOpenChange。
defaultOpenboolean
expandTriggerCascaderExpandTrigger子列的展开方式,默认 click。
changeOnSelectboolean中间层(分支)也可以落值。关闭时点击分支只展开子列,不改变选中值。
multipleboolean多选:选中为路径集合,选中后浮层不收起、焦点留在列中以便继续选择。
searchableboolean开启搜索:input 部件可用,输入后整条路径连缀过滤、候选替换列视图。
cascadeboolean多选下父子级联勾选:点击分支整枝传导、子全勾父勾、部分勾选半选, 禁用子树整棵冻结。默认 false(按路径原样切换);单选下无效。
checkedStrategyCascadeStrategy级联下对外值的收敛策略,默认 child(只收叶);parent = 最高整枝,all = 全部勾选节点。
disabledboolean整个控件禁用:trigger 使用原生 disabled,浮层不可展开。
readOnlyboolean只读:浮层照常展开与浏览,但选中值不可修改、也不可清空。
invalidboolean校验失败:trigger 报告 aria-invalid,各角色节点带 data-invalid。
loadingboolean候选加载中:浮层报告 aria-busy;当前视图无候选时显示在途占位。
translationsPartial<CascaderTranslations>空态占位的文案覆盖,默认英文。
variantControlVariant形态:outline / subtle / ghost,决定触发框的描边与底色使用方式。默认 outline。
toneTone语气:brand / neutral / success / warning / danger / info,决定聚焦与选中使用哪族颜色。
sizeSize尺寸:sm / md / lg,决定触发框与条目的几何档位。
placeholderstring无选中时 value-text 显示的占位文字。
separatorstring路径回显的连接符,默认 ' / '。
placementPlacement
offsetnumber
loopboolean列内上下键到达首尾是否回绕,默认 true。
dirDirection文字方向,默认 ltr;只对调左右方向键的进入子列 / 返回上一列语义。
onValueChange(details: CascaderValueChangeDetails) => voidvalue 变化意图回调;受控时是唯一出口,非受控时随内部写入一并通知。
onOpenChange(details: CascaderOpenChangeDetails) => voidopen 变化意图回调;受控时是唯一出口,非受控时随内部转移一并通知。

CascaderNode ​

collection 的元素。

字段类型必填说明
valuestring是
labelstring展示名,也是路径回显的取字来源;默认回退为 value。
disabledboolean条目禁用:方向键跳过它,但它仍可聚焦、仍是导航起点。不向下传导给子节点。
toneTone该条选项自身的性质:已失效的写 danger、需要留意的写 warning。不写即与同列其余条目同档, 也不向下传导给子节点——每一层各自声明。只换字色与悬停 / 按下的面,不表达选中与校验; 展开路径的面、选中的对号与禁用都压过它。搜索结果里取整条路径末段的语气。
descriptionstring副文本,写入 item-description 部件;未提供时本条不铺该部件。 它是第 2 行的说明,跟着条目走 muted 档,不跟语气;放不下一行的解释才用它, 一句话能说清的写进 label。
childrenCascaderNode[]子节点。非空数组才视为分支(右侧可以再打开一列)。

事件 ​

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

事件载荷说明
value-changeCascaderValueChangeDetails选中路径集合变化;detail 为 { value: string[][] }
open-changeCascaderOpenChangeDetailsopen 状态变化;detail 为 { open: boolean }

插槽 ​

仅列出带载荷的插槽。

Vue 组件插槽载荷说明
XhCascaderRootdefaultCascaderRootSlotProps
XhCascaderSearchListitemCascaderSearchListItemSlotProps

React 适配器 props ​

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

React 组件属性类型必填说明
XhCascaderColumnlevelnumber | string是层号,兼收字符串。
XhCascaderContentemptyReactNode空态占位的内容;未提供时按视图取无匹配或无数据文案。
XhCascaderGroupvaluestring是
XhCascaderItemvaluestring是
XhCascaderPositionercontainer() => Element | null浮层挂载的容器;未提供时按全局配置,再未提供时挂载到 body。
XhCascaderRootchildrenSlotChildren<CascaderRootSlotProps>
XhCascaderSearchListrenderItem(result: CascaderSearchResult) => ReactNode每条候选的自定义内容;未提供时把整条路径连缀为一行。

状态 ​

公开状态写入 data-state。

部件取值
root'open' | 'closed'
control'open' | 'closed'
trigger'open' | 'closed'
indicator'open' | 'closed'
positioner'open' | 'closed'
content'open' | 'closed'
search-item'checked' | 'indeterminate' | 'unchecked'
column'open' | 'closed'
item'indeterminate' | 'checked' | 'unchecked'
item-text'indeterminate' | 'checked' | 'unchecked'
item-description'indeterminate' | 'checked' | 'unchecked'
item-suffix'indeterminate' | 'checked' | 'unchecked'
item-indicator'indeterminate' | 'checked' | 'unchecked'
footer'open' | 'closed'

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

状态:open · closed

事件:FORM.RESET · OPEN · TOGGLE · CLOSE · CONTROLLED.OPEN · CONTROLLED.CLOSE · ITEM.FOCUS · ITEM.EXPAND · ITEM.LOST · ITEM.SELECT · VALUE.SET · VALUE.CLEAR · PATH.SET · INPUT.CHANGE · SEARCH.HIGHLIGHT · PRESS.START · PRESS.END

判据:isOpenControlled · isMultiple · staysOpenOnSelect · canPress

connect API ​

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

成员类型说明
openboolean
collectionreadonly CascaderNode[]作者提供的原始树数据。
columnsreadonly CascaderColumn[]当前并排打开的列(含每列的条目):列数 = 展开路径可走通的段数 + 1。
levelsreadonly CascaderLevel[]按深度展开的静态列,与展开路径无关;不应显示的条目由连接层加 hidden 收起。
valuestring[][]选中路径集合;单选下长度 ≤ 1,形状不随模式变化。
valuePathstring[] | null单选便利读法:选中的路径,无选中时为 null。
valueTextstring | null选中路径的显示文字(整条路径用分隔符连接;多选各条之间用逗号);无选中时为 null。
displayTextstringvalue-text 实际显示的文字:有选中时取路径文本,否则取 placeholder。
activePathstring[]展开路径:并排打开哪几列由它决定。
focusedPathstring[] | null焦点锚点;收起、或它已不在任何可见列中时为 null。
multipleboolean
disabledboolean
readOnlyboolean
invalidboolean
canClearboolean清空按钮当前是否可按。
isSelected(value: string) => boolean该条目是否为某条选中路径的末项。
isIndeterminate(value: string) => boolean级联模式下该分支是否半选(有效叶后代部分勾选);非级联恒为 false。
isActive(value: string) => boolean该条目是否落在展开路径上(它的子列已打开,或它自身即为最后一站)。
isVisible(value: string) => boolean该条目当前是否落在某个可见列中。
searchingboolean正处于搜索视图(开启 searchable 且输入非空):列视图让位给候选列表。
inputValuestring搜索框中的原始串。
searchResultsreadonly CascaderSearchResult[]过滤后的候选:整条路径连缀匹配,带 pathKey 与禁用标记。
searchHighlightIndexnumber候选中的虚拟高亮下标,恒落在一条可选候选上;没有候选或整批禁用时为 -1。
translationsCascaderTranslations空态占位的文案:实例覆盖并入默认后的完整一份。
setInputValue(next: string) => void
setOpen(next: boolean) => void
setValue(next: string[][]) => void
setActivePath(next: string[]) => void
select(path: string[]) => void选中一条路径,与点击条目同一语义(分支是否落值仍取决于 changeOnSelect)。
clear() => void
getRootProps() => T['element']
getHiddenInputProps(props: { path: readonly string[] }) => T['input']每条路径独立编码,适配器按 value 渲染重复同名字段。
getLabelProps() => T['element']
getControlProps() => T['element']
getTriggerProps() => T['button']
getValueTextProps() => T['element']
getIndicatorProps() => T['element']
getClearTriggerProps() => T['button']
getPositionerProps() => T['element']
getContentProps() => T['element']
getInputProps() => T['input']搜索框:放在 content 顶部;输入即过滤,上下键移动候选、Enter 选中、Escape 先清除输入。
getSearchListProps() => T['element']候选列表容器;不在搜索视图时带 hidden。
getSearchItemProps(props: CascaderSearchItemProps) => T['element']一条候选:身份是整条路径;点击选中(与点击列内条目同一语义)。
getEmptyProps() => T['element']空态占位:当前视图没有条目(搜索无候选,或根列没有条目)时显示,其余时候带 hidden。
getLoadingProps() => T['element']在途占位:当前视图无候选且正在取数时显示;已有候选或祖先列时只保留 aria-busy。 适配器自动提供默认部件,作者显式编写部件即可替换它。
getFooterProps() => T['element']浮层底部的操作区:放在 content 中、与列并列,不进入任何一列的拥有关系,方向键也无法到达。
getGroupProps(props: CascaderGroupProps) => T['element']分组容器:role=group,条目挂在其中;分组标题经 aria-labelledby 关联。
getGroupLabelProps(props: CascaderGroupProps) => T['element']分组标题:不是条目、不进入导航,只作为本组的可及名。
getColumnProps(props: CascaderColumnProps) => T['element']
getItemProps(props: CascaderItemProps) => T['element']
getItemTextProps(props: CascaderItemProps) => T['element']
getItemDescriptionProps(props: CascaderItemProps) => T['element']
getItemSuffixProps(props: CascaderItemProps) => T['element']
getItemIndicatorProps(props: CascaderItemProps) => T['element']

无障碍 ​

键盘 ​

规格出处:W3C APG

按键生效条件行为
Enter / Spaceclosed, focus in trigger展开浮层并把焦点落到选中路径的末项(无选中或它已禁用则落该列首个可用条目)
ArrowDownclosed, focus in trigger展开浮层并把焦点落到选中条目在它那一列里的下一个可用条目
ArrowUpclosed, focus in trigger展开浮层并把焦点落到选中条目在它那一列里的上一个可用条目
Deletefocus in trigger, 有值且未禁用、未只读清空全部选中值,浮层不展开、焦点留在 trigger
Backspacefocus in trigger, 有值且未禁用、未只读单选清空;多选去掉最后一个选中路径
ArrowDownopen, focus in content焦点移到当前列的下一个条目(禁用条目跳过;loop 默认开,末项回绕到首项);别的列不动
ArrowUpopen, focus in content焦点移到当前列的上一个条目(禁用条目跳过;loop 默认开,首项回绕到末项)
Homeopen, focus in content焦点移到当前列的首个可用条目
Endopen, focus in content焦点移到当前列的末个可用条目
ArrowRightopen, 焦点条目有子节点(dir=rtl 时改由 ArrowLeft 承担)子列没开时先把它铺出来(焦点不动),已开时焦点移进它的首个可用条目;叶子上什么都不做且不吞键
ArrowLeftopen, 焦点不在根列(dir=rtl 时改由 ArrowRight 承担)焦点退回上一列的父条目,当前这一列随之收起;根列上什么都不做且不吞键
Enter / Spaceopen, 焦点条目未禁用叶子:落值并收起浮层、焦点归还 trigger。分支:展开它的子列且浮层不收起,changeOnSelect 打开时同时落值
Enter / Spaceheld in item / clear-trigger, 未禁用、未只读、未加载按住期间该部件投影 data-pressed,与指针 :active 同一副按压面;抬起或失焦撤下,条目随浮层收起一并撤下;没有值可清时清空按钮不进
Escapeopen收起浮层并把焦点归还 trigger,选中值不变
Tab / Shift+Tabopen收起浮层,焦点不归还 trigger,按 Tab 序列自然离开
可打印字符open, focus in input, searchable改写检索词;trim 后非空即把列视图整个换成候选列表(整条路径连缀匹配),高亮落到首个可选候选
ArrowDownopen, focus in input, 检索词非空高亮移到下一个候选(禁用整条的候选跳过;loop 默认开,末条回绕到首条),焦点留在检索框
ArrowUpopen, focus in input, 检索词非空高亮移到上一个候选(禁用整条的候选跳过;loop 默认开,首条回绕到末条),焦点留在检索框
Homeopen, focus in input, 检索词非空高亮移到首个可选候选;检索词为空时不接管,光标照常跳到行首
Endopen, focus in input, 检索词非空高亮移到末个可选候选;检索词为空时不接管,光标照常跳到行尾
Enteropen, focus in input, 有高亮候选把整条候选路径落成选中值:单选收起浮层、焦点归还 trigger,多选并入集合且浮层不收起;两种都清掉检索词回列视图。无可选候选时不吞这个键
Enteropen, focus in input, 有高亮候选且未禁用、未只读、未加载,按住按住期间高亮候选投影 data-pressed,与指针 :active 同一副按压面;抬起或失焦撤下,候选随浮层收起一并撤下
Escapeopen, focus in input, 检索词非空清掉检索词回到列视图,浮层不收起、焦点留在检索框;检索词已空才轮到收浮层那一档
ArrowDown / ArrowUpopen, focus in input, 检索词为空把焦点交给列视图:有锚点条目就落回它,没有则 ArrowDown 进当前列首个可用条目、ArrowUp 进末个
ArrowLeft / ArrowRightopen, focus in input不接管,留给检索框自己移光标;进子列 / 回上一列那一套只在焦点落在条目上时发生
Tab / Shift+Tabopen, focus in input收起浮层,焦点不归还 trigger,按 Tab 序列自然离开
输入法组合期间的任意键open, focus in input, isComposing一律不接管:组合期的 Enter 与上下键属于输入法候选框,既不选中候选也不移高亮

ARIA ​

以下属性由 connect 生成。

部件属性值
triggeraria-controlscontent 部件的 id
triggeraria-expanded'true' | 'false'
triggeraria-haspopup'listbox'
triggeraria-invalid'true' | 'false'
triggeraria-labelledbylabel 部件的 id value-text 部件的 id
triggeraria-readonly'true' | 'false'
triggerrole'combobox'
indicatoraria-hidden'true'
clear-triggeraria-labeltranslations.clearTrigger
contentaria-busy'true' | undefined
contentaria-hidden!open || undefined
inputaria-activedescendantsearch-item 部件的 id | undefined
inputaria-autocomplete'list'
inputaria-controlssearch-list 部件的 id
inputaria-labeltranslations.searchInput
search-listaria-labeltranslations.searchList
search-listaria-multiselectable'true' | 'false'
search-listrole'listbox'
search-itemaria-checked'true' | 'mixed' | 'false' | undefined
search-itemaria-disabled'true' | 'false'
search-itemaria-selected'true' | 'false'
search-itemrole'option'
columnaria-disabled'true' | 'false'
columnaria-labeltranslations.column | undefined
columnaria-labelledbylabel 部件的 id value-text 部件的 id | item 部件的 id
columnaria-multiselectable'true' | 'false'
columnaria-orientation'vertical'
columnrole'listbox'
grouparia-labelledbygroup-label 部件的 id
grouprole'group'
itemaria-checked'true' | 'mixed' | 'false' | undefined
itemaria-disabled'true' | 'false'
itemaria-haspopup'listbox' | undefined
itemaria-selected'true' | 'false'
itemrole'option'
item-indicatoraria-hidden'true'
emptyrole'status'
loadingrole'status'

样式参考 ​

皮肤 ​

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

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

数据属性 ​

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

部件属性值
rootdata-disabled''(条件成立时才出现)
rootdata-invalid''(条件成立时才出现)
rootdata-loading''(条件成立时才出现)
rootdata-readonly''(条件成立时才出现)
rootdata-sizeprops.size
rootdata-state'open' | 'closed'
rootdata-toneprops.tone
rootdata-variantprops.variant
labeldata-disabled''(条件成立时才出现)
controldata-disabled''(条件成立时才出现)
controldata-invalid''(条件成立时才出现)
controldata-readonly''(条件成立时才出现)
controldata-state'open' | 'closed'
controldata-variantprops.variant
controldata-xh-field-chrome''
controldata-xh-field-sizeprops.size
triggerdata-disabled''(条件成立时才出现)
triggerdata-invalid''(条件成立时才出现)
triggerdata-placeholder''(条件成立时才出现)
triggerdata-readonly''(条件成立时才出现)
triggerdata-state'open' | 'closed'
value-textdata-disabled''(条件成立时才出现)
value-textdata-placeholder''(条件成立时才出现)
indicatordata-clearable''(条件成立时才出现)
indicatordata-disabled''(条件成立时才出现)
indicatordata-state'open' | 'closed'
clear-triggerdata-pressed''(条件成立时才出现)
clear-triggerdata-xh-action-control''
clear-triggerdata-xh-action-display'has-value'
clear-triggerdata-xh-action-has-value''(条件成立时才出现)
clear-triggerdata-xh-action-profile'field-inset'
clear-triggerdata-xh-action-sizeprops.size
clear-triggerdata-xh-action-variant'ghost'
positionerdata-hidden''(条件成立时才出现)
positionerdata-placement定位引擎算出的实际落位
positionerdata-positioned''(条件成立时才出现)
positionerdata-sizeprops.size
positionerdata-state'open' | 'closed'
positionerdata-toneprops.tone
positionerdata-variantprops.variant
contentdata-empty''(条件成立时才出现)
contentdata-placement定位引擎算出的实际落位
contentdata-searching''(条件成立时才出现)
contentdata-state'open' | 'closed'
contentdata-xh-material'frosted'
search-listdata-empty''(条件成立时才出现)
search-itemdata-disabled''(条件成立时才出现)
search-itemdata-highlighted''(条件成立时才出现)
search-itemdata-pressed''(条件成立时才出现)
search-itemdata-state'checked' | 'indeterminate' | 'unchecked'
search-itemdata-toneundefined | metaOf(v)?.tone
search-itemdata-xh-collection-context'overlay'
search-itemdata-xh-collection-item''
search-itemdata-xh-collection-sizeprops.size
columndata-levelString(column.level)
columndata-state'open' | 'closed'
groupdata-disabled''(条件成立时才出现)
group-labeldata-disabled''(条件成立时才出现)
itemdata-branch''(条件成立时才出现)
itemdata-disabled''(条件成立时才出现)
itemdata-highlighted''(条件成立时才出现)
itemdata-in-path''(条件成立时才出现)
itemdata-levelString(meta.level) | undefined
itemdata-pressed''(条件成立时才出现)
itemdata-state'indeterminate' | 'checked' | 'unchecked'
itemdata-toneundefined | metaOf(v)?.tone
itemdata-xh-collection-context'overlay'
itemdata-xh-collection-item''
itemdata-xh-collection-sizeprops.size
item-textdata-disabled''(条件成立时才出现)
item-textdata-highlighted''(条件成立时才出现)
item-textdata-in-path''(条件成立时才出现)
item-textdata-state'indeterminate' | 'checked' | 'unchecked'
item-textdata-xh-collection-slot'text'
item-descriptiondata-disabled''(条件成立时才出现)
item-descriptiondata-highlighted''(条件成立时才出现)
item-descriptiondata-in-path''(条件成立时才出现)
item-descriptiondata-state'indeterminate' | 'checked' | 'unchecked'
item-descriptiondata-xh-collection-slot'description'
item-suffixdata-disabled''(条件成立时才出现)
item-suffixdata-highlighted''(条件成立时才出现)
item-suffixdata-in-path''(条件成立时才出现)
item-suffixdata-state'indeterminate' | 'checked' | 'unchecked'
item-suffixdata-xh-collection-slot'suffix'
item-indicatordata-disabled''(条件成立时才出现)
item-indicatordata-highlighted''(条件成立时才出现)
item-indicatordata-in-path''(条件成立时才出现)
item-indicatordata-state'indeterminate' | 'checked' | 'unchecked'
item-indicatordata-xh-collection-slot'indicator'
footerdata-state'open' | 'closed'

CSS 变量 ​

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

变量部件CSS 属性状态默认来源说明
--xh-cascader-action-bgclear-trigger--xh-ink-surface
background-color
default
xh-ink-surface
--xh-_action-variant-bg-restcascader 的 clear-trigger 部件 --xh-ink-surface、background-color 覆盖槽。
--xh-cascader-action-bg-activeclear-triggerbackground-colordisabled
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
pressed
--xh-_action-variant-bg-pressedcascader 的 clear-trigger 部件 background-color 覆盖槽。
--xh-cascader-action-bg-hoverclear-triggerbackground-colordisabled
hover
loading
not([data-disabled])
not([data-loading])
--xh-_action-variant-bg-hovercascader 的 clear-trigger 部件 background-color 覆盖槽。
--xh-cascader-action-fgclear-triggercolordefault--xh-fg-mutedcascader 的 clear-trigger 部件 color 覆盖槽。
--xh-cascader-action-fg-hoverclear-triggercolordisabled
hover
loading
not([data-disabled])
not([data-loading])
--xh-fg-defaultcascader 的 clear-trigger 部件 color 覆盖槽。
--xh-cascader-action-font-sizeclear-triggerfont-sizedefault--xh-text-secondary-sizecascader 的 clear-trigger 部件 font-size 覆盖槽。
--xh-cascader-action-radiusclear-triggerborder-radiusdefault--xh-shape-insetcascader 的 clear-trigger 部件 border-radius 覆盖槽。
--xh-cascader-action-sizeclear-triggerblock-size
inline-size
min-inline-size
default
xh-action-profile=field-inset
--xh-_action-profile-visual-sizecascader 的 clear-trigger 部件 block-size、inline-size、min-inline-size 覆盖槽。
--xh-cascader-branch-arrow-fgitembackground-colorbranch--xh-fg-subtlecascader 的 item 部件 background-color 覆盖槽。
--xh-cascader-branch-arrow-sizeitemblock-size
inline-size
branch--xh-control-indicator-sizecascader 的 item 部件 block-size、inline-size 覆盖槽。
--xh-cascader-column-dividercolumnborder-inline-startdefault--xh-material-frosted-separatorcascader 的 column 部件 border-inline-start 覆盖槽。
--xh-cascader-column-gapcolumngapdefault--xh-list-option-gapcascader 的 column 部件 gap 覆盖槽。
--xh-cascader-column-hcolumn
search-list
block-sizedefault--xh-viewport-h-smcascader 的 column、search-list 部件 block-size 覆盖槽。
--xh-cascader-column-min-wcolumn
empty
loading
min-inline-sizedefault7remcascader 的 column、empty、loading 部件 min-inline-size 覆盖槽。
--xh-cascader-column-pxcolumnpadding-inlinedefault--xh-space-1cascader 的 column 部件 padding-inline 覆盖槽。
--xh-cascader-column-pycolumnpadding-blockdefault--xh-space-1cascader 的 column 部件 padding-block 覆盖槽。
--xh-cascader-content-backdropcontent-webkit-backdrop-filter
backdrop-filter
xh-material=frosted--xh-_material-backdropcascader 的 content 部件 -webkit-backdrop-filter、backdrop-filter 覆盖槽。
--xh-cascader-content-bgcontentbackgroundnot([data-xh-action-control])
xh-material=frosted
--xh-_material-bgcascader 的 content 部件 background 覆盖槽。
--xh-cascader-content-bordercontentbordernot([data-xh-action-control])
xh-material=frosted
--xh-_material-bordercascader 的 content 部件 border 覆盖槽。
--xh-cascader-content-fgcontentcolornot([data-xh-action-control])
xh-material=frosted
--xh-_material-fgcascader 的 content 部件 color 覆盖槽。
--xh-cascader-content-highlightcontentbackgroundnot([data-xh-action-control])
xh-material=frosted
--xh-_material-highlightcascader 的 content 部件 background 覆盖槽。
--xh-cascader-content-max-wcontentmax-inline-sizedefault--xh-overlay-max-w-xlcascader 的 content 部件 max-inline-size 覆盖槽。
--xh-cascader-content-radiuscontentborder-radiusdefault--xh-shape-overlaycascader 的 content 部件 border-radius 覆盖槽。
--xh-cascader-content-shadowcontentbox-shadownot([data-xh-action-control])
xh-material=frosted
--xh-_material-shadowcascader 的 content 部件 box-shadow 覆盖槽。
--xh-cascader-control-bgcontrolbackground-colorxh-field-chrome--xh-_field-variant-bg-restcascader 的 control 部件 background-color 覆盖槽。
--xh-cascader-control-bg-disabledcontrolbackground-colordisabled
xh-field-chrome
--xh-_field-variant-bg-disabledcascader 的 control 部件 background-color 覆盖槽。
--xh-cascader-control-bg-hovercontrolbackground-colordisabled
hover
invalid
loading
not([data-disabled])
not([data-invalid])
not([data-loading])
not([data-readonly])
readonly
xh-field-chrome
--xh-_field-variant-bg-hovercascader 的 control 部件 background-color 覆盖槽。
--xh-cascader-control-bg-readonlycontrolbackground-colorreadonly
xh-field-chrome
--xh-_field-variant-bg-read-onlycascader 的 control 部件 background-color 覆盖槽。
--xh-cascader-control-bordercontrolborderxh-field-chrome--xh-_field-variant-border-restcascader 的 control 部件 border 覆盖槽。
--xh-cascader-control-border-focuscontrolborder-colordisabled
focus-within
not([data-disabled])
xh-field-chrome
--xh-_field-variant-border-focuscascader 的 control 部件 border-color 覆盖槽。
--xh-cascader-control-border-hovercontrolborder-colordisabled
hover
invalid
loading
not([data-disabled])
not([data-invalid])
not([data-loading])
not([data-readonly])
readonly
xh-field-chrome
--xh-_field-variant-border-hovercascader 的 control 部件 border-color 覆盖槽。
--xh-cascader-control-border-invalidcontrolborder-colorinvalid
xh-field-chrome
--xh-_field-variant-border-invalidcascader 的 control 部件 border-color 覆盖槽。
--xh-cascader-control-fgcontrolcolorxh-field-chrome--xh-fg-defaultcascader 的 control 部件 color 覆盖槽。
--xh-cascader-control-gapcontrolgapxh-field-chrome--xh-_cascader-gapcascader 的 control 部件 gap 覆盖槽。
--xh-cascader-control-hcontrolblock-size
min-block-size
has([data-xh-field-input][data-xh-field-layout='multi-tag'])
has([data-xh-field-input][data-xh-field-layout='single-line'])
has([data-xh-field-input][data-xh-field-layout='textarea'])
xh-field-chrome
xh-field-input
xh-field-layout=multi-tag
xh-field-layout=single-line
xh-field-layout=textarea
--xh-_cascader-hcascader 的 control 部件 block-size、min-block-size 覆盖槽。
--xh-cascader-control-min-wcontrol
root
min-inline-sizedefault
xh-field-chrome
--xh-control-min-wcascader 的 control、root 部件 min-inline-size 覆盖槽。
--xh-cascader-control-pxcontrolpadding-inlinexh-field-chrome--xh-_cascader-pxcascader 的 control 部件 padding-inline 覆盖槽。
--xh-cascader-control-radiuscontrolborder-radiusxh-field-chrome--xh-shape-controlcascader 的 control 部件 border-radius 覆盖槽。
--xh-cascader-control-shadowcontrolbox-shadowxh-field-chromenonecascader 的 control 部件 box-shadow 覆盖槽。
--xh-cascader-control-wrootinline-size
min-inline-size
default--xh-control-wcascader 的 root 部件 inline-size、min-inline-size 覆盖槽。
--xh-cascader-empty-fgemptycolordefault--xh-material-frosted-fg-mutedcascader 的 empty 部件 color 覆盖槽。
--xh-cascader-empty-min-hemptymin-block-sizedefault5remcascader 的 empty 部件 min-block-size 覆盖槽。
--xh-cascader-empty-pemptypaddingdefault--xh-space-3cascader 的 empty 部件 padding 覆盖槽。
--xh-cascader-footer-borderfooterborder-block-startdefault--xh-border-subtlecascader 的 footer 部件 border-block-start 覆盖槽。
--xh-cascader-footer-fgfootercolordefault--xh-fg-mutedcascader 的 footer 部件 color 覆盖槽。
--xh-cascader-footer-font-sizefooterfont-sizedefault--xh-text-secondary-sizecascader 的 footer 部件 font-size 覆盖槽。
--xh-cascader-footer-gapfootergapdefault--xh-space-2cascader 的 footer 部件 gap 覆盖槽。
--xh-cascader-footer-pxfooterpadding-inlinedefault--xh-space-2cascader 的 footer 部件 padding-inline 覆盖槽。
--xh-cascader-footer-pyfooterpadding-blockdefault--xh-space-2cascader 的 footer 部件 padding-block 覆盖槽。
--xh-cascader-gaprootgapdefault--xh-space-1cascader 的 root 部件 gap 覆盖槽。
--xh-cascader-group-gapgroupgapdefault--xh-list-option-gapcascader 的 group 部件 gap 覆盖槽。
--xh-cascader-group-label-fggroup-labelcolordefault--xh-material-frosted-fg-mutedcascader 的 group-label 部件 color 覆盖槽。
--xh-cascader-group-label-font-sizegroup-labelfont-sizedefault--xh-text-caption-sizecascader 的 group-label 部件 font-size 覆盖槽。
--xh-cascader-group-label-font-weightgroup-labelfont-weightdefault--xh-font-weight-mediumcascader 的 group-label 部件 font-weight 覆盖槽。
--xh-cascader-group-label-pxgroup-labelpadding-inlinedefault--xh-_cascader-row-pxcascader 的 group-label 部件 padding-inline 覆盖槽。
--xh-cascader-group-label-pygroup-labelpadding-blockdefault--xh-space-1cascader 的 group-label 部件 padding-block 覆盖槽。
--xh-cascader-group-spacinggroupmargin-block-startdefault--xh-space-1_5cascader 的 group 部件 margin-block-start 覆盖槽。
--xh-cascader-icon-sizecontrol
item
positioner
root
--xh-icon-sizedefault
is([data-part='root'], [data-part='positioner'])
size=lg
size=sm
xh-field-chrome
--xh-_collection-glyph-size
--xh-_field-size-glyph-size
--xh-glyph-size-lg
--xh-glyph-size-md
--xh-glyph-size-sm
cascader 的 control、item、positioner、root 部件 --xh-icon-size 覆盖槽。
--xh-cascader-indicator-fgindicatorcolordefault--xh-fg-mutedcascader 的 indicator 部件 color 覆盖槽。
--xh-cascader-input-autofill-bginputbox-shadow-webkit-autofill
autofill
--xh-bg-surfacecascader 的 input 部件 box-shadow 覆盖槽。
--xh-cascader-input-autofill-fginput-webkit-text-fill-color-webkit-autofill
autofill
--xh-fg-defaultcascader 的 input 部件 -webkit-text-fill-color 覆盖槽。
--xh-cascader-input-font-sizeinputfont-sizedefault--xh-_cascader-font-sizecascader 的 input 部件 font-size 覆盖槽。
--xh-cascader-input-pxinputpadding-inlinedefault--xh-control-px-mdcascader 的 input 部件 padding-inline 覆盖槽。
--xh-cascader-input-pyinputpadding-blockdefault--xh-space-2cascader 的 input 部件 padding-block 覆盖槽。
--xh-cascader-item-active-font-weightitemfont-weightin-path--xh-font-weight-regularcascader 的 item 部件 font-weight 覆盖槽。
--xh-cascader-item-bg-activeitembackground-colorin-path--xh-bg-subtlecascader 的 item 部件 background-color 覆盖槽。
--xh-cascader-item-bg-hoveritem
search-item
background-colordisabled
error
highlighted
hover
is(:focus-visible, [data-highlighted])
is([aria-selected='true'], [data-selected])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
selected
xh-collection-context=overlay
--xh-bg-subtlecascader 的 item、search-item 部件 background-color 覆盖槽。
--xh-cascader-item-bg-presseditem
search-item
background-colordisabled
error
is(:active, [data-pressed])
is([aria-selected='true'], [data-selected])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
pressed
selected
xh-collection-context=overlay
--xh-bg-subtle-hovercascader 的 item、search-item 部件 background-color 覆盖槽。
--xh-cascader-item-check-fgitemcolordisabled
error
highlighted
hover
in-path
is(:active, [data-pressed])
is(:focus-visible, [data-highlighted])
is([aria-selected='true'], [data-selected])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
pressed
selected
state=checked
xh-collection-context=overlay
xh-collection-slot=indicator
--xh-cascader-item-indicator-fgcascader 的 item 部件 color 覆盖槽。
--xh-cascader-item-fgitem
search-item
colordefault
disabled
error
highlighted
hover
in-path
is(:active, [data-pressed])
is(:focus-visible, [data-highlighted])
is([aria-selected='true'], [data-selected])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
pressed
selected
xh-collection-context=overlay
--xh-material-frosted-fgcascader 的 item、search-item 部件 color 覆盖槽。
--xh-cascader-item-fg-selecteditem
search-item
colordisabled
error
highlighted
hover
is(:active, [data-pressed])
is(:focus-visible, [data-highlighted])
is([aria-selected='true'], [data-selected])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
pressed
selected
xh-collection-context=overlay
--xh-cascader-item-fgcascader 的 item、search-item 部件 color 覆盖槽。
--xh-cascader-item-font-sizeempty
item
search-item
font-sizedefault--xh-_cascader-font-sizecascader 的 empty、item、search-item 部件 font-size 覆盖槽。
--xh-cascader-item-font-weight-selecteditem
search-item
font-weightdisabled
error
highlighted
hover
is(:active, [data-pressed])
is(:focus-visible, [data-highlighted])
is([aria-selected='true'], [data-selected])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
pressed
selected
xh-collection-context=overlay
--xh-font-weight-regularcascader 的 item、search-item 部件 font-weight 覆盖槽。
--xh-cascader-item-gapitem
search-item
margin-inline-end
margin-inline-start
padding-inline-end
branch
default
xh-collection-slot=indicator
xh-collection-slot=prefix
xh-collection-slot=shortcut
xh-collection-slot=suffix
--xh-_cascader-gapcascader 的 item、search-item 部件 margin-inline-end、margin-inline-start、padding-inline-end 覆盖槽。
--xh-cascader-item-indicator-fgitem
search-item
background-color
color
default
disabled
error
highlighted
hover
in-path
is(:active, [data-pressed])
is(:focus-visible, [data-highlighted])
is([aria-selected='true'], [data-selected])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
pressed
selected
state=checked
xh-collection-context=overlay
xh-collection-slot=indicator
--xh-_cascader-accentcascader 的 item、search-item 部件 background-color、color 覆盖槽。
--xh-cascader-item-indicator-sizeitem-indicator
search-item
--xh-icon-size
block-size
inline-size
padding-inline-end
default--xh-control-indicator-sizecascader 的 item-indicator、search-item 部件 --xh-icon-size、block-size、inline-size、padding-inline-end 覆盖槽。
--xh-cascader-item-leadingitem
search-item
line-heightdefault--xh-leading-normalcascader 的 item、search-item 部件 line-height 覆盖槽。
--xh-cascader-item-max-witemmax-inline-sizedefault--xh-overlay-max-wcascader 的 item 部件 max-inline-size 覆盖槽。
--xh-cascader-item-pxitem
search-item
inset-inline-end
padding-inline
padding-inline-end
default--xh-_cascader-row-pxcascader 的 item、search-item 部件 inset-inline-end、padding-inline、padding-inline-end 覆盖槽。
--xh-cascader-item-pyitem
search-item
padding-blockdefault--xh-_cascader-row-pycascader 的 item、search-item 部件 padding-block 覆盖槽。
--xh-cascader-item-radiusitem
search-item
border-radiusdefault--xh-shape-controlcascader 的 item、search-item 部件 border-radius 覆盖槽。
--xh-cascader-label-fglabelcolordefault--xh-fg-defaultcascader 的 label 部件 color 覆盖槽。
--xh-cascader-label-fg-disabledlabelcolordisabled--xh-fg-subtlecascader 的 label 部件 color 覆盖槽。
--xh-cascader-label-font-sizelabelfont-sizedefault--xh-text-label-sizecascader 的 label 部件 font-size 覆盖槽。
--xh-cascader-label-font-weightlabelfont-weightdefault--xh-text-label-weightcascader 的 label 部件 font-weight 覆盖槽。
--xh-cascader-layerpositionerz-indexdefault--xh-_layercascader 的 positioner 部件 z-index 覆盖槽。
--xh-cascader-loading-fgloadingcolordefault--xh-material-frosted-fg-mutedcascader 的 loading 部件 color 覆盖槽。
--xh-cascader-loading-font-sizeloadingfont-sizedefault--xh-_cascader-font-sizecascader 的 loading 部件 font-size 覆盖槽。
--xh-cascader-loading-min-hloadingmin-block-sizedefault5remcascader 的 loading 部件 min-block-size 覆盖槽。
--xh-cascader-loading-min-wloadingmin-inline-sizedefault--xh-cascader-column-min-wcascader 的 loading 部件 min-inline-size 覆盖槽。
--xh-cascader-loading-ploadingpaddingdefault--xh-space-3cascader 的 loading 部件 padding 覆盖槽。
--xh-cascader-placeholder-fgvalue-textcolorplaceholder--xh-fg-subtlecascader 的 value-text 部件 color 覆盖槽。
--xh-cascader-search-dividerinputborder-block-enddefault--xh-material-frosted-separatorcascader 的 input 部件 border-block-end 覆盖槽。
--xh-cascader-search-list-gapsearch-listgapdefault--xh-list-option-gapcascader 的 search-list 部件 gap 覆盖槽。
--xh-cascader-search-psearch-listpaddingdefault--xh-space-1cascader 的 search-list 部件 padding 覆盖槽。
--xh-cascader-trigger-fgtriggercolordefault--xh-fg-defaultcascader 的 trigger 部件 color 覆盖槽。
--xh-cascader-trigger-font-sizetriggerfont-sizedefault--xh-_cascader-font-sizecascader 的 trigger 部件 font-size 覆盖槽。
--xh-cascader-trigger-gaptriggergapdefault--xh-_cascader-gapcascader 的 trigger 部件 gap 覆盖槽。

动效 ​

动效角色:按压 · 状态 · 切换 · 出现(锚定列表)(见动效规范)。

共享关键帧 xh-fade-in · xh-overlay-slide-in · xh-overlay-slide-out 由 family/motion.css 提供,皮肤 @import 它,单独引入仍成立;rotate 走 transition 过渡。时长与缓动读动效令牌,改令牌即改全局节奏。

皮肤之外还有一段:退场由适配器的退场闸门把关,动画播完才真收起。

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

RTL ​

皮肤用逻辑属性排布(inline-start 一族),dir="rtl" 下自动镜像;另有按 dir 分支的规则。

Released under The MIT License