跳转到内容

固钉 affix

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

示例

基础用法

滚过判定线就把内容钉在滚动容器可视区的上边;占位盒留在原位,页面不跳

往下滚,下面那条会钉在容器顶边。

我会钉在顶边

后面还有很长的内容,一直滚到底再滚回去。

让出吸顶栏

offset-top 把判定线往下挪,钉住后也在同一位置留出这段高度

吸顶栏

往下滚。

钉在吸顶栏下方 40px 处

后面还有很长的内容。

贴下边

给了 offset-bottom 就改贴可视区的下边,判定线也换到下边

这块工具条在滚到它之前就贴在容器底边,滚过去之后回到常规流。

共 42 项已选 3 项

下面是很长的列表内容。

监听吸附状态

affix-change 报吸住与松开;默认插槽也把 affixed 透出来

往下滚,下面的状态会跟着变。

在常规流里

后面还有很长的内容。

affix-change 最近一次报的是:松开

产物

自定义元素<xh-affix>
Vue 组件XhAffixContent XhAffixRoot
组合式函数useAffix
状态机affixMachine
皮肤@xihan-ui/styles/affix.css

解剖

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

data-scope="affix"root · content

Props

属性类型必填说明
offsetTopnumber吸住后距滚动容器可视区上边的距离(px)。
offsetBottomnumber吸住后距滚动容器可视区下边的距离(px);给了它就改贴下边。
onAffixChange(details: AffixChangeDetails) => void吸附状态变化回调。

状态机

状态released · affixed

事件SCROLL.RESOLVE

判据shouldAffix · shouldRelease

connect API

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

成员类型说明
affixedboolean此刻是不是吸住了。
getRootProps() => T['element']
getContentProps() => T['element']

键盘

规格出处:W3C APG

无键盘交互(不接收焦点,或焦点行为完全由原生元素提供)。

Released under The MIT License