vue中关于滚动条的那点事

vue中关于滚动条的那点事

不知道你有没有遇到过这种情况,有时当页面切换时,滚动条不在页面的顶端。最近半路加入一个项目,就遇到这种情况。(若只是为了解决此问题,可直接翻到最下方)下面谈谈解决此问题的过程:

什么情况下会出现滚动条的缓存?

之前想要滚动条在页面跳转时被缓存,需要自己设定keep-alive,

<keep-alive v-if="$route.meta.keepAlive"> <router-view></router-view> </keep-alive> <router-view v-if="!$route.meta.keepAlive"></router-view>

并且需要在路由中设定meta属性

export default new Router({ routes: [ { path: 'http://www.likecs.com/', name: 'Hello', component: Hello, meta: { keepAlive: false // 不需要缓存 } }, { path: '/page1', name: 'Page1', component: Page1, meta: { keepAlive: true // 需要被缓存 } } ] })

在router的生命周期的钩子函数中获取当前滚动条位置,并将其存储起来

beforeRouteLeave(){ ...//获取滚动条位置,并将其存储 }

在进入路由之前获取存储位置

beforeRouteEnter(){ ...//获取滚动条位置,并将其赋值 document.body.scrollTop = ... }

但是在我的这个项目中并没有设置keep-alive。然后就找了度娘,度娘中的小伙伴给出了解决方案,就是在vue官方文档中vue-router中的 滚动行为,

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

对于所有路由导航,简单地让页面滚动到顶部。

返回 savedPosition,在按下 后退/前进 按钮时,就会像浏览器的原生表现那样:

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

如果你要模拟“滚动到锚点”的行为:

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

但是文档中明确表示,这个功能只在支持 history.pushState 的浏览器中可用。还有一个但是,也是vue官方文档的原话:vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。
也就是说,不能拿来就用。

这可如何是好???

(此处省略一万字。。。)

接下来就是此次的重点了。。。。

在尝尽各种能想到的办法之后,就忽然想到一个简单粗暴的解决方案,直接代码:

watch: { '$route' (to,from){ document.querySelector('.main').scrollTop = 0 //.main是本项目中overFlow:auto的盒子 } }

在写有的文中设置监听,当路由改变时重置滚动条高度。

总结一下:

首先要看一下是否有写keep-alive

找出设置overFlow:auto的元素

设置监听属性

小编不才,如有言语不当或表述不清,勿喷,
如言语有误,望路过大神指点,不胜感谢!!!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgzff.html