Vue Router-更改滚动中的锚点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue Router-更改滚动中的锚点相关的知识,希望对你有一定的参考价值。

我基本上是试图在我的站点上具有与此处相同的路由行为:https://router.vuejs.org/guide/#html。请注意,当您向下滚动时,链接更改为https://router.vuejs.org/guide/#javascript。向上滚动,反之亦然。重新加载页面时,您的位置将被保存。

我向路由器添加了以下滚动行为:

  scrollBehavior(to, from, savedPosition) {
    if (to.hash) {
        return { selector: to.hash }
    } else if (savedPosition) {
        return savedPosition;
    } else {
        return { x: 0, y: 0 }
    }

现在,我可以跳到具有链接的锚点,并且路线会更改。就我所知。具有讽刺意味的是,以Vue Router网站为例,但是无论如何-我该如何复制其行为?

答案

您可以设置一个IntersectionObserver并观察页面上的所有部分。当路段进入视图时,获取路段的ID并推送路线更改:

<div class="section" id="html">
  ...
</div>

<div class="section" id="javascript">
  ...
</div>
data () {
  return {
    sectionObserver: null
  }
},
mounted () {
  this.observeSections()
},
methods: {
  observeSections() {
    try {
      this.sectionObserver.disconnect()
    } catch (error) {}

    const options = {
      rootMargin: '0px 0px',
      threshold: 0
    }
    this.itemObserver = new IntersectionObserver(this.sectionObserverHandler, options)

    // Observe each section
    const sections = document.querySelectorAll('.section')
    sections.forEach(section => {
      this.itemObserver.observe(section)
    })
  },
  sectionObserverHandler (entries) {
    for (const entry of entries) {
      if (entry.isIntersecting) {
         // Push "entry.target.id" to router here 
      }
    }
  }
}

以上是关于Vue Router-更改滚动中的锚点的主要内容,如果未能解决你的问题,请参考以下文章

滚动到 iframe 中的锚点

React Router 浏览器历史推送和锚点

vue中的坑 --- 锚点与查询字符

是否有标准或首选标签类型可用于向某个位置添加额外的锚点/片段链接?

如何将 HTML 页面滚动到给定的锚点

使用带有 react-router 的锚点