跳转到内容

引导 tour

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

示例

基础用法

steps 是唯一事实源,组件只按下标取用;每步的 target 是一个 CSS 选择器,高亮框与浮层都锚在它上面

筛选
导出

居中步

不写 target 的那一步不锚定任何元素:浮层居中、不画高亮框、也不出箭头,适合当开场白与收尾

收件箱
当前步:welcome

受控

传了 open 与 step 就由宿主说了算:内部不再自改,只发意图,浮层里的按钮与外面的进度读的是同一份状态

列表
详情
操作
open=false · step=0 · (未开始)

产物

自定义元素<xh-tour>
Vue 组件XhTourArrow XhTourBackdrop XhTourCloseTrigger XhTourContent XhTourDescription XhTourNextTrigger XhTourPositioner XhTourPrevTrigger XhTourProgressText XhTourRoot XhTourSkipTrigger XhTourSpotlight XhTourTitle
组合式函数useTour
状态机tourMachine
皮肤@xihan-ui/styles/tour.css

解剖

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

data-scope="tour"root · backdrop · spotlight · positioner · content · title · description · progress-text · prev-trigger · next-trigger · skip-trigger · close-trigger · arrow

Props

属性类型必填说明
stepsTourStep[]步骤清单。它同时是步序的上界与读屏"第 m 步,共 n 步"的分母。
stepnumber当前步序(0 起)。给定即受控:内部不再自改,只发 onStepChange。
defaultStepnumber非受控初值,默认 0。
openboolean
defaultOpenboolean
placementPlacement整份引导的首选放置位,默认 bottom;单步可用自己的 placement 覆盖。
dirDirection文字方向,缺省 ltr。只改写浮层在行内轴上 start 与 end 的落点。
offsetnumber浮层与目标的间距(px)。
closeOnEscapeboolean
closeOnInteractOutsideboolean层外交互关闭,默认 false:引导要退出得走 skip 或 close 这两个明确出口。
showBackdropboolean画遮罩,默认 true。
spotlightPaddingnumber高亮框在目标四周留出的空白(px),默认 8。
autoScrollboolean展开与换步时自动把目标滚进视口(nearest,已可见时不动),默认 true。
translationsPartial<TourTranslations>
onStepChange(details: TourStepChangeDetails) => void步序变化意图回调;受控时是唯一出口,非受控随内部写入一并通知。
onOpenChange(details: TourOpenChangeDetails) => voidopen 变化意图回调;受控时是唯一出口,非受控时随内部转移一并通知。
onComplete(details: TourCompleteDetails) => void末步再按"下一步":先发它,再按 onOpenChange 关闭。
onSkip(details: TourSkipDetails) => void用户主动放弃(skip-trigger 或 Escape):先发它,再按 onOpenChange 关闭。

状态机

状态open · closed

事件OPEN · CLOSE · STEP.SET · STEP.PREV · STEP.NEXT · SKIP · GEOMETRY.SYNC · CONTROLLED.OPEN · CONTROLLED.CLOSE

判据isOpenControlled · isLastStep · isLastStepOpenControlled

connect API

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

成员类型说明
openboolean
stepnumber当前步序,恒在 [0, count - 1] 内;清单为空时为 0。
countnumber
currentStepTourStep | null当前步的声明;清单为空时为 null。
firstStepboolean停在首步:上一步按钮据此禁用。
lastStepboolean停在末步:下一步按钮据此改文案("完成")。
anchoredboolean这一步锚定了页面元素:居中步为 false,此时不画高亮框也不出箭头。
progressTextstring"第 m 步,共 n 步"。作者没写 progress-text 的内容时由适配器填上。
setOpen(next: boolean) => void
setStep(next: number) => void直接跳到某一步;越界会被夹回 [0, count - 1]。
goToNextStep() => void末步再走一步 = 完成:先发 onComplete,再关闭。
goToPrevStep() => void
skip() => void放弃引导:先发 onSkip,再关闭。
remeasure() => void重量高亮框与浮层位置:目标节点被外部改动(换位、变尺寸)后调它校准。
getRootProps() => T['element']
getBackdropProps() => T['element']
getSpotlightProps() => T['element']
getPositionerProps() => T['element']
getContentProps() => T['element']
getTitleProps() => T['element']
getDescriptionProps() => T['element']
getProgressTextProps() => T['element']
getPrevTriggerProps() => T['button']
getNextTriggerProps() => T['button']
getSkipTriggerProps() => T['button']
getCloseTriggerProps() => T['button']
getArrowProps() => T['element']

键盘

规格出处:W3C APG

按键生效条件行为
Enter / Spaceopen 且焦点在 content 上(不在按钮等控件上)走到下一步;停在末步时完成引导并关闭
Escapeopen 且 closeOnEscape放弃引导(发 onSkip)并关闭
ArrowUp / ArrowDown / ArrowLeft / ArrowRightopen一概不接管:既不换步也不阻止默认行为,留给页面滚动与读屏浏览
Tab / Shift+Tabopen焦点陷在 content 内循环,跑出去会被拉回来

Released under The MIT License