解决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 相关文章推荐
漂亮的widgets,支持换肤和后期开发新皮肤
Apr 23 Javascript
Tips 带三角可关闭的文字提示
Oct 06 Javascript
解析John Resig Simple JavaScript Inheritance代码
Dec 03 Javascript
深入理解JavaScript是如何实现继承的
Dec 12 Javascript
JS中Eval解析JSON字符串的一个小问题
Feb 21 Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
Sep 19 Javascript
Node.js中.pfx后缀文件的处理方法
Mar 10 Javascript
vue实现2048小游戏功能思路详解
May 09 Javascript
基于Vue-Cli 打包自动生成/抽离相关配置文件的实现方法
Dec 09 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
Apr 14 Javascript
react+redux仿微信聊天界面
Jun 21 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
Sep 14 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使用for语句输出三角形的方法
2015/06/09 PHP
PHP获取文件行数的方法
2015/06/10 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
转一个日期输入控件,支持FF
2007/04/27 Javascript
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
ExtJS下grid的一些属性说明
2009/12/13 Javascript
Document对象内容集合(比较全)
2010/09/06 Javascript
jQuery点击后一组图片左右滑动的实现代码
2012/08/16 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
webpack构建换肤功能的思路详解
2017/11/27 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
python重试装饰器示例
2014/02/11 Python
Pycharm 设置默认头的图文教程
2019/01/17 Python
图文详解python安装Scrapy框架步骤
2019/05/20 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
html5的新增的标签和废除的标签简要概述
2013/02/20 HTML / CSS
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
医学生自我鉴定范文
2013/11/08 职场文书
播音主持女孩的自我评价分享
2013/11/20 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
行政人事专员岗位职责
2015/04/07 职场文书
师范生见习自我总结
2015/06/23 职场文书
高中地理教学反思
2016/02/19 职场文书
如何把新闻人物写得立体、鲜活?
2019/08/14 职场文书
MySQL约束超详解
2021/09/04 MySQL
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server