vue vue-router路由跳转后滚动条自动滚动到顶部

编程入门 行业动态 更新时间:2024-10-22 12:21:25

我们在写路由跳转的时候,通常会希望界面跳转后显示为滚动条滚动到我们想要的位置(顶部),一般使用Window.scrollTo() 方法,其语法为:

window.scrollTo(xpos, ypos)

xpos:必需。要在窗口文档显示区左上角显示的文档的 x 坐标。

ypos:必需。要在窗口文档显示区左上角显示的文档的 y 坐标。

例如滚动内容的坐标位置100,500:

window.scrollTo(100,500);

这个scrollTop这儿只是简单说一下,下面我们来看下vue-router中的滚动行为:

使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样。 vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动。

1、在创建一个 Router 实例时,可以提供一个 scrollBehavior方法:

const router = new VueRouter({
 routes: [...],
 scrollBehavior (to, from, savedPosition) {
   return { 期望滚动到的位置 }
 }
})

scrollBehavior 方法接收 to 和 from 路由对象。第三个参数 savedPosition 当且仅当 popstate 导航 (通过浏览器的 前进/后退 按钮触发) 时才可用。这个方法返回滚动位置的对象信息,长这样:

{ x: number, y: number }
{ selector: string, offset? : { x: number, y: number }} // offset 只在 2.6.0+ 支持

如果返回一个 falsy ( 注:falsy 不是 false )的值,或者是一个空对象,那么不会发生滚动。

举个栗子:

scrollBehavior (to, from, savedPosition) {
  return { x: 0, y: 0 }
}

对于所有路由导航,简单地让页面滚动到顶部。返回 savedPosition,在按下 后退/前进 按钮时,就会像浏览器的原生表现那样:

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

2、模拟『滚动到锚点』的行为:

scrollBehavior (to, from, savedPosition) {
  if (to.hash) {
    return {
      selector: to.hash
    }
  }
}

我们还可以利用路由元信息更加精准地控制滚动:

routes: [
  {
    path: '/',
    component: Home,
    meta: {
      scrollToTop: true
    }
  },
  {
    path: '/foo',
    component: Foo
  },
  {
    path: '/bar',
    component: Bar,
    meta: {
      scrollToTop: true
    }
  }
]

上个完整的栗子:

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const Home = { template: '<div>home</div>' }
const Foo = { template: '<div>foo</div>' }
const Bar = {
 template: `
  <div>
   bar
   <div style="height:500px"></div>
   <p id="anchor">Anchor</p>
  </div>
 `
}

// scrollBehavior:
// - 仅在 html5 history模式下可用
// - 默认为无滚动行为
// - 返回 false 以防止滚动

const scrollBehavior = (to, from, savedPosition) => {
 if (savedPosition) {
  // savedPosition仅可用于popstate导航。
  return savedPosition
 } else {
  const position = {}
  // 新的导航
  // 通过返回选择器滚动到锚点
  if (to.hash) {
   position.selector = to.hash
  }
  // 检查匹配的路由配置是否有需要滚动到顶部的元素
  if (to.matched.some(m => m.meta.scrollToTop)) {
   // cords will be used if no selector is provided,
   // or if the selector didn't match any element.
   position.x = 0
   position.y = 0
  }
  // 如果返回的位置是错误的或是空的对象,
  // 保留当前滚动位置
  return position
 }
}

const router = new VueRouter({
 mode: 'history',
 base: __dirname,
 scrollBehavior,
 routes: [
  { path: '/', component: Home, meta: { scrollToTop: true }},
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar, meta: { scrollToTop: true }}
 ]
})
 
new Vue({
 router,
 template: `
  <div id="app">
   <h1>Scroll Behavior</h1>
   <ul>
    <li><router-link to="/">/</router-link></li>
    <li><router-link to="/foo">/foo</router-link></li>
    <li><router-link to="/bar">/bar</router-link></li>
    <li><router-link to="/bar#anchor">/bar#anchor</router-link></li>
   </ul>
   <router-view class="view"></router-view>
  </div>
 `
}).$mount('#app')

3、在main.js入口文件通过路由守卫:

router.afterEach((to, from, next) => {
  window.scrollTo(0, 0);
})

enjoy it !!

更多推荐

vue vue-router路由跳转后滚动条自动滚动到顶部

本文发布于:2023-06-14 03:12:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1431163.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:跳转   路由   滚动条   vue   router

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!