解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法


Posted in Javascript onDecember 03, 2015

最近在做博客的目录功能,发现一个在现代浏览器间的一个bug,或是称之为差异,即页面滚动值(scrollTop)的获取与设定。

在此之前先说一下关于页面元素的坐标获取,这张图的经典性不必再提。

解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法

 实现滚动到某位置功能

一个最主要的功能就是实现点击标题页面滚动,因为我们要滚动到页面某个标题,所以需要计算出滚动这个元素的具体绝对位置,而常用的offsetTop是获取到当前元素与之最近的决定其定位的元素的偏移量,此处不适用。

此处应使用浏览器原生提供的 getBoundingClientRect 接口,此函数返回的是元素距离浏览器各边距的绝对位置,跟是什么定位类型的无关,非常适合制作页面滚动效果。 

获取滚动需要的数据, body 的 scrollTop 即页面已经被滚动所隐藏的高度,再根据上面提到的接口获取元素距离浏览器顶部的距离,可以算出需要的滚动的高度,关系图如下:

解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法遂,页面要滚动到的位置就是:

document.body.scrollTop+element.getBoundingClientRect().top;

这里顺带说下getBoundingClientRect().top 获取的元素在被滚动隐藏与非滚动时的区别:

解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法

 解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法

如上图可以看出,即使要滚动到的元素部分在浏览器边界外,获取到的top即为负数,遂计算出来的页面高度依然是正确的。

点击目录跳转的功能就做完了,至今为止都很完美。

FireFox与Chrome的scrollTop的兼容问题

直到我今天在FireFox测试时发现,火狐下页面滚动的跳转功能无法使用。

1、原生接口测试

解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法

这里先提一下:

解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法

 document.documentElement  即 <html> 元素,而 document.body  即  <body> 元素。

测试结果,在火狐上只能通过html元素来获取和设定页面滚动高度,而在谷歌上反之只能用body元素来获取和设定。

2、jquery接口测试

上面是使用原生的scrollTop属性来获取与设定,而jquery自己也实现了对scrollTop属性的封装,可以试试他的兼容性。

解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法

发现采用 $(document) 可以实现对获取和设定scrollTop的兼容,大喜。

3、scrollTop动画实现测试

虽然实现了兼容,但为了有更好的效果,我希望采用动画的方式滚动到页面的某位置,而不是直接跳转,这里采用jquery的 animate 函数来实现。

解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法

发现虽然可以采用$(document)来实现获取和设定,但动画效果都无法使用,还是只能用body元素和html元素来实现。

最终解决方案

遂最完美的实现方案是:

获取或直接设定当前页面滚动高度:

$(document).scrollTop();//获取,兼容火狐谷歌

有动画效果的设定当前页面高度:

$("body,html").animate({ scrollTop: ... });//动画滚动效果,兼容火狐谷歌

以上就是解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法,希望对大家的学习有所帮助。

Javascript 相关文章推荐
IE 上下滚动展示模仿Marquee机制
Dec 20 Javascript
通过Javascript创建一个选择文件的对话框代码
Jun 16 Javascript
jquery放大镜效果超漂亮噢
Nov 15 Javascript
关于javaScript注册click事件传递参数的不成功问题
Jul 18 Javascript
jQuery中ajax的post()方法用法实例
Dec 26 Javascript
JavaScript对数字的判断与处理实例分析
Feb 02 Javascript
JavaScript实现多个重叠层点击切换效果的方法
Apr 24 Javascript
在页面中输出当前客户端时间javascript实例代码
Mar 02 Javascript
详解Vuex中mapState的具体用法
Sep 28 Javascript
webpack中的热刷新与热加载的区别
Apr 09 Javascript
vue axios重复点击取消上一次请求封装的方法
Jun 19 Javascript
vue 更改连接后台的api示例
Nov 11 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
Dec 03 #Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
Dec 03 #Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
Dec 03 #Javascript
JS使用post提交的两种方式
Dec 03 #Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
Dec 03 #Javascript
五种js判断是否为整数类型方式
Dec 03 #Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
Dec 03 #Javascript
You might like
解析PHP中ob_start()函数的用法
2013/06/24 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
编写PHP脚本过滤用户上传的图片
2015/07/03 PHP
PHPstorm快捷键(分享)
2017/07/17 PHP
关于laravel框架中的常用目录路径函数
2019/10/23 PHP
JQuery 学习笔记 选择器之五
2009/07/23 Javascript
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
2016/03/06 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
详解package.json版本号规则
2019/08/01 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
2020/06/15 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
[02:48]DOTA2英雄基础教程 暗夜魔王
2013/12/12 DOTA
[01:08:33]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
Python3使用TCP编写一个简易的文件下载器功能
2019/05/08 Python
在win64上使用bypy进行百度网盘文件上传功能
2020/01/02 Python
Python语言异常处理测试过程解析
2020/01/08 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
解决tensorflow训练时内存持续增加并占满的问题
2020/01/19 Python
美体小铺加拿大官方网站:The Body Shop加拿大
2016/10/30 全球购物
c++工程师面试问题
2013/08/04 面试题
文秘大学生求职信
2014/02/25 职场文书
2014年端午节活动方案
2014/03/11 职场文书
2015年元旦文艺汇演主持词
2014/03/26 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技