解决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 相关文章推荐
Web前端设计模式  制作漂亮的弹出层
Oct 29 Javascript
基于jquery的cookie的用法
Jan 10 Javascript
javascript算法学习(直接插入排序)
Apr 12 Javascript
jQuery之网页换肤实现代码
Apr 30 Javascript
使用apply方法实现javascript中的对象继承
Dec 16 Javascript
JavaScript中的getTime()方法使用详解
Jun 10 Javascript
详解WordPress开发中get_current_screen()函数的使用
Jan 11 Javascript
jQuery实现伪分页的方法分享
Feb 17 Javascript
ES6概念 Symbol toString()方法
Dec 25 Javascript
vue cli构建的项目中请求代理与项目打包问题
Feb 26 Javascript
在微信小程序中使用mqtt服务的方法
Dec 13 Javascript
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
Jul 17 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使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
作为PHP程序员你要知道的另外一种日志
2018/07/30 PHP
php校验公钥是否可用的实例方法
2019/09/17 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
JavaScript 变量命名规则
2009/09/23 Javascript
实测jquery data()如何存值
2013/08/18 Javascript
javascript中caller和callee详解
2015/08/10 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
AngularJS删除路由中的#符号的方法
2016/09/20 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
基于mpvue的小程序项目搭建的步骤
2018/05/22 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
[02:29]完美世界高校联赛上海赛区回顾
2015/12/15 DOTA
[02:00]DOTA2英雄COSPLAY闹市街头巡游助威2015国际邀请赛
2015/08/02 DOTA
浅谈pyhton学习中出现的各种问题(新手必看)
2017/05/17 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
2018/07/11 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
基于python2.7实现图形密码生成器的实例代码
2019/11/05 Python
Python时间差中seconds和total_seconds的区别详解
2019/12/26 Python
Python 如何定义匿名或内联函数
2020/08/01 Python
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
比较基础的php面试题及答案-编程题
2012/10/14 面试题
生物制药毕业生自荐信
2013/10/16 职场文书
环保建议书
2014/03/12 职场文书
出生公证书
2015/01/23 职场文书
三孔导游词
2015/02/05 职场文书
青涩记忆观后感
2015/06/18 职场文书
学生会部长竞选稿
2015/11/19 职场文书
求职信如何撰写?
2019/05/22 职场文书