解决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 相关文章推荐
jQuery第三课 修改元素属性及内容的代码
Mar 14 Javascript
浅析return false的正确使用
Nov 04 Javascript
详解JavaScript中的异常处理方法
Jun 16 Javascript
基于jQuery日历插件制作日历
Mar 11 Javascript
用原生js统计文本行数的简单示例
Aug 19 Javascript
Angular ElementRef简介及其使用
Oct 01 Javascript
ES6 系列之 Generator 的自动执行的方法示例
Oct 19 Javascript
JavaScript时间与时间戳的转换操作实例分析
Dec 07 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
Apr 19 Javascript
详解如何使用router-link对象方式传递参数?
May 02 Javascript
vue动态子组件的两种实现方式
Sep 01 Javascript
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
Apr 11 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
一个简易需要注册的留言版程序
2006/10/09 PHP
有关php运算符的知识大全
2011/11/03 PHP
PHP合并静态文件详解
2014/11/14 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
2016/11/14 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
2017/05/05 PHP
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
node.js中的path.normalize方法使用说明
2014/12/08 Javascript
javascript面向对象快速入门实例
2015/01/13 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
2016/07/04 Javascript
Javascript获取background属性中url的值
2016/10/17 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
2018/09/27 Javascript
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
[45:18]完美世界DOTA2联赛循环赛 PXG vs IO 第二场 11.06
2020/11/09 DOTA
详解Python函数作用域的LEGB顺序
2016/05/14 Python
Python利用ElementTree模块处理XML的方法详解
2017/08/31 Python
用Python写一个模拟qq聊天小程序的代码实例
2019/03/06 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
python全局变量引用与修改过程解析
2020/01/07 Python
TensorFlow梯度求解tf.gradients实例
2020/02/04 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
党员组织关系介绍信
2014/02/13 职场文书
物业管理毕业生的自我评价
2014/02/17 职场文书
护士求职信范文
2014/05/24 职场文书
目标责任书格式
2014/07/28 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
2016年大学迎新晚会工作总结
2015/10/15 职场文书
创业计划书之甜品店
2019/09/18 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
基于angular实现树形二级表格
2021/10/16 Javascript