跳转到内容

前端滚动锚点注意事项

刀刀
0字
0分钟
2026/8/16

何为锚点

锚点(Anchor)通常指 HTML 中的 <a> 元素,用于创建超链接,可链接到页面上其他位置或其他网页。

案例场景

  1. 从外部跳转到商品楼层页,根据 url 地址上的 query 参数,判断是否需要定位到某个指定楼层,来实现不同入口进入,定位到不同楼层
  2. 在页面中通过对应的按钮直接跳转到指定楼层

常见方案

scrollIntoView

将调用该方法的元素滚动到屏幕指定位置:中间、底部或顶部

  • 优点:方便,获取元素后直接调用
  • 缺点:难以精确控制,仅支持滚动到中间、顶部、底部,无法设置偏移
js
import { useRoute } from 'vue-router'
const { query } = useRoute()

const target = query.target

onMounted(() => {
  document.getElementById(target)?.scrollIntoView({
    behavior: 'smooth', // 平滑滚动
    block: 'start', // 滚动到顶部 start | center | end
  })
})
vue
<template>
  <button>美妆</button>
  <button>数码</button>
  <button>黄金</button>
  <button>家居</button>
  <button>美食</button>
  <div class="home" id="home">
    <div class="part" id="part1">美妆</div>
    <div class="part" id="part2">数码</div>
    <div class="part" id="part3">黄金</div>
    <div class="part" id="part4">家居</div>
    <div class="part" id="part5">美食</div>
  </div>
</template>

scrollTo

将可滚动元素滚动到指定 xy 坐标

  • 优点:可精确控制到具体像素
  • 缺点:需先获取 xy 坐标
js
import { useRoute } from 'vue-router'
const { query } = useRoute()

const target = query.target

onMounted(() => {
  const targetDom = document.getElementById(target)
  const targetRect = targetDom.getBoundingClientRect() // 获取元素相对于视口的位置
  document.getElementById('home').scrollTo(targetRect.x, targetRect.y - 100)
})
vue
<template>
  <button>美妆</button>
  <button>数码</button>
  <button>黄金</button>
  <button>家居</button>
  <button>美食</button>
  <div class="home" id="home">
    <div class="part" id="part1">美妆</div>
    <div class="part" id="part2">数码</div>
    <div class="part" id="part3">黄金</div>
    <div class="part" id="part4">家居</div>
    <div class="part" id="part5">美食</div>
  </div>
</template>

scrollBy

滚动指定 xy 距离,即滚动一定距离,不指定坐标。

  • 优点:仅做位移,而非滚动到指定元素
  • 缺点:需自行计算距离

老方法:a 锚点链接

html
<a href="#part1">美妆</a>

<div>
  <div id="part1">美妆</div>
  <div id="part2">数码</div>
  <div id="part3">黄金</div>
  <div id="part4">家居</div>
  <div id="part5">美食</div>
</div>

此方法仅支持页面级滚动,无法针对元素滚动,因此逐渐被淘汰。

注意事项

整体滚动与内部元素滚动有明显区别。页面 F5 刷新时,在 Vue/React 项目中页面滚动位置不变(准确来说是页面加载完成后滚回上一次位置)。而元素滚动不会,其滚动状态不会被记录,这也是滚动无效的常见原因。

注意以下要点:

  1. 若打开即滚动到指定位置,Vue/React 项目务必在页面数据渲染完成后执行滚动

  2. 若无请求,在 onMountedVue)或 useEffectReact)中执行滚动操作;页面级滚动可能还需加小延迟

    js
    onMounted(() => {
      setTimeout(() => {
        document.getElementById(target)?.scrollIntoView({
          behavior: 'smooth', // 平滑滚动
          block: 'start', // 滚动到顶部 start | center | end
        })
      }, 1000)
    })
  3. 若页面数据来自请求,确保数据渲染完成后执行滚动

    js
    onMounted(() => {
      nextTick(() => {
        document.getElementById(target)?.scrollIntoView({
          behavior: 'smooth', // 平滑滚动
          block: 'start', // 滚动到顶部 start | center | end
        })
      })
    })

贡献者

The avatar of contributor named as v_duyilin v_duyilin
The avatar of contributor named as duyidao duyidao
The avatar of contributor named as 刀刀 刀刀

页面历史

刀刀博客累计访客 人;文档累计访问量共