我们在写路由跳转的时候,通常会希望界面跳转后显示为滚动条滚动到我们想要的位置(顶部),一般使用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路由跳转后滚动条自动滚动到顶部
发布评论