解决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简单实现表格行间隔显示颜色并高亮显示
Nov 29 Javascript
jQuery中scrollLeft()方法用法实例
Jan 16 Javascript
jQuery ajax分页插件实例代码
Jan 27 Javascript
Bootstrap框架的学习教程详解(二)
Oct 18 Javascript
JS多文件上传的实例代码
Jan 11 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
Jul 12 Javascript
详解小程序input框失焦事件在提交事件前的处理
May 05 Javascript
详解JWT token心得与使用实例
Aug 02 Javascript
如何利用Node.js与JSON搭建简单的动态服务器
Jun 16 Javascript
JavaScript如何判断对象有某属性
Jul 03 Javascript
解决Can't find variable: SockJS vue项目的问题
Sep 22 Javascript
Vue+Element UI实现概要小弹窗的全过程
May 30 Vue.js
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
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
php miniBB中文乱码问题解决方法
2008/11/25 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
php获取ip及网址的简单方法(必看)
2017/04/01 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
javascript中input中readonly和disabled区别介绍
2012/10/23 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
jQuery中contents()方法用法实例
2015/01/08 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
详解Javascript继承的实现
2016/03/25 Javascript
js实现按座位号抽奖
2017/04/05 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
2019/06/20 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
[02:27]刀塔重生降临
2015/10/14 DOTA
Python编程中装饰器的使用示例解析
2016/06/20 Python
python中的lambda表达式用法详解
2016/06/22 Python
如何使用python进行pdf文件分割
2019/11/11 Python
Python新手学习装饰器
2020/06/04 Python
Python基于Webhook实现github自动化部署
2020/11/28 Python
法律专业自我鉴定
2013/10/03 职场文书
演讲稿怎么写
2014/01/07 职场文书
课外访万家心得体会
2014/09/03 职场文书
2014年学校领导班子对照检查材料
2014/09/19 职场文书
普通党员整改措施
2014/10/24 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
2015年小学数学教师个人工作总结
2015/05/25 职场文书
Django显示可视化图表的实践
2021/05/10 Python
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫
Python 中面向接口编程
2022/05/20 Python