广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >如何解决Vue页面固定滚动位置的问题
  • 824
分享到

如何解决Vue页面固定滚动位置的问题

2024-04-02 19:04:59 824人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关如何解决Vue页面固定滚动位置的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题描述:通常见于 列表页Li

这篇文章将为大家详细讲解有关如何解决Vue页面固定滚动位置的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

问题描述:

通常见于 列表页List -> 详情页Detail 的情况, 从列表的某一项x 进入到详情页, 再返回的时候, 希望列表的位置固定在x, 而不是回到顶部了.

vue-router 里面是有一个 scrollBehavior 的, 但是这个玩意只能在 history 模式下面使用, 而我用的 hash 模式.

所以我们要自己实现嘛, 思路简单:List 里面监听滚动, 记录滚动位置 pos, 从 Detail 返回到 List 里面的时候, 读取 pos.

 mounted () {
  // 读
  setTimeut(function(){
   document.body.scrollTop = parseInt(sessionStorage.getItem('pos'));
  }, 1000);
  // 存
  window.onscroll = function () {
   sessionStorage.setItem('pos', document.body.scrollTop);
  }
 }

遇见了一个问题:

每次返回 List, 都是直接滚动到顶部, 每次都是, 每次都是! 把 pos 打印出来, 发现是 0, 而不是我们所存的值. 日了, 明明切换之前还是的, 回来就不是了.

然后发现了路由每次切换都会触发 onscroll 事件, 日了狗, 为毛.我都没有滚动页面, 为什么会触发 onscroll 事件。

刚开始怀疑 hash 变化会导致 onscroll 事件的触发, 所以我就在浏览器里面手动输入了几个不存在的路由:

/foo
/bar

没有发现 scroll 被触发, 所以这个嫌疑排出.

然后怀疑 vue-router 里面是不是绑定了 scroll 事件, 没发现然后又想, 没绑定 scroll 事件, 那么修改 scrollTop 值会不会也触发 scroll 事件.

好吧还发现新知识点了:

scrollTop 值的改变, 的确会触发 scroll 事件.

那么我就想, 是不是 vue-router 里面存在修改 scrollTop 值的行为, 也没有发现.

然后我又想, 数据是动态渲染的, 所以是不是和元素的增删改查相关。

元素增加-> 页面高度变了 -> 页面高度变化, 也触发 scroll 事件?

所以我用 vue-cli 新建了项目, 放了两个没有增删改查的路由

然后日了狗的, 我看见从 foo -> bar -> foo, 的时候, foo的滚动条位置还在之前我滚动到的地方.

突然想起来浏览器是可以自己记录滚动条位置的.

是不是浏览器干的?

从详情页返回到列表页面, 列表会重新渲染, 时序大概是这样:
返回列表页 1
渲染页面   2

而浏览器恢复滚动条的位置的操作, 是在 1 和 2 之间, 这个时候就出问题了:如果你页面上面的数据都是渲染出来的, 浏览器就会发现:

页面的高度<=屏幕的高度, 不存在滚动条, 此时 document.body.scrollTop = 0;
所以会设置 document.body.scrollTop = 0
修改了 document.body.scrollTop 触发了 scroll 事件, scroll 里面又重写了 pos

等你数据渲染结束之后, 读到的就是 0了.

如果发现你页面高度大于屏幕高度, 但是页面高度是 n, 而 pos 的值是: n + x, 比当前页面的最大的 scrollTop 值还大, 这个时候, document.body.scrollTop 的值就会等于 n.
当你的数据渲染结束, 开始定位, 日了, 没定准.

所以我们要解决这个问题.

当然是想到了 keep-alive, 刚启用的时候, 发现的确不错. 但是同时也发现:

列表项目靠前的, 往返操作的定位都很准, 越往后越不行, 直接拉到底, 再返回发现定位到的一般都是第二个第三个列表项目.

所以这个就很有意思了, 我大概猜测了一下浏览器的滚动位置恢复行为:

当 hashchange 的时候。拿到当前页面的 document.body.scrollTop 值, 和自己存储的滚动条位置。二者取最小的值, 设置成当前的 document.body.scrollTop 的值, 当使用 keep-alive 的时候, 因为 hashchange 事件处理和页面渲染是并行的, 所以有时hashchange 拿到的 document 的高度是已经渲染过几个元素的高度, 这个就是为什么定不准的原因.

好吧, 现在的情况是:

keep-alive 定不准, 不可靠, 所以需要我们自己来重新定位.

ok, 1 先绑定 scroll 事件:

 var map = {};
 window.onscroll = function() {
  map[location.hash] = document.body.scrollTop;
 }

2 再屏蔽掉浏览器自动恢复滚动位置行为带来的影响

a 在 hashchange 时强制 document.body.scrollTop = 0

b 在 scroll 事件里面, 当 document.body.scrollTop = 0 的时候不做 存操作.

 var map = {};
 window.onhashchange = function() {
  document.body.scrollTop = 0;
 }
 window.onscroll = function() {
  if (document.body.scrollTop) {
   // 存
   map[location.hash] = document.body.scrollTop;
  } else {
   // 读
  }
 }

3 在读操作里面, 设置一个定时任务, 去判断 document.body.scrollTop 的值和你保存的位置是不是相同的

 var map = {};
 window.onhashchange = function() {
  document.body.scrollTop = 0;
 }
 window.onscroll = function() {
  if (document.body.scrollTop) {
   // 存
   map[location.hash] = document.body.scrollTop;
  } else {
   var timer = null;
   timer = setInterval(function(){
    if (document.body.scrollTop == map[location.hash]) {
     clearInterval(timer);
    } else {
     document.body.scrollTop = map[location.hash];
    }
   }, 20);
  }
 }

到这里实际上已经大体实现了, 返回恢复滚动条位置的功能, 而上面的代码需要更多的优化,

关于“如何解决Vue页面固定滚动位置的问题”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 如何解决Vue页面固定滚动位置的问题

本文链接: https://www.lsjlt.com/news/74370.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解决Vue页面固定滚动位置的问题
    这篇文章将为大家详细讲解有关如何解决Vue页面固定滚动位置的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题描述:通常见于 列表页Li...
    99+
    2022-10-19
  • 如何解决vue2.0路由切换后页面滚动位置不变BUG的问题
    这篇文章主要为大家展示了“如何解决vue2.0路由切换后页面滚动位置不变BUG的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决vue2.0路由切换后...
    99+
    2022-10-19
  • 如何解决IE6 position:fixed 固定定位问题
    这篇文章将为大家详细讲解有关如何解决IE6 position:fixed 固定定位问题,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。和大家重点讨论一下如何解...
    99+
    2022-10-19
  • 如何解决webapp页面滚动卡顿问题
    本篇文章给大家分享的是有关如何解决webapp页面滚动卡顿问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。addEventListener的useCapture参数基本概念:...
    99+
    2023-06-09
  • Vue滚动页面到指定位置的实现及避坑
    目录Vue滚动页面到指定位置方法1方法2方法3避坑指南滚动页面到一定距离后固定Vue滚动页面到指定位置 在Vue中,有三种方式可以实现H5页面滑动至指定位置 方法1 //先获取目标位...
    99+
    2022-11-13
  • vue中scroller如何返回页面记住滚动位置
    这篇文章主要为大家展示了“vue中scroller如何返回页面记住滚动位置”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中scroller如何返回页面记住...
    99+
    2022-10-19
  • 微信小程序如何解决自定义弹窗滚动与页面滚动冲突的问题
    这篇文章主要介绍微信小程序如何解决自定义弹窗滚动与页面滚动冲突的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下先看效果是否是自己需要的实现步骤:1.整个布局用作为根节...
    99+
    2022-10-19
  • web开发中如何解决移动端设置了overflow:hidden页面还会滚动的问题
    这篇文章主要为大家展示了“web开发中如何解决移动端设置了overflow:hidden页面还会滚动的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“web开...
    99+
    2022-10-19
  • 如何解决vue页面缓存问题
    这篇文章给大家分享的是有关如何解决vue页面缓存问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。比如有一个列表页面,然后列表每项都有一个详情,之前用vue1.x的时候,页面缓存...
    99+
    2022-10-19
  • 如何解决vue项目动态设置页面title及是否缓存页面的问题
    小编给大家分享一下如何解决vue项目动态设置页面title及是否缓存页面的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!跟传...
    99+
    2022-10-19
  • 如何解决uniapp首页滚动不流畅问题
    随着移动互联网的发展,App开发成为了一项广泛的技术需求。在开发 App 的过程中,UniApp 作为一种热门的开发框架,具有跨平台、高效、易用等优势,备受开发者们的青睐和喜爱。然而,在实际开发中,可能会遇到一些问题,比如本文所要探讨的 U...
    99+
    2023-05-14
  • 如何使用vue监听页面中某个div的滚动事件并判断滚动位置
    这篇文章主要介绍如何使用vue监听页面中某个div的滚动事件并判断滚动位置,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!  在开发中常常会遇到这样一个vue页面,页面分为左右两部分,左边是目录树,...
    99+
    2023-06-29
  • Dreamweaver页面如何制作悬浮在固定位置的导航
    小编给大家分享一下Dreamweaver页面如何制作悬浮在固定位置的导航,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!启动Dreamweaver,并新建一个htm...
    99+
    2023-06-08
  • vue跳转后页面置顶的问题怎么解决
    这篇文章主要介绍了vue跳转后页面置顶的问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue跳转后页面置顶的问题怎么解决文章都会有所收获,下面我们一起来看看吧。vue跳转后页面置顶今天测试指出我的项...
    99+
    2023-06-30
  • 如何解决vue页面加载闪烁的问题
    这篇文章主要介绍了如何解决vue页面加载闪烁的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。v-if 和 v-show 的区别v-if只...
    99+
    2022-10-19
  • vue如何实现返回上一页面时回到原先滚动的位置
    这篇文章主要为大家展示了“vue如何实现返回上一页面时回到原先滚动的位置”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何实现返回上一页面时回到原先滚动的...
    99+
    2022-10-19
  • JS如何实现页面滚动到关闭时的位置与不滚动效果
    这篇文章主要讲解了“JS如何实现页面滚动到关闭时的位置与不滚动效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS如何实现页面滚动到关闭时的位置与不滚动效果”吧!标题显而易见,要说两种情况...
    99+
    2023-06-30
  • css如何实现网页栏目左侧固定当滚动到底部时自动调整位置
    这篇文章给大家分享的是有关css如何实现网页栏目左侧固定当滚动到底部时自动调整位置 的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。预览地址:https://ovsexia.gitee.io/leftfixed/h...
    99+
    2023-06-08
  • 如何解决vue进入页面时不在顶部以及检测滚动返回顶部按钮的问题
    小编给大家分享一下如何解决vue进入页面时不在顶部以及检测滚动返回顶部按钮的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!这...
    99+
    2022-10-19
  • 如何解决vue this.$forceUpdate() 处理页面刷新问题
    这篇文章主要为大家展示了“如何解决vue this.$forceUpdate() 处理页面刷新问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决vue ...
    99+
    2022-10-19
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作