Skip to content

Anchor 锚点 ​

滚动监听当前章节并自动高亮,点击锚点平滑滚动定位。支持指定滚动容器、点击落点偏移、多级嵌套、横向模式、吸附、轨道墨水条、样式变体与历史控制等能力。

基础用法 ​

scroll-container 指定局部滚动容器(选择器或元素 id):观察根与点击落点都以它为准;未设置时监听视口。

滚动监听(scroll-container)

第一章

第一节内容:用于演示滚动监听与高亮跟随。

第二章

滚动该容器时,左侧锚点自动高亮当前章节。

第三章

点击锚点可平滑滚动定位到对应章节。

高亮判定偏移与触发边界 ​

offset 控制高亮判定线(章节顶越检测线的提前量);bounds 是触发边界的额外提前量(默认 5),避免高亮切换抖动。

高亮判定偏移(offset / bounds)

第一章

offset 控制顶部高亮判定区的偏移量。

第二章

章节顶进入偏移线即切换高亮,比默认更早。

触发边界(bounds)

第一章

bounds 越大,章节顶越检测线的提前量越大。

第二章

默认 5px,这里调大到 40px 便于观察切换点差异。

点击事件 ​

oas-click 与 oas-change 分离:点击锚点派发 oas-click(detail: { href, item }),点击与滚动联动切换高亮都派发 oas-change(detail: { href, prevHref })——宿主想只响应用户操作时监听 oas-click 即可。

点击事件(oas-click / oas-change 分离)

第一章

点击左侧锚点:仅派发 oas-click;滚动该容器切换高亮:仅派发 oas-change。

第二章

oas-click 的 detail 含完整 item(href/title 等)。

尚未点击无 oas-click

受控高亮 ​

active 为受控属性:外部设置 / 移除 active 可直接控制当前高亮项(滚动监听仍会随滚动接管)。

受控 active

高亮第一章高亮第二章高亮第三章清除高亮

第一章

点击左侧按钮设置 active,锚点立即高亮对应项。

第二章

滚动该容器时,scroll spy 会接管高亮。

第三章

「清除高亮」移除 active,恢复无高亮状态。

点击落点偏移与对齐 ​

target-offset 控制点击后目标距容器顶的距离(避让固定头),未设置时回退 offset;block 控制落点对齐(start / center / end / nearest——nearest 目标已可见则不滚动、最小滚动量);duration 控制平滑滚动时长,animation="false" 或 duration="0" 立即定位。

点击落点(target-offset / block / duration / animation)

第一章

虚线标记 80px 落点线:点击后第一章顶对齐到虚线。

第二章

duration=500 平滑滚动约 500ms。

落点对齐(block)

第一章

block="center":目标章节垂直居中于容器。

第二章

点我试试居中落点效果。

最小滚动落点(block=nearest)

第一章

block="nearest":目标已完全可见则完全不滚动。

先点「第三章」滚到底,再点「第一章」——若第一章已可见则不发生滚动(最小滚动量)。

第二章

目标在容器下方时只滚到其底部刚可见。

第三章

目标在容器上方时只滚到其顶部刚可见。

立即定位(animation)

第一章

animation="false":点击后立即定位,无平滑过渡。

第二章

等价于 duration="0"。

嵌套层级与目标标记 ​

items 支持 children 多级嵌套(层级缩进展示,子项同样参与滚动高亮);<oas-anchor-target> 以组件方式标记滚动目标(id 同步到内部 part=target),替代手写标题 id;internal-scrollable 让锚点栏自身内部滚动。

嵌套层级(children / oas-anchor-target / internal-scrollable)

第一章

oas-anchor-target 包裹的标题作为滚动定位目标。

1.1 小节

子级锚点缩进展示,同样参与高亮判定。

1.2 小节

子级锚点缩进展示,同样参与高亮判定。

1.3 小节

子级锚点缩进展示,同样参与高亮判定。

1.4 小节

子级锚点缩进展示,同样参与高亮判定。

1.5 小节

子级锚点缩进展示,同样参与高亮判定。

第二章

internal-scrollable:锚点栏内容超高时自身滚动。

横向模式 ​

横向模式(direction=horizontal)

第一章

横向模式下锚点项水平排布,墨水条横向随动。

第二章

滚动容器观察高亮切换。

第三章

点击锚点同样定位到对应章节。

吸附 ​

affix 开启后锚点栏随滚动吸附(sticky 定位),affix-offset 控制吸附后距视口顶的距离;本 demo 锚点监听视口滚动。

吸附(affix / affix-offset)

第一章

向下滚动页面:左侧锚点栏吸附在视口顶部 16px 处。

第二章

页面滚动时高亮跟随当前章节。

第三章

配合固定头部导航时,affix-offset 避让固定头。

样式变体与尺寸 ​

样式变体与尺寸(variant / size)

default

underline

lineless

block

size=small

size=large

历史控制 ​

点击锚点默认更新 URL hash(history.pushState);replace 改用 replaceState 替换历史;hash="false" 完全不写历史。

历史控制(hash / replace)

第一章

三个锚点监听同一容器:默认 pushState、replace 替换历史、hash=false 不写。

第二章

点击第一列锚点查看 URL hash 变化。

尚未点击

自定义高亮 ​

get-current-anchor 指定自定义高亮策略:属性值为全局函数名,函数接收滚动算出的候选 href,返回实际应高亮 href;框架场景也可用 property getCurrentAnchor 传入函数。

自定义高亮(get-current-anchor)

第一章

无论滚动到哪,自定义策略都强制高亮第三章。

第二章

滚动时事件 detail.href 也来自自定义策略。

第三章

实际高亮项。

尚未滚动

外部链接 ​

锚点项设置 target(如 _blank)后不拦截默认行为,交由浏览器打开(自动补 rel="noopener noreferrer"),不参与滚动与高亮。

外部链接(item target)

子元素声明式通道 ​

除 items JSON 外,可用 <oas-anchor-item> 子元素声明式书写(items 属性显式设置时优先)。默认插槽文本为 title;属性对齐 AnchorItem 字段:href/target/target-offset;直接子 <oas-anchor-item> 递归为 children 多级嵌套(层级缩进,同样参与滚动高亮)。子元素增删、属性与文本变化会自动重渲染。

子元素基础

第一章第二章

第一章

用 oas-anchor-item 声明式书写锚点项;滚动联动高亮与 items 通道一致。

第二章

点击锚点平滑滚动定位到对应章节。

嵌套与属性(children / target-offset)

第一章 1.1 小节1.2 小节第二章

第一章

1.1 小节
1.2 小节

第二章

项级 `target-offset` 覆盖全局落点偏移;子项同样参与滚动高亮。

滚动到本节底部,左侧高亮会随滚动联动迁移。

点击左侧「第二章」可平滑滚动定位到本节。

内容撑高以演示滚动联动(容器 240px 高)。

再多一段文字确保溢出可滚。

API ​

oas-anchor ​

属性 ​

属性说明类型默认值
active当前高亮 href(受控:外部设置/清除立即生效;滚动联动接管后回写)string—
affix启用吸附(sticky 定位,随滚动视口/容器吸附)boolean—
affix-offset吸附时距滚动视口顶部的距离(px)string0
animation平滑滚动开关(默认 true;false 立即定位)stringtrue
block滚动落点对齐:start / center / end / nearest(目标已可见则不滚动,最小滚动量;在上方对齐顶部、在下方对齐底部)ScrollBlockstart
bounds触发边界(px,默认 5):章节顶越检测线的额外提前量,避免高亮抖动string5
direction布局方向:vertical / horizontalstringvertical
duration平滑滚动时长(ms,默认 300;0 立即定位)string300
get-current-anchor自定义高亮策略:属性指定全局函数名,接收滚动算出的候选 href,返回实际应高亮 href;亦可用 property getCurrentAnchor 传入函数((activeHref: string) => string) | null—
hash点击是否更新 URL hash(默认 true;false 关闭)stringtrue
internal-scrollable锚点栏自身内部滚动(max-height + overflow-y: auto)boolean—
items锚点项 JSON;项支持 children 多级嵌套、target(如 _blank)、targetOffset 项级落点偏移AnchorItem[] | string[]
offset高亮判定偏移(px):章节顶越检测线的提前量string0
replace历史控制:用 history.replaceState 替换历史而非 pushStateboolean—
scroll-container滚动容器选择器或元素 id;未设置时监听视口(window)HTMLElement | string | null—
size尺寸档位:small / medium / largestringmedium
target-offset点击定位落点偏移(px),避让固定头;未设置时回退 offset;项级 targetOffset 优先string—
variant样式变体:default(轨道+墨水条)/ underline(滑动下划线)/ lineless(无轴线)/ block(块状背景)stringdefault

事件 ​

事件说明
oas-change高亮切换(点击或滚动联动均派发),detail: { href, prevHref }
oas-click用户点击锚点项(与滚动联动的 oas-change 分离,宿主可只响应用户操作;外部链接 target 项同样派发),detail: { href, item }

oas-anchor-target ​

属性 ​

属性说明类型默认值
id目标标记 id:同步到内部 part=target 元素,锚点项以此为滚动定位目标——

插槽 ​

名称说明
默认被标记的目标内容(如多级标题)

oas-anchor-item ​

属性 ​

属性说明类型默认值
href锚点目标:#id(或外链地址;外链建议搭配 target)——
target链接 target(如 _blank):设置后不拦截默认行为,交由浏览器打开(自动补 rel="noopener noreferrer")——
target-offset项级点击落点偏移(px),优先于全局 target-offset;非法值忽略——

插槽 ​

名称说明
默认锚点项 title 内容(默认插槽文本;直接子 oas-anchor-item 不计入)

基于滚动容器(默认视口)的 scroll spy;点击平滑滚动定位;nav + aria-label="锚点导航",当前项 aria-current="true"。

基于 oas-anchor-target 的目标标记组件:包裹真实多级标题,作为锚点项滚动定位目标;默认插槽为被标记内容。

基于 MIT OR Apache-2.0 双许可发布