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 Tips 使用DocumentFragment加快DOM渲染速度
Jun 28 Javascript
前后台交互过程中json格式如何解析以及如何生成
Dec 26 Javascript
jquery实现点击变换导航样式的方法
Aug 31 Javascript
jquery实现网页的页面平滑滚动效果代码
Nov 02 Javascript
JavaScript String 对象常用方法详解
May 13 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
Mar 10 Javascript
Vue.js组件间的循环引用方法示例
Dec 27 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
Jan 07 Javascript
js实现通过开始结束控制的计时器
Feb 25 Javascript
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
JS面向对象之多选框实现
Jan 17 Javascript
React冒泡和阻止冒泡的应用详解
Aug 18 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
PHP使用者状态管理功能的应用
2006/10/09 PHP
解析PHP中intval()等int转换时的意外异常情况
2013/06/21 PHP
基于php使用memcache存储session的详解
2013/06/25 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
高质量PHP代码的50个实用技巧必备(上)
2016/01/22 PHP
基于jQuery ligerUI实现分页样式
2016/09/18 Javascript
详谈for循环里面的break和continue语句
2017/07/20 Javascript
BootStrap Fileinput上传插件使用实例代码
2017/07/28 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
用js编写留言板
2020/03/17 Javascript
Python深入学习之装饰器
2014/08/31 Python
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
python使用pymysql实现操作mysql
2016/09/13 Python
Python实现 多进程导入CSV数据到 MySQL
2017/02/26 Python
Apache如何部署django项目
2017/05/21 Python
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
python MNIST手写识别数据调用API的方法
2018/08/08 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
2019/07/12 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
天猫国际进口超市直营:官方直采,一站购齐
2017/12/11 全球购物
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
日本著名的服饰鞋帽综合类购物网站:MAGASEEK
2019/01/09 全球购物
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
如何强制垃圾回收
2015/10/06 面试题
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
初中三好学生事迹材料
2014/01/13 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
工商企业管理应届生求职信
2014/05/04 职场文书
师范学院毕业生求职信
2014/06/24 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书