解决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 语法基础 想学习js的朋友可以看看
Dec 16 Javascript
Js 获取Gridview选中行的内容操作步骤
Feb 05 Javascript
jquery ready(fn)事件使用介绍
Aug 21 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
Feb 11 Javascript
JavaScript中eval函数的问题
Jan 31 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
Aug 15 Javascript
轻松理解JavaScript闭包
Mar 14 Javascript
js微信应用场景之微信音乐相册案例分享
Aug 11 Javascript
jQuery插件DataTables分页开发心得体会
Aug 22 jQuery
Angular表格神器ui-grid应用详解
Sep 29 Javascript
解决Layui当中的导航条动态添加后渲染失败的问题
Sep 25 Javascript
基于vue和bootstrap实现简单留言板功能
May 30 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
SONY ICF-SW55的电路分析
2021/03/02 无线电
让你的网站首页自动选择语言转跳
2006/12/06 PHP
php递归调用删除数组空值元素的方法
2015/04/28 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
用js模拟JQuery的show与hide动画函数代码
2010/09/20 Javascript
jquery ui resizable bug解决方法
2010/10/26 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
JavaScript验证图片类型(扩展名)的函数分享
2014/05/05 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
jQuery中hover与mouseover和mouseout的区别分析
2015/12/24 Javascript
jQuery增加、删除及修改select option的方法
2016/08/19 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
python获取本机外网ip的方法
2015/04/15 Python
Python 基础教程之str和repr的详解
2017/08/20 Python
Python Logging 日志记录入门学习
2018/06/02 Python
python hash每次调用结果不同的原因
2019/11/21 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
Tensorflow 多线程设置方式
2020/02/06 Python
python实现俄罗斯方块小游戏
2020/04/24 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
Python爬虫实例——爬取美团美食数据
2020/07/15 Python
行政助理岗位职责
2013/11/10 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
道德之星事迹材料
2014/05/03 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
2015年学校团委工作总结
2015/05/26 职场文书
工作会议简报
2015/07/20 职场文书
2015年十月一日放假通知
2015/08/18 职场文书