当前位置: 首页 > news >正文

保存滚动位置的实现方法

文章目录

  • 前言
  • 一、让路由保存滚动条的位置
  • 二、创建方法监听滚动事件
  • 三、页面进入活跃打开监听并滚动到记录位置
  • 四、完善并优化


前言

有的时候从列表页面进入详情页面再返回列表页面,即使使用了keep-alive缓存列表页,也会导致列表页面你的滚动位置发生了变化。

这是由于两点问题造成的:

  1. 两个页面高度不一致导致页面跳转的时候滚动条位置发生了改变;
  2. keep-alive不会缓存滚动条的位置。

为了解决这个问题我们需要手动的保存列表页面的滚动条位置,并再切换回列表页面的时候滚动到保存的位置。


提示:以下是本篇文章正文内容,下面案例可供参考

一、让路由保存滚动条的位置

{
	name: 'home',
	component: () => import('@/views/home/index.vue'),
	meta: {
		title: '首页',
		keepAlive: true,
		scrollTop: 0,
	},
},

二、创建方法监听滚动事件

methods: {
	// 记录滚动距离
	scrollEvent() {
		this.$route.meta.scrollTop =
			document.documentElement.scrollTop || document.body.scrollTop
	},
},

三、页面进入活跃打开监听并滚动到记录位置

activated() {
	// 开启对于滚动事件的监听,需要要创建一个方法,以便销毁
	window.addEventListener('scroll', this.scrollEvent)
	// 页面进入活跃的时候滚动到保存的位置
	document.documentElement.scrollTop = this.$route.meta.scrollTop
	document.body.scrollTop = this.$route.meta.scrollTop
},

四、完善并优化

beforeRouteLeave(to, from, next) {
	// 为了节省资源,再离开页面的时候关闭对于scroll事件的监听
	window.removeEventListener('scroll', this.scrollEvent)
	next()
},
activated() {
	// 开启对于滚动事件的监听,需要要创建一个方法,以便销毁
	window.addEventListener('scroll', this.scrollEvent)
	// 页面进入活跃的时候滚动到保存的位置
	document.documentElement.scrollTop = this.$route.meta.scrollTop
	document.body.scrollTop = this.$route.meta.scrollTop
},
methods: {
	// 记录滚动距离
	scrollEvent() {
		this.$route.meta.scrollTop =
			document.documentElement.scrollTop || document.body.scrollTop
	},
},

PS:也可以在离开页面的时候保存滚动条的位置,但是博主在使用过程中发生过离开页面不记录的情况,所以使用了监听事件

相关文章:

  • 什么是数据库事务
  • 异步FIFO的原理及verilog实现(循环队列、读写域数据同步、Gray Code、空满标志、读写域元素计数)
  • 大数据_YARN的工作原理
  • anaconda,docker和Jupyter Notebook常见问题解答
  • 【Rust日报】2022-10-01 Rumqtt:基于rust的mqtt代理
  • STM32 GPIO模拟UART串口:外部时钟及TIM方式
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • 知识点17--如何将spring boot项目布置在外部tomcat中
  • 面向对象——抽象类
  • C++ 异常处理机制讲解
  • 【软考 - 高级系统架构设计师】考前冲刺计划 及 国庆作息时间
  • Typescript的数组类型
  • 【分治法】第k个数(快速选择算法,结合快速排序)
  • 西瓜书研读——第四章 决策树:ID3、C4.2、CSRT算法
  • aistudio 常规赛:钢铁缺陷检测挑战赛 经验总结,轻松复现map 47排名再度提升
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • HTML5新特性总结
  • JavaScript 一些 DOM 的知识点
  • java第三方包学习之lombok
  • vue 个人积累(使用工具,组件)
  • vuex 学习笔记 01
  • 闭包,sync使用细节
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 关于springcloud Gateway中的限流
  • 关于使用markdown的方法(引自CSDN教程)
  • 近期前端发展计划
  • 双管齐下,VMware的容器新战略
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 携程小程序初体验
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 组复制官方翻译九、Group Replication Technical Details
  • $().each和$.each的区别
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二)Linux——Linux常用指令
  • (二十四)Flask之flask-session组件
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (一)Thymeleaf用法——Thymeleaf简介
  • (状压dp)uva 10817 Headmaster's Headache
  • ***监测系统的构建(chkrootkit )
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .Net 8.0 新的变化
  • .NET Framework杂记
  • .net 使用ajax控件后如何调用前端脚本
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [2010-8-30]
  • [HeMIM]Cl,[AeMIM]Br,[CeEIM]Cl,([HO-PECH-MIM]Cl,[HOOC-PECH-MIM]Cl改性酚醛树脂
  • [iphone-cocos2d]关于Loading的若干处理和讨论