跳转到内容

悬浮卡片 hover-card

反馈与浮层组件。三层同源:无头内核给出解剖与状态机,Vue 组件与自定义元素只是它的两层外壳,行为完全一致。

示例

基础用法

与 Tooltip 的分界在于卡片本体可交互:指针停在卡片上不收起,里面的链接与按钮都点得到

最近这批组件由
推上来。

延时

openDelay 默认 700ms,closeDelay 默认 300ms——那段收起等待正是留给指针从触发器走到卡片上的通行时间

受控

传了 open 就由宿主说了算;悬停与 Escape 都只发意图,最终写不写由外面这颗按钮同一份状态决定

当前:收起

尺寸

三档换的是卡片的内边距与字号,不写 size 即缺省档;把指针停在触发器上看差别

朝向与间距

placement 是请求值,空间不够时定位引擎会自动翻面;offset 调的是卡片与触发器的距离

禁用

disabled 只关掉卡片本身,触发器照样可点、可聚焦,也照样进不了展开等待

已点 0 次

产物

自定义元素<xh-hover-card>
Vue 组件XhHoverCardArrow XhHoverCardContent XhHoverCardPositioner XhHoverCardRoot XhHoverCardTrigger
组合式函数useHoverCard
状态机hoverCardMachine
皮肤@xihan-ui/styles/hover-card.css

解剖

部件名即 data-part 属性值,也是皮肤的选择器。加粗的是必备部件,不渲染它组件不工作(Web Components 适配器会在诊断通道上报 wc.missing-part)。

data-scope="hover-card"root · trigger · positioner · content · arrow

Props

属性类型必填说明
openboolean
defaultOpenboolean
placementPlacement请求的浮层朝向,默认 bottom;空间不足时由定位引擎避让。
offsetnumber浮层与锚点的间距(px)。
openDelaynumber悬停进入到展开的等待毫秒,默认 700。
closeDelaynumber指针离开 trigger 或 content 到收起的等待毫秒,默认 300。
dirDirection文字方向,仅在显式给出时写到根节点上。
disabledboolean只关掉卡片本身,不影响 trigger 元素自身的可用性。
sizeSize尺寸:sm / md / lg,决定卡片的内边距档位。
onOpenChange(details: HoverCardOpenChangeDetails) => voidopen 变化意图回调。

状态机

状态closed · opening · visible · visible.open · visible.closing

事件POINTER.ENTER · POINTER.LEAVE · FOCUS · BLUR · ESCAPE · OPEN · CLOSE · after.openDelay · after.closeDelay · CONTROLLED.OPEN · CONTROLLED.CLOSE

判据isOpenControlled · isDisabled · isFocusHeld

connect API

useHoverCard 产出的对象。getXxxProps() 铺到对应部件的宿主元素上,其余是可读状态与操作入口。

成员类型说明
openboolean
setOpen(next: boolean) => void
getRootProps() => T['element']
getTriggerProps() => T['button']
getPositionerProps() => T['element']
getContentProps() => T['element']
getArrowProps() => T['element']

键盘

规格出处:W3C APG

按键生效条件行为
Tab / Shift+Tabnot disabled焦点进入 trigger 立即展开、离开卡片即收起,都不走延时
Escape浮层可见(含收起等待期)立即收起,不等 closeDelay

Released under The MIT License