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 ...
随机推荐
- java中 字符串的构造方法和直接创建
java.long.String类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现.(程序当中所有的双引号字符串,都是String类的对象[没 ...
- 判断状态栏是否显示以及获取状态栏高度的方法,及工具类列子【续:及OnGlobalLayoutListener的利用】
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0731/1640.html 本篇博客是http://www.cnblogs.co ...
- 这才是做了五年Android开发该有的样子!
程序员工作五年后一般怎样了? 五年程序员生涯对身体上的摧残就不说了,来讲讲一般会有怎样的状态吧! 优秀的一般是这样:有着明确的职业目标与规划,热爱技术,五年的工作沉淀,技术能力得到了飞速提升,每天依然 ...
- 堪称教科书级别的Android音视频入门进阶学习手册,开源分享!
概述 随着整个互联网的崛起,数据传递的形式也在不断升级变化,总的流行趋势如下: 纯文本的短信,QQ -> 空间,微博,朋友圈的图片文字结合 -> 微信语音 -> 各大直播软件 -&g ...
- git的实用命令(撤回,合并)
前言 在用开发项目的时候,经常会写着写着会发现写错的时候,人生没有后悔药,但是git有啊,大不了从头再来嘛. git的一些撤销操作 代码还没有存到暂存区 当我们修改了一个文件,还没有执行git add ...
- [TensorFow2.0]-MNIST手写数字识别
本人人工智能初学者,现在在学习TensorFlow2.0,对一些学习内容做一下笔记.笔记中,有些内容理解可能较为肤浅.有偏差等,各位在阅读时如有发现问题,请评论或者邮箱(右侧边栏有邮箱地址)提醒. 若 ...
- Python入门:ChainMap 有效管理多个上下文
摘要: Python的ChainMap从collections模块提供用于管理多个词典作为单个的有效工具. 本文分享自华为云社区<从零开始学python | ChainMap 有效管理多个上下文 ...
- CVE-2021-21972 vSphere Client RCE复现,附POC & EXP
漏洞简介 vSphere 是 VMware 推出的虚拟化平台套件,包含 ESXi.vCenter Server 等一系列的软件.其中 vCenter Server 为 ESXi 的控制中心,可从单一控 ...
- 单片机学习(八)点阵LED的使用
目录 一.点阵LED的理论知识 1. 点阵屏的打开方式 2. LED点阵简介 3. 点阵LED的结构和操作方式 4. 74HC595模块 PPT上的简介 串行转并行的工作原理 二.编码实现 1. C5 ...
- 线程 Thread类 GIL锁 信号量 Event事件
线程的开启方法 进程是操作系统调度的最小单位,一个进程最少有一个主线程,而一个进程中可以开启多个线程 from threading import Thread def task(): print('A ...