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 相关文章推荐
jquery api参考 visualjquery 中国线路 速度快
Nov 30 Javascript
iframe子页面获取父页面元素的方法
Nov 05 Javascript
JavaScript创建一个object对象并操作对象属性的用法
Mar 23 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
Jun 04 Javascript
jQuery实现点击关注和取消功能
Jul 03 jQuery
基于Vue实现拖拽功能
Jul 29 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
May 11 Javascript
node.js使用yargs处理命令行参数操作示例
Feb 11 Javascript
Vue 打包体积优化方案小结
May 20 Javascript
Angular利用HTTP POST下载流文件的步骤记录
Jul 26 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
Sep 21 Javascript
uniapp实现可以左右滑动导航栏
Oct 21 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
sony ICF-2010 拆解与改装
2021/03/02 无线电
咖啡知识 咖啡养豆要养多久 排气又是什么
2021/03/06 新手入门
php更新修改excel中的内容实例代码
2014/02/26 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
2015/05/13 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
php字符集转换
2017/01/23 PHP
Javascript 中介者模式实例
2009/12/16 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
2012/12/15 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
在IE8上JS实现combobox支持拼音检索功能
2016/05/23 Javascript
AngularJS 如何在控制台进行错误调试
2016/06/07 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
bootstrap datetimepicker实现秒钟选择下拉框
2017/01/05 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
2018/05/31 jQuery
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
Javascript删除数组里的某个元素
2019/02/28 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
2019/10/12 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
python文件操作之目录遍历实例分析
2015/05/20 Python
Python中强大的命令行库click入门教程
2016/12/26 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
python with提前退出遇到的坑与解决方案
2018/01/05 Python
python实现C4.5决策树算法
2018/08/29 Python
Python 最大概率法进行汉语切分的方法
2018/12/14 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
linux面试题参考答案(2)
2015/12/06 面试题
银行金融服务方案
2014/06/11 职场文书
小学课外阅读总结
2014/07/09 职场文书
法定代表人资格证明书
2014/09/11 职场文书
2015年度个人教学工作总结
2015/05/20 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
jdbc中自带MySQL 连接池实践示例
2022/07/23 MySQL