解决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 相关文章推荐
javascript生成/解析dom的CDATA类型的字段的代码
Apr 22 Javascript
基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码(带平滑移动的效果)
May 24 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
Mar 02 Javascript
深入php面向对象、模式与实践
Feb 16 Javascript
jquery ztree异步搜索(搜叶子)实践
Feb 25 Javascript
AngularJs Understanding the Model Component
Sep 02 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
May 31 Javascript
vue控制多行文字展开收起的实现示例
Oct 11 Javascript
js实现转动骰子模型
Oct 24 Javascript
微信小程序实现手指拖动选项排序
Apr 22 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
Nov 06 Javascript
使用Ajax实现无刷新上传文件
Apr 12 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求两个文件的相对路径
2013/06/20 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
2015/11/19 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
2016/03/05 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
2014/04/15 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
2014/06/03 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
Nodejs异步回调的优雅处理方法
2014/09/25 NodeJs
深入浅析AngularJS和DataModel
2016/02/16 Javascript
AngularJS Phonecat实例讲解
2016/11/21 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
[01:00:14]DOTA2官方TI8总决赛纪录片 真视界True Sight
2019/01/16 DOTA
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
Pandas之排序函数sort_values()的实现
2019/07/09 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
FC-Moto美国:欧洲最大的摩托车服装和头盔商店之一
2019/08/24 全球购物
俄罗斯隐形眼镜和眼镜在线商店:Cronos
2020/06/02 全球购物
制定岗位职责的原则
2013/11/08 职场文书
日语专业毕业生自荐信
2013/11/11 职场文书
人事主管的岗位职责
2013/11/16 职场文书
歌唱比赛获奖感言
2014/01/21 职场文书
美术教学感言
2014/02/22 职场文书
操行评语大全
2014/04/30 职场文书
生产设备维护保养制度
2015/08/06 职场文书
Python3.10的一些新特性原理分析
2021/09/15 Python
python游戏开发之pygame实现接球小游戏
2022/04/22 Python
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers