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

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

当创建一个 Router 实例,你可以提供一个 scrollBehavior 方法:

  1. const router = new VueRouter({
  2. routes: [...],
  3. scrollBehavior (to, from, savedPosition) {
  4. // return 期望滚动到哪个的位置
  5. }
  6. })

scrollBehavior 方法接收 to 和 from 路由对象。第三个参数 savedPosition 当且仅当 popstate 导航 (通过浏览器的 前进/后退 按钮触发) 时才可用。

这个方法返回滚动位置的对象信息,长这样:

  • { x: number, y: number }
  • { selector: string, offset? : { x: number, y: number }} (offset 只在 2.6.0+ 支持)

如果返回一个 falsy (译者注:falsy 不是 false参考这里)的值,或者是一个空对象,那么不会发生滚动。

举例:

  1. scrollBehavior (to, from, savedPosition) {
  2. return { x: 0, y: 0 }
  3. }

对于所有路由导航,简单地让页面滚动到顶部。

返回 savedPosition,在按下 后退/前进 按钮时,就会像浏览器的原生表现那样:

  1. scrollBehavior (to, from, savedPosition) {
  2. if (savedPosition) {
  3. return savedPosition
  4. } else {
  5. return { x: 0, y: 0 }
  6. }
  7. }

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

  1. scrollBehavior (to, from, savedPosition) {
  2. if (to.hash) {
  3. return {
  4. selector: to.hash
  5. }
  6. }
  7. }

我们还可以利用路由元信息更细颗粒度地控制滚动。查看完整例子:

  1. const scrollBehavior = (to, from, savedPosition) => {
  2. if (savedPosition) {
  3. // savedPosition is only available for popstate navigations.
  4. return savedPosition
  5. } else {
  6. const position = {}
  7. // new navigation.
  8. // scroll to anchor by returning the selector
  9. if (to.hash) {
  10. position.selector = to.hash
  11. }
  12. // 如果meta中有scrollTop
  13. if (to.matched.some(m => m.meta.scrollToTop)) {
  14. // cords will be used if no selector is provided,
  15. // or if the selector didn't match any element.
  16. position.x = 0
  17. position.y = 0
  18. }
  19. // if the returned position is falsy or an empty object,
  20. // will retain current scroll position.
  21. return position
  22. }
  23. }

与keepAlive结合,如果keepAlive的话,保存停留的位置:

  1. scrollBehavior (to, from, savedPosition) {
  2. if (savedPosition) {
  3. return savedPosition
  4. } else {
  5. if (from.meta.keepAlive) {
  6.   from.meta.savedPosition = document.body.scrollTop;
  7. }
  8. return { x: 0, y: to.meta.savedPosition ||0}
  9. }
  10. }

ue路由中设置滚动行为(scrollBehavior)

责编:menVScode 2017-12-02 10:39 阅读(2579)

在文档页面(http://localhost:8080/document)拉动滚动条,然后刷新浏览器会发现滚动条依然在原来的位置,这是浏览器的默认行为,会记录浏览器滚动条默认位置。

但是点击浏览器“前进/后退”按钮,会发现当初那个页面的滚动条从0开始了,没有记录上一次滚动条的位置。现在要求点击浏览器“前进/后退”按钮,页面滚动条要记录上一次的位置,这时需要设置它的的滚动行为。

这时候需要在路由配置中设置 scrollBehavior(to,from,savePosition)函数,函数有三个参数。scrollBehavior() 函数在点击浏览器的“前进/后退”,或者切换导航的时候触发。

  1. scrollBehavior(to,from,savePosition){ // 在点击浏览器的“前进/后退”,或者切换导航的时候触发。
  2. console.log(to) // to:要进入的目标路由对象,到哪里去
  3. console.log(from) // from:离开的路由对象,哪里来
  4. console.log(savePosition) // savePosition:会记录滚动条的坐标,点击前进/后退的时候记录值{x:?,y:?}
  5. }

  

实现滚动行为的代码:router/index.js

  1. let router = new VueRouter({
  2. mode:'history',//默认是hash模式
  3. linkActiveClass:'menvscode-active',
  4. scrollBehavior(to,from,savePosition){ // 在点击浏览器的“前进/后退”,或者切换导航的时候触发。
  5. console.log(to) // to:要进入的目标路由对象,到哪里去
  6. console.log(from) // from:离开的路由对象,哪里来
  7. console.log(savePosition) // savePosition:会记录滚动条的坐标,点击前进/后退的时候记录值{x:?,y:?}
  8. if(savePosition) {
  9. return savePosition;
  10. }else{
  11. return {x:0,y:0}
  12. }
  13. },
  14. routes:[
  15. {
  16. path:'/',
  17. name:'index',
  18. component:Home,
  19. },
  20. {
  21. path:'/home',
  22. name:'Home',//name代表当前的路由
  23. component:Home,
  24. alias:'/index' //当访问'/index'的时候,就能匹配到当前的路由了。
  25. },
  26. {
  27. path:'/document',
  28. name:'Document',
  29. components:{ // 多个视图的时候,默认渲染default的视图。
  30. default:Document,
  31. slider:Slider,
  32. home:Home
  33. }
  34. }
  35. ]
  36. })
  37.  
  38. export default router

  

我们还可以设hash来控制滚动行为,定位到某一位置

  1. if(to.hash){ //先判断目标路由有没有hash值
  2. return {selector:to.hash}
  3. }

  

App.vue:在路径后面添加 hash 值。

  1. <template>
  2. <div id="app">
  3. <div class="nav-box">
  4. <ul class="f-cb">
  5. <li>
  6. <router-link to="/" exact tag="div" event="mouseover">home</router-link>
  7. </li>
  8. <li>
  9. <router-link :to="{path:'/document#abc'}" event="mouseover">document</router-link>
  10. </li>
  11. <router-link to="/about" tag="li" event="mouseover">
  12. <i></i>
  13. <span>about</span>
  14. </router-link>
  15. </ul>
  16. </div>
  17. <div class="content f-cb">
  18. <router-view name="slider"></router-view> <!-- 命名视图 -->
  19. <router-view class="center"></router-view>
  20. </div>
  21. </div>
  22. </template>

  

@/components/Document.vue

  1. <template>
  2. <div>
  3. 我是文档
  4. <p id="abc">定位到这个元素</p>
  5. </div>
  6. </template>

  

router/index.js

  1. let router = new VueRouter({
  2. mode:'history',//默认是hash模式
  3. linkActiveClass:'menvscode-active',
  4. scrollBehavior(to,from,savePosition){ // 在点击浏览器的“前进/后退”,或者切换导航的时候触发。
  5. console.log(to) // to:要进入的目标路由对象,到哪里去
  6. console.log(from) // from:离开的路由对象,哪里来
  7. console.log(savePosition) // savePosition:会记录滚动条的坐标,点击前进/后退的时候记录值{x:?,y:?}
  8. /*if(savePosition) {
  9. return savePosition;
  10. }else{
  11. return {x:0,y:0}
  12. }*/
  13. if(to.hash){ //先判断目标路由有没有hash值
  14. return {selector:to.hash}
  15. }
  16. },
  17. routes:[]
  18. })
  19.  
  20. export default router

  

vueRouter中scrollBehavior实现滚动固定位置的更多相关文章

  1. vue-router中scrollBehavior的巧妙用法

    问题:使用keep-alive标签后部分安卓机返回缓存页位置不精确问题 解决方案: <div id="app"> <keep-alive> <rout ...

  2. HTML中设置在浏览器中固定位置fixed定位

    之前的博文 HTML布局排版之制作个人网站的文章列表,中链接到的文章本身,也需要返回到列表主页,可在每个文章页面加导航条,也可以只加个返回到列表主页的链接.刚开始是想在博文最下方,加个返回文章列表的链 ...

  3. “Win10 UAP 开发系列”之 在MVVM模式中控制ListView滚动位置

    这个扩展属性从WP8.1就开始用了,主要是为了解决MVVM模式中无法直接控制ListView滚动位置的问题.比如在VM中刷新了数据,需要将View中的ListView滚动到顶部,ListView只有一 ...

  4. WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)

    原文:WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) 对于TreeView而言: TreeViewAut ...

  5. opencv、numpy中矩阵转置,矩阵内的固定位置相应的坐标变换

    opencv.numpy中矩阵转置,矩阵内的固定位置相应的坐标变换

  6. web前端开发中常用的尺寸和位置

    我们在日常web前端开发过程中,会经常用到各种尺寸和位置.通常是js做动画的时候.轮播图,滚屏动画,粒子,碰撞检测,拖拽,滚动加载等等.这里我将常用的尺寸和位置的获取进行总结,不包括canvas,SV ...

  7. 滚动固定TAB在顶部显示

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  8. 页面中的平滑滚动——smooth-scroll.js的使用

    正常的本页面锚链接跳转的时候跟PPT似的,特别生硬,用户体验非常差. 这时候我们就可以借助smooth-scroll.js这个插件,来实现本页面的平滑的跳转. 1首先,导入必须的JS文件 <sc ...

  9. Android RecyclerView 滚动到中间位置

    最近看到QQ音乐的歌词每次滑动后都可以滚回到中间位置.觉得甚是神奇,打开开发者模式显示布局,发现歌词部分不是采用 android 控件的写的,应该是前端写的.于是,我想,能不能用 recyclerVi ...

随机推荐

  1. Object的各种方法

    Object的一些知识点总结 1.hasOwnProperty obj.hasOwnProperty(prop) 参数 prop: 要检测的属性字符串名称或者Symbol 返回值 用来判断一个对象是否 ...

  2. ES6、7、8常用新特性总结(超实用)

    ES6常用新特性 1. let && const let 命令也用于变量声明,但是作用域为局部 { let a = 10; var b = 1; } 在函数外部可以获取到b,获取不到a ...

  3. 20145312 《Java程序设计》第10周学习总结

    20145312 <Java程序设计>第10周学习总结 学习总结 一. 什么是网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的 ...

  4. MR案例:基站相关01

    字段解释: product_no:用户手机号: lac_id:用户所在基站: start_time:用户在此基站的开始时间: staytime:用户在此基站的逗留时间. product_no lac_ ...

  5. [BZOJ1217]消防局的设立

    Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来 连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成 ...

  6. Elasticsearch之分词器的作用

    前提 什么是倒排索引? Analyzer(分词器)的作用是把一段文本中的词按一定规则进行切分.对应的是Analyzer类,这是一个抽象类,切分词的具体规则是由子类实现的,所以对于不同的语言,要用不同的 ...

  7. Permission denied: mod_fcgid

    [Tue Jun 16 13:29:08 2015] [warn] (13)Permission denied: mod_fcgid: spawn process /var/www/cgi-bin/g ...

  8. 秒懂算法2——选择排序(C#实现)

    算法思路: 每趟走访元素揪出一个最小(或最大)的元素,和相应位置的元素交换.(用数组{6,9,13,2,4,64} 举例) {},{6 9 13 [2] 4 64}     //第一趟,揪出2 {2} ...

  9. LA 5713 秦始皇修路

    https://vjudge.net/problem/UVALive-5713 题意: 秦朝有n个城市,需要修建一些道路使得任意两个城市之间都可以连通.道士徐福声称他可以用法术修路,不花钱,也不用劳动 ...

  10. vue-cli background iamge

    vue-cli 可以将图片直接放在项目生成的 static 文件夹里,然后在components里面直接采用绝对路径去取就可以了. 在根目录里面都会有一个static目录,这个是用来存放静态文件的,把 ...