页首加了跳到主内容的链接,回车后地址栏多了 #main,页面也滚下去了,再按 Tab 焦点却从页首导航重新开始,等于白跳一次。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
<a href='#main' class='skip'>跳到主内容</a>
<main id='main' tabindex='-1'>…</main>
<script>document.querySelector('.skip').addEventListener('click', () => {
document.getElementById('main').focus()
})</script>
浏览器处理片段跳转时只滚动视口,是否移动焦点取决于目标能不能聚焦。main 元素默认不可聚焦,焦点就留在原来那个链接上。这一点先确认清楚,后面就不用反复试。
「跳转链接焦点」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
具体做法是,给正文容器加 tabindex 负一,让它能被脚本聚焦但不进 Tab 序列;跳转后主动调用 focus,别只依赖浏览器的默认滚动;聚焦时不要额外描边抢视觉,保留浏览器默认的焦点提示即可。
改完照着核一遍,按一次 Tab 出现跳转链接,回车后焦点落到正文开头,再按 Tab 进入正文第一个链接。
