@xwink/ui

    ScrollRail

    右侧细轨 + 圆点指示整页滚动进度,章节化作轨上刻度,label 即页内导航。

    章节清单由宿主给(sections,id 要对应页面上同名元素),组件不去猜页面结构。显隐也归宿主:库组件不写 viewport 断点,窄屏要藏就传 class。

    vue
    <XScrollRail :sections="SECTIONS" class="hidden lg:block" />
    

    判定「当前章节」用的是视口中部的窄带(rootMargin 可调),避免相邻两屏同时命中。

    hash 的纠偏与过期清理内置了 useHashAnchor:跳完内容异步长高时把目标重新贴齐(alignHash 可关),hash 指向的目标整块滚出视口后清掉 hash(clearHash 可关)。hash 表达的是「点击刻度要去哪」的意图,用户自己滚走后意图即过期,留着只会让刷新跳回一个早已离开的位置;清掉后位置恢复由原生 scrollRestoration 接管,落点是精确像素而非章节顶部。过期按「目标整块离开视口」判而不是「当前章节不再是它」:比视口矮的节占不到窄带,按章节判会在刚跳到时就抹掉 hash。

    API

    Props

    名称类型默认值说明
    sections 必填 ScrollRailSection[]—章节清单,顺序即轨上刻度从上到下的顺序
    labelstring | undefined—无障碍名称,缺省「页面章节」
    rootMarginstring | undefined—判定「当前章节」的视口窄带,缺省取视口中部
    clearHashboolean | undefinedtrue用户自己滚走、hash 指向的目标整块离开视口后清掉 hash,缺省开启(判据见 useHashAnchor)
    alignHashboolean | undefinedtrue跳转后内容异步长高时把 hash 目标重新贴齐,缺省开启