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 ...
随机推荐
- 将几张图片合并为一张图片,返回byte数组
需求:通过url数组下载图片,再竖直合成一张新的图片,具体java代码如下 1 /** 2 * 竖直合并图片 3 * 4 * @param urls 5 * @return 6 */ 7 public ...
- 使用html2canvas.js将HTML生成图片
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 记录21.07.23 —— Vue.js基础(二)
Vue基础(二) 过滤器 过滤器作用 全局过滤器 输出结果 私有过滤器 输出结果 把其中一个做点修改 错误信息 自定义指令 全局自定义指令 私有自定义指令 钩子函数 注意:fond-weight是粗细 ...
- Linux下使用pure-ftpd建立匿名ftp访问
by 无若 (一)ubuntu14.04下使用pure-ftpd建立匿名ftp访问 1.安装apt-get install pure-ftpd 2.修改配置nano /etc/pure-ftpd/co ...
- Java 在PPT中插入OLE对象
PPT幻灯片中支持将文档作为OLE对象插入到PPT幻灯片指定位置,在幻灯片中可直接点击该对象,打开或编辑等.下面以插入Excel工作簿文档为例,介绍如何来插入到幻灯片. 程序运行环境 编译环境:I ...
- Python语言系列-04-高阶函数
闭包 #!/usr/bin/env python3 # author:Alnk(李成果) # 什么是闭包 # 1,闭包存在于函数中 # 2,闭包就是内层函数对外层函数(非全局变量)的引用 # 3,最内 ...
- Python语言系列-02-基础数据类型
格式化输出 #!/usr/bin/env python3 # author:Alnk(李成果) # 百分号% 格式化输出 name = input('姓名:') age = input('年龄:') ...
- 快速上手CH340N电路设计(CH340N USB转串口模块 USB Type-C接口 CH340系列芯片讲解)
一.上模块 二.功能分析 l 芯片:CH340N l 输入接口:USB.TYPE-C l 输出接口:TTL(5V\3.3V\GND\TX\RX) l 指示灯:电源.TX.RX ...
- VLAN-2 配置Trunk接口
一.实验拓扑图 二.实验编址 三.实验步骤 1.给对应的PC设置对应的IP和掩码还有接口,以及根据需要划分不同的vlan区域,再用文本标记出不同部门. 2.启动设备(全选) 3.首先用ping命令检查 ...
- SQL 练习2
查询同时存在" 01 "课程和" 02 "课程的情况 分析:分别先查询出包含有01课程和02课程 SELECT * from sc WHERE cid='01' ...