解决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 相关文章推荐
Extjs实现进度条的两种便捷方式
Sep 26 Javascript
给事件响应函数传参数的四种方式小结
Dec 05 Javascript
jQuery实现Tab菜单滚动切换的方法
Sep 21 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
Sep 23 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
Mar 31 Javascript
基于Bootstrap3表格插件和分页插件实例详解
May 17 Javascript
原生node.js案例--前后台交互
Feb 20 Javascript
微信小程序之数据缓存的实例详解
Sep 29 Javascript
vue使用iframe嵌入网页的示例代码
Jun 09 Javascript
vue使用canvas实现移动端手写签名
Sep 22 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
Sep 29 Javascript
解决vant title-active-color与title-inactive-color不生效问题
Nov 03 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
在线增减.htpasswd内的用户
2006/10/09 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
php把数组值转换成键的方法
2015/07/13 PHP
jQuery 入门讲解1
2009/04/15 Javascript
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
jQuery当鼠标悬停时放大图片的效果实例
2013/07/03 Javascript
js获取select选中的option的text示例代码
2013/12/19 Javascript
JS实现点击按钮自动增加一个单元格的方法
2015/03/09 Javascript
JavaScript实现重置表单(reset)的方法
2015/04/02 Javascript
javascript获取当前的时间戳的方法汇总
2015/07/26 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
2016/04/06 Javascript
jQuery插件AjaxFileUpload实现ajax文件上传
2016/05/05 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
详解在Vue中如何使用axios跨域访问数据
2017/07/07 Javascript
JavaScript设计模式之代理模式简单实例教程
2018/07/03 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
nodejs实现日志读取、日志查找及日志刷新的方法分析
2019/05/20 NodeJs
layui实现数据分页功能
2019/07/27 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
[00:57]辉夜杯战队访谈宣传片—VG
2015/12/25 DOTA
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
关于Keras Dense层整理
2020/05/21 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
Clarisonic美国官网:科莱丽声波洁面仪
2017/10/12 全球购物
EMPHASIS艾斐诗官网:周生生旗下原创精品珠宝品牌
2020/12/17 全球购物
服装销售人员求职自我评价
2013/09/26 职场文书
见习期自我鉴定
2013/11/07 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
2014年个人委托书范本
2014/10/13 职场文书
前台岗位职责
2015/02/13 职场文书
新年祝酒词大全
2015/08/11 职场文书
nginx共享内存的机制详解
2022/03/21 Servers
Python的property属性详细讲解
2022/04/11 Python
移除Selenium中window.navigator.webdriver值
2022/06/10 Python