vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法


Posted in Javascript onNovember 28, 2017

有时候我们需要页面滚动条滚动到某一固定的位置,一般使用Window scrollTo() 方法。

语法就是:scrollTo(xpos,ypos)

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

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

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

window.scrollTo(100,500);

好了,这个scrollTop这儿只是简单介绍一下,下面我们介绍下veu-router中的滚动行为。

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

注意: 这个功能只在 HTML5 history 模式下可用。

当创建一个 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 }
 }
}

如果你要模拟『滚动到锚点』的行为:

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:
// - only available in html5 history mode
// - defaults to no scroll behavior
// - return false to prevent scroll
const scrollBehavior = (to, from, savedPosition) => {
 if (savedPosition) {
  // savedPosition is only available for popstate navigations.
  return savedPosition
 } else {
  const position = {}
  // new navigation.
  // scroll to anchor by returning the selector
  if (to.hash) {
   position.selector = to.hash
  }
  // check if any matched route config has meta that requires scrolling to top
  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
  }
  // if the returned position is falsy or an empty object,
  // will retain current scroll position.
  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')

在网上查了一下,网友说还可以试试在main.js入口文件配合vue-router写这个

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

总结

以上所述是小编给大家介绍的vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
使用JavaScript库还是自己写代码?
Jan 28 Javascript
javascript 事件绑定问题
Jan 01 Javascript
详解js实现线段交点的三种算法
Aug 09 Javascript
Linux CentOS系统下安装node.js与express的方法
Apr 01 Javascript
常见的浏览器Hack技巧整理
Jun 29 Javascript
vue使用axios跨域请求数据问题详解
Oct 18 Javascript
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
Aug 17 Javascript
JavaScript页面加载事件实例讲解
Sep 01 Javascript
vue路由切换之淡入淡出的简单实现
Oct 31 Javascript
基于node+vue实现简单的WebSocket聊天功能
Feb 01 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
Nov 09 Javascript
react项目从新建到部署的实现示例
Feb 19 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
Nov 28 #Javascript
vue-music关于Player播放器组件详解
Nov 28 #Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
Nov 28 #Javascript
JS实现的找零张数最小问题示例
Nov 28 #Javascript
JavaScript数据结构之单链表和循环链表
Nov 28 #Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
Nov 28 #Javascript
关于angularJs清除浏览器缓存的方法
Nov 28 #Javascript
You might like
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
php zip文件解压类代码
2009/12/02 PHP
php curl 伪造IP来源的实例代码
2012/11/01 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
浅谈js闭包理解
2019/04/01 Javascript
ES6学习笔记之let与const用法实例分析
2020/01/22 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
python实现稀疏矩阵示例代码
2017/06/09 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
2018/05/08 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
2020/12/28 Python
HTML5 实战PHP之Web页面表单设计
2011/10/09 HTML / CSS
全球知名旅游社区巴西站点:TripAdvisor巴西
2016/07/21 全球购物
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
澳大利亚优惠网站:Deals.com.au
2019/07/02 全球购物
What's the difference between Debug and Trace class? (Debug类与Trace类有什么区别)
2013/09/10 面试题
分公司经理岗位职责
2013/11/11 职场文书
英文简历中的自我评价用语
2013/12/09 职场文书
安全生产先进个人材料
2014/02/06 职场文书
幼儿园中班教师寄语
2014/04/03 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
幼儿园大班毕业评语
2014/12/31 职场文书
父母教会我观后感
2015/06/17 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
学习nginx基础知识
2021/09/04 Servers
CPU不支持Windows11系统怎么办
2021/11/21 数码科技
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python