业务场景

从列表跳转详情页,通过操作返回列表页时,滚动条仍然处于跳转前的高度,并加上 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)的更多相关文章

  1. jsp 页面跳转后修改数据,返回时不更新

    项目jsp页面上用隐藏input框接收获取数据,在跳转入另一页面前,js操作修改数据,但返回时发现无效. 需求是点击抽奖后机会减少一次,但是当做跳转操作后返回时,次数有缓存问题 jsp: <in ...

  2. vue 路由跳转记住滚动位置,返回时回到上次滚动位置

    参考:https://blog.csdn.net/qq_40204835/article/details/79853685 方法一: 利用Keep-Alive和监听器 1.首先在路由中引入需要的模块 ...

  3. 利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据

    利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据 实现描述:将数据存放在js对象中, 然后放在父页面的document对象中, 在页面刷新的时候将父页面的值取出来, ...

  4. js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码

    获取浏览器窗口的可视区域高度和宽度,滚动条高度有需要的朋友可参考一下.IE中,浏览器显示窗口大小只能以下获取: 代码如下复制代码 代码如下: document.body.offsetWidth doc ...

  5. javascript 获取滚动条高度+常用js页面宽度与高度

    /******************** * 取窗口滚动条高度  ******************/function getScrollTop(){    var scrollTop=0;    ...

  6. javascript 获取滚动条高度+常用js页面宽度与高度(转)

    /******************** *获取窗口滚动条高度 ******************/ function getScrollTop() { var scrollTop=0; if(d ...

  7. js基础--获取浏览器当前页面的滚动条高度的兼容写法

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 在开发中,兼容性问题是最常见的,今天就来介绍一下关于获取滚动条高度的兼容性写法,宽度同理,我在这里就不一一解释了 各浏览器 ...

  8. 关于js的页面高度和滚动条高度还有元素高度

    window.innerHeight    这是浏览器里面内容的高度,直接就是值,不需要其它操作; window.pageYOffset 这是滚动条到浏览器顶端的距离; $(元素).offset(). ...

  9. js,jquery 获取滚动条高度和位置, 元素距顶部距离

    一,获取滚动条高度和位置 jQuery 获取览器显示区域的高度: $(window).height();  获取浏览器显示区域的宽度:$(window).width(); 获取页面的文档高度:$(do ...

随机推荐

  1. C++利用模板在Windows上快速调用DLL函数

    更新日志 --------- 2021/08/01 更新V2.2 增加 GetHmodule 函数 - 允许用户获取HMODULE以验证加载DLL是否成功. 2021/08/03 更新V2.3 增加 ...

  2. Android开发失业50天,面了10家公司,唯二的offer也主动拒了

    最近在论坛看到这样一个帖子: 坐标深圳. 4 月上旬公司解散.(现在想想好像是假解散,真裁员) 这一个半月以来,从朋友内推,到拉勾.Boss 直聘,再到猎聘.智联招聘. 从开始的精准投递,到后来的海投 ...

  3. C++STL——vector类

    vector容器 1.1 vector容器的基本概念 Array 是静态空间,一旦配置了就不能改变,要换大一点或者小一 点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的 数据搬 ...

  4. OpenStack镜像制作笔记 --以windows8.1-amd64为例

    by hyc 目录 1.下载win8_64位的iso文件 2.下载对应电脑的vnc 3.下载Xshell软件 4.连接成功后,在Xshell下安装软件包 5.下载FileZilla Client软件 ...

  5. 初识MySQL,关系型数据库&非关系型数据库

    初识MySQL,关系型数据库&非关系型数据库 数据库的分类: 关系型数据库:(SQL) MySQL,Oracle,Sql Server,DB2,SQLlite 通过表和表之间,行和列之间的关系 ...

  6. Spring MVC+javamail实现邮件发送

    Spring MVC+javamail实现邮件发送 开启邮箱的POP3/SMTP服务(这里以QQ邮箱举例) 设置 --> 账户 -- > 开启POP3/STMP服务,然后得到一个授权码. ...

  7. eclipse选中参数高亮显示设置

    window - preference - java - Editor - Mark Occurrences

  8. [1.6W字] 浏览器跨域请求限制的详细原理分析&寻找一种最简单的方式实现XHR跨域(9种方法, 附大招可以纯前端实现跨域!)

    Title/ 浏览器跨域(CrossOrigin)请求的原理, 以及解决方案详细指南 #flight.Archives011 序: 最近看到又有一波新的创作活动了, 官方给出的话题中有一个" ...

  9. springboot项目中进行XSS过滤

    简单介绍 XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意 ...

  10. POI实现excel的导入导出

    引入依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</arti ...