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 入门教程 [翻译] 推荐
Aug 17 Javascript
理解Javascript_11_constructor实现原理
Oct 18 Javascript
THREE.JS入门教程(1)THREE.JS使用前了解
Jan 24 Javascript
借助javascript代码判断网页是静态还是伪静态
May 05 Javascript
js检测判断日期大于多少天的方法
May 04 Javascript
理解Javascript文件动态加载
Jan 29 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
Aug 31 Javascript
javascript构造函数以及原型对象的理解
Jan 13 Javascript
Vue项目中如何引入icon图标
Mar 28 Javascript
jQuery实现表单动态加减、ajax表单提交功能
Jun 08 jQuery
详解vue指令与$nextTick 操作DOM的不同之处
Aug 02 Javascript
React中Ref 的使用方法详解
Apr 28 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 面向对象实现代码
2009/11/11 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
mac下安装nginx和php
2013/11/04 PHP
php mb_substr()函数截取中文字符串应用示例
2014/07/29 PHP
php将图片保存入mysql数据库失败的解决方法
2014/12/27 PHP
PHP错误Warning:mysql_query()解决方法
2015/10/24 PHP
微信支付开发维权通知实例
2016/07/12 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
laravel实现批量更新多条记录的方法示例
2017/10/22 PHP
js的with语句使用方法
2007/09/21 Javascript
Javascript String.replace的妙用
2009/09/08 Javascript
jQuery遍历json中多个map的方法
2015/02/12 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解
2016/04/11 Javascript
通过BootStrap实现轮播图的实际应用
2016/09/26 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
checkbox在vue中的用法小结
2018/11/13 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
jquery实现购物车基本功能
2019/10/25 jQuery
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
JPype实现在python中调用JAVA的实例
2017/07/19 Python
TensorFlow 合并/连接数组的方法
2018/07/27 Python
Python 函数返回值的示例代码
2019/03/11 Python
关于python中remove的一些坑小结
2021/01/04 Python
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
N.Peal官网:来自伦敦的高档羊绒品牌
2018/10/29 全球购物
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
世界上最大的冷却器制造商:Igloo Coolers
2019/07/23 全球购物
网络工程专业毕业生推荐信
2013/10/28 职场文书
大一期末自我鉴定
2013/12/13 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
Spring中bean集合注入的方法详解
2022/07/07 Java/Android