解决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 相关文章推荐
JS版网站风格切换实例代码
Oct 06 Javascript
自己做的模拟模态对话框实现代码
May 23 Javascript
关于javascript模块加载技术的一些思考
Nov 28 Javascript
JavaScript 学习笔记之语句
Jan 14 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
Sep 06 Javascript
原生js实现addClass,removeClass,hasClass方法
Apr 27 Javascript
jQuery插件扩展实例【添加回调函数】
Nov 26 Javascript
详细AngularJs4的图片剪裁组件的实例
Jul 12 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
Aug 17 Javascript
jQuery事件委托代码实践详解
Jun 21 jQuery
node.js使用yargs处理命令行参数操作示例
Feb 11 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
Apr 09 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
调频问题解答
2021/03/01 无线电
针对初学PHP者的疑难问答(1)
2006/10/09 PHP
在命令行下运行PHP脚本[带参数]的方法
2010/01/22 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
php双层循环(九九乘法表)
2017/10/23 PHP
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
javascript的tab切换原理与效果实现方法
2015/01/10 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
2015/03/21 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
Vue.js第四天学习笔记(组件)
2016/12/02 Javascript
jquery submit()不能提交表单的解决方法
2017/04/24 jQuery
Vue数组更新及过滤排序功能
2017/08/10 Javascript
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
vue 开发企业微信整合案例分析
2019/12/02 Javascript
Tensorflow环境搭建的方法步骤
2018/02/07 Python
详解Python3 对象组合zip()和回退方式*zip
2019/05/15 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
浏览器实现移动端高性能css3动画(开启gpu加速)
2013/12/23 HTML / CSS
浅析CSS3 中的 transition,transform,translate之间区别和作用
2020/03/26 HTML / CSS
网络技术支持面试题
2013/04/22 面试题
营销主管自我评价怎么写
2013/09/19 职场文书
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
四年大学生活的自我评价范文
2014/02/07 职场文书
学校创先争优活动总结
2014/08/28 职场文书
企业投资意向书
2015/05/09 职场文书
2015年房产经纪人工作总结
2015/05/15 职场文书
2015年新农村建设工作总结
2015/05/22 职场文书
朋友聚会开场白
2015/06/01 职场文书
趣味运动会加油词
2015/07/18 职场文书
python基础详解之if循环语句
2021/04/24 Python