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 ...
随机推荐
- 手写Pascal解释器(一)
目录 一.编写解释器的动机 二.part1 三.part2 四.part3 一.编写解释器的动机 学习了Vue之后,我发现对字符串的处理对于编写一个程序框架来说是非常重要的,就拿Vue来说,我们使用该 ...
- 一张图带你搞懂Javascript原型链关系
在某天,我听了一个老师的公开课,一张图搞懂了原型链. 老师花两天时间理解.整理的,他讲了两个小时我们当时就听懂了. 今天我把他整理出来,分享给大家.也让我自己巩固加深一下. 就是这张图: 为了更好的图 ...
- 3D网页小实验-基于多线程和精灵动画实现RTS式单位行为
一.实验目的: 1.在上一篇的"RTS式单位控制"的基础上添加逻辑线程,为每个单位实现ai计算: 2.用精灵动画为单位的行为显示对应的动作效果. 二.运行效果: 1.场景中的单位分 ...
- 测试JUC安全类型的集合:CopyOnWriteArrayList
测试JUC安全类型的集合:CopyOnWriteArrayList 代码: package multithreading.TestSynchronized; import com.sun.xml.in ...
- [C++]-string类的常用操作
代码 #include<iostream> #include<string> #include<algorithm> using namespace std; in ...
- Linux中配置ftp传输
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- Python日志记录
官方文档:https://docs.python.org/2/library/logging.html logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为, ...
- MySQL05
SQL字段相关语句 添加字段 alter table 表名 add 字段名 数据类型 约束条件; 修改字段 alter table 表名 modify 字段 数据类型 约束条件; # modify只能 ...
- SQL 练习23
查询男生.女生人数 SELECT Ssex,COUNT(Ssex) 人数 from Student GROUP BY Ssex
- noip28
东方专场? T1 %%%WYZG 话说我考场上还想二维hash来着 考虑只记录弹幕中x的相对位置. 先选定弹幕一个点作为基准点(第一个出现的x即可),然后,枚举其他的x,记录下坐标差,然后去方格图中枚 ...