JS008. 跳转缓存滚动条高度并返回时过渡动画(window.pageYOffset & window.scrollTo & SessionStorage)
业务场景
从列表跳转详情页,通过操作返回列表页时,滚动条仍然处于跳转前的高度,并加上 ease-out 的过渡动画。
由于sessionStorage是随页面即关即消的,所以比起VUEX、localStorage、cookie更适合此应用场景
- 跳转页面标签执行事件 JSON.stringify(SessionStorage.setItem('key') 储存滚动条偏移量
- 生命周期加载页面或异步获取到数据后执行事件 JSON.parse(SessionStorage.getItem('key')) 作为函数实参
代码实现
/**
* 缓存滚动条动画
* @param offsetX, offsetY: scroll offset
* @param speed: inverse ratio
* @returns {Function}
* @constructor
*/
export const stayRoll = (offsetX, offsetY, speed) => {
let scrollY = 0
if (!speed) {
speed = 10
} else if (typeof speed === 'number' || typeof speed === 'string') {
speed = parseInt(speed)
} else {
throw '请设置正确的速度 Third arg. (支持数字String、十进制Number类型整数)'
} function rolling() {
if (scrollY < offsetY - 2) {
scrollY += (offsetY - scrollY) / speed
setTimeout(() => {
window.scrollTo(offsetX, scrollY)
rolling()
}, 18)
} else {
scrollY = 0
window.scrollTo(offsetX, offsetY)
}
}
setTimeout(() => {
rolling()
}, 100)
}
| 形参 |
offsetX (Number) |
offsetY (Number) |
speed (Number / String_number) |
| 描述 | 横向滚动偏移量 | 竖向滚动偏移量 |
过渡动画速度(反比) 可接收Number类型整数(十进制)、字符串类型整数 |
| 实例 | 0 | 300 | 12 |
进阶
应用场景不再仅限于从上至下,在单页面应用中可以将跳转后页面的滚动条记录下来,在跳转后页面滚动高度大于跳转前高度时,从下至上执行滚动过渡。
在真正单页面的应用场景时,只需要监听当前滚动条的偏移高度即可,不再用session存储。
/**
* 缓存滚动条动画
* @param offsetX, offsetY: scroll offset
* @param speed: inverse ratio
* @returns {Function}
* @constructor
*/
export const stayRoll = (offsetX, offsetY, speed) => {
let scrollY
if (!speed) {
speed = 10
} else if (typeof speed === 'number' || typeof speed === 'string') {
speed = parseInt(speed)
} else {
throw '请设置正确的速度 Third arg. (支持数字String、十进制Number类型整数)'
}
scrollY = offsetY[1] if (offsetY[0] < offsetY[1]) {
offsetY[0] += 2
function rolling() {
if (scrollY > offsetY[0] + 2) {
scrollY -= (scrollY - offsetY[0]) / speed
setTimeout(() => {
window.scrollTo(offsetX, scrollY)
rolling()
}, 18)
} else {
scrollY = 0
window.scrollTo(offsetX, offsetY[0])
}
} setTimeout(() => {
rolling()
}, 100)
} else {
offsetY[0] -= 2
function rolling() {
if (scrollY < offsetY[0] - 2) {
scrollY += (offsetY[0] - scrollY) / speed
setTimeout(() => {
window.scrollTo(offsetX, scrollY)
rolling()
}, 18)
} else {
scrollY = 0
window.scrollTo(offsetX, offsetY[0])
}
} setTimeout(() => {
rolling()
}, 100)
}
}
| 形参 |
offsetX (Number) |
offsetY (Array[Number, pageYOffset]) |
speed (Number / String_number) |
| 描述 | 横向滚动偏移量 | 竖向滚动偏移量数组 |
过渡动画速度(反比) 可接收Number类型整数(十进制)、字符串类型整数 |
| 实例 | 0 | [1000, window.pageYOffset] | 12 |
代码存在冗余,请酌情优化。
- END -
JS008. 跳转缓存滚动条高度并返回时过渡动画(window.pageYOffset & window.scrollTo & SessionStorage)的更多相关文章
- jsp 页面跳转后修改数据,返回时不更新
项目jsp页面上用隐藏input框接收获取数据,在跳转入另一页面前,js操作修改数据,但返回时发现无效. 需求是点击抽奖后机会减少一次,但是当做跳转操作后返回时,次数有缓存问题 jsp: <in ...
- vue 路由跳转记住滚动位置,返回时回到上次滚动位置
参考:https://blog.csdn.net/qq_40204835/article/details/79853685 方法一: 利用Keep-Alive和监听器 1.首先在路由中引入需要的模块 ...
- 利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据
利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据 实现描述:将数据存放在js对象中, 然后放在父页面的document对象中, 在页面刷新的时候将父页面的值取出来, ...
- js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
获取浏览器窗口的可视区域高度和宽度,滚动条高度有需要的朋友可参考一下.IE中,浏览器显示窗口大小只能以下获取: 代码如下复制代码 代码如下: document.body.offsetWidth doc ...
- javascript 获取滚动条高度+常用js页面宽度与高度
/******************** * 取窗口滚动条高度 ******************/function getScrollTop(){ var scrollTop=0; ...
- javascript 获取滚动条高度+常用js页面宽度与高度(转)
/******************** *获取窗口滚动条高度 ******************/ function getScrollTop() { var scrollTop=0; if(d ...
- js基础--获取浏览器当前页面的滚动条高度的兼容写法
欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 在开发中,兼容性问题是最常见的,今天就来介绍一下关于获取滚动条高度的兼容性写法,宽度同理,我在这里就不一一解释了 各浏览器 ...
- 关于js的页面高度和滚动条高度还有元素高度
window.innerHeight 这是浏览器里面内容的高度,直接就是值,不需要其它操作; window.pageYOffset 这是滚动条到浏览器顶端的距离; $(元素).offset(). ...
- js,jquery 获取滚动条高度和位置, 元素距顶部距离
一,获取滚动条高度和位置 jQuery 获取览器显示区域的高度: $(window).height(); 获取浏览器显示区域的宽度:$(window).width(); 获取页面的文档高度:$(do ...
随机推荐
- git合作开发流程
一.创建项目与管理 创建项目和管理项目都是管理账号需要做的事情,如果只是合作开发不进行管理,只需要浏览第二部分的内容即可. 1.创建项目 登录代码托管网站,点击添加项目,如下图所示: 填写相应的项目信 ...
- Centos配置网络和主机映射
目录 虚拟机网络的三种配置方式 配置虚拟机IP 主机映射问题 配置虚拟机的主机名 虚拟机远程登录 虚拟机网络的三种配置方式 桥接模式:当前虚拟机与主机在同一个局域网下,同一个局域网下的所有电脑都可以访 ...
- 线程的常用知识(包括 Thread/Executor/Lock-free/阻塞/并发/锁等)
本次内容列表: 1.使用线程的经验:设置名称.响应中断.使用ThreadLocal 2.Executor:ExecutorService和Future 3.阻塞队列:put和take.offer和po ...
- Go连接到Linux服务器进行操作-执行shell命令&&上传文件
Go连接到Linux服务器进行操作 使用密码连接Linux服务器 package main import ( "fmt" "golang.org/x/crypto/ssh ...
- Dubbo系列讲解之扩展点实现原理分析【2万字分享】
Apache Dubbo 是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力.这意味着,使用 Dubbo 开发的微服务,将具备相互之间的远程发现与通信能力, 同时利用 Dubbo ...
- 树莓派远程连接工具SSH使用教程
树莓派远程连接工具SSH使用教程 树莓派 背景故事 树莓派作为一款迷你小主机,大部分的使用场景都会用到远程调试,远程调试用到最多的方式一般就是VNC和SSH,SSH就是命令行型的远程方式,简单来说就是 ...
- DVWA靶场之SQL injection(blind)通关
盲注,顾名思义,无法从界面上直接查看到执行结果,一般的SQL注入基本绝迹,最多的就是盲注 基本步骤:(由于没有回显了,相比一般的SQL注入,也就不需要确定查询字段数.判断回显位置了) 判断注入类型 破 ...
- miniFTP项目实战二
项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...
- noip29
T1 以下的LIS代指最长不降子序列. 考场看到取模,便想到了之前写过的Medain,取模操作让序列分布均匀,对应到本题上,既然是求LIS,那它应该是有循环节的,后来打表证实确实是有. 然后,我码了个 ...
- Ubuntu完全卸载Docker步骤
Ubuntu完全卸载Docker步骤:https://www.jianshu.com/p/c03044dbeaaf