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入门教程(12) js对象化编程
Jan 31 Javascript
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
Jul 31 Javascript
JavaScript新窗口与子窗口传值详解
Feb 11 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
Feb 24 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
Apr 21 Javascript
angular实现spa单页面应用实例
Jul 10 Javascript
微信小程序之GET请求的实例详解
Sep 29 Javascript
Vuex实现计数器以及列表展示效果
Mar 10 Javascript
详解使用angular框架离线你的应用(pwa指南)
Jan 31 Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
Apr 26 Javascript
jquery实现Ajax请求的几种常见方式总结
May 28 jQuery
使用easyui从servlet传递json数据到前端页面的两种方法
Sep 05 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
文件上传程序的全部源码
2006/10/09 PHP
php开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
javascript脚本编程解决考试分数统计问题
2008/10/18 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
jquery判断元素的子元素是否存在的示例代码
2014/02/04 Javascript
jQuery淡入淡出元素让其效果更为生动
2014/09/01 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
JQuery基础语法小结
2015/02/27 Javascript
JavaScript实现添加、查找、删除元素
2015/07/02 Javascript
学习Angular中作用域需要注意的坑
2016/08/17 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
JS实现身份证输入框的输入效果
2017/08/21 Javascript
iView框架问题整理小结
2018/10/16 Javascript
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
Postman环境变量全局变量使用方法详解
2020/08/13 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
在Python中操作字典之update()方法的使用
2015/05/22 Python
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
django中ORM模型常用的字段的使用方法
2019/03/05 Python
Python流程控制常用工具详解
2020/02/24 Python
微软香港官网及网上商店:Microsoft HK
2016/09/01 全球购物
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
JD Sports西班牙:英国领先的运动服装公司
2020/01/06 全球购物
2013年保送生自荐信格式
2013/11/20 职场文书
部队万能检讨书
2014/02/20 职场文书
培训主管的职业生涯规划
2014/03/06 职场文书
党的群众路线教育实践活动个人承诺书
2014/05/22 职场文书
会计学自荐信
2014/06/03 职场文书
三好学生事迹材料
2014/12/24 职场文书
就业推荐表自我评价范文
2015/03/02 职场文书
销售员自我评价
2015/03/11 职场文书
Vue的过滤器你真了解吗
2022/02/24 Vue.js
浅谈Python中对象是如何被调用的
2022/04/06 Python