解决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 相关文章推荐
在html页面中包含共享页面的方法
Oct 24 Javascript
(function($){...})(jQuery)的意思
Jul 22 Javascript
JS实现的一个简单的Autocomplete自动完成例子
Apr 16 Javascript
Javascript 函数parseInt()转换时出现bug问题
May 20 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
Jan 24 Javascript
javascript数组随机排序实例分析
Jul 22 Javascript
js实现的动画导航菜单效果代码
Sep 10 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
Apr 26 Javascript
JS实现的简单图片切换功能示例【测试可用】
Feb 14 Javascript
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
Oct 26 Javascript
浅谈Node新版本13.2.0正式支持ES Modules特性
Nov 25 Javascript
JavaScript实现前端网页版倒计时
Mar 24 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
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
php实现将数据做成json的格式给前端使用
2018/08/21 PHP
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
基于jquery实现轮播特效
2016/04/22 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
2017/07/24 Javascript
webpack写jquery插件的环境配置
2017/12/21 jQuery
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
vue实现组件之间传值功能示例
2018/07/13 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
js实现可爱的气泡特效
2020/09/05 Javascript
详解实现vue的数据响应式原理
2021/01/20 Vue.js
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
使用python爬虫获取黄金价格的核心代码
2018/06/13 Python
python通过zabbix api获取主机
2018/09/17 Python
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
Python读取csv文件分隔符设置方法
2019/01/14 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
Django视图类型总结
2021/02/17 Python
Html5页面在微信端的分享的实现方法
2018/08/30 HTML / CSS
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
英国发展最快的在线超市之一:Click Marketplace
2021/02/15 全球购物
幼师自荐信
2013/10/26 职场文书
大学生军训广播稿
2014/01/24 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
房地产项目建议书
2014/03/12 职场文书
大学生安全责任书
2014/07/25 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
西岭雪山导游词
2015/02/06 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
七年级作文之雪景
2019/11/18 职场文书
Log4j.properties配置及其使用
2021/08/02 Java/Android
MySQL Innodb索引机制详细介绍
2021/11/23 MySQL