获取网页滚动的高度
自己平时写代码没有注意到这些,但是在看别人源码的时候,发现一段注释:pageYOffset has better support than scrollTop,于是突然来了兴趣,也搜索尝试一番,如下是自己的总结。
有四种方式来获取网页向上滚动的距离:
- window.scrollY
- window.pageYOffset
- document.body.scrollTop
- document.documentElement.scrollTop
scrollY与pageYOffset的兼容性
window.scrollY
返回文档在垂直方向上滚动的像素值。pageYOffset
是scrollY
属性的别名。两者是完全相等的:
window.scrollY === window.pageYOffset;
// true
window.scrollX === window.pageXOffset;
// true
在所有的浏览器中都有实现pageX/YOffset
属性,但scrollX/Y
不一定,所以,为了更好的兼容性,请用pageX/YOffset
替代scrollX/Y
。
在IE9以下IE浏览器中,scrollY
, scrollX
, pageYOffset
与pageXOffset
都不支持。
body.scrollTop与documentElement.scrollTop兼容性
在IE9以下的浏览器中,需要使用document.body.scrollTop与document.documentElement.scrollTop来替代。
但是这两者依然存在兼容性问题:
标准模式下(标准dtd声明):支持documentElement.scrollTop
,而body.scrollTop
为0(但是在safari下是反过来的)。
怪异模式下(非标准dtd或没有写):支持body.scrollTop
,但documentElement.scrollTop
值为0(这点safari表现一致)。
我们知道,在IE中,标准模式与怪异模式两者的盒模型是不一致的,标准模式下,盒模型和其他浏览器一致,但在怪异模式下大不相同,那么,如何判断当前是标准模式还是怪异模式呢?
var isCSS1Compat = document.compatMode == "CSS1Compat";
var y = isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop;
补充一点:compatMode指兼容模式,有两个取值,一个是CSS1Compat,表示标准兼容模式开启(标准模式),另一个是BackCompat,表示标准兼容模式关闭(怪异模式)。
兼容写法
所以为了兼容所有浏览器,需要用到如下简单兼容写法:
var x = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;
var y = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
或者,采用MDN的兼容写法:
var supportPageOffset = window.pageXOffset !== undefined;
var isCSS1Compat = ((document.compatMode || "") === "CSS1Compat");
var x = supportPageOffset ? window.pageXOffset : isCSS1Compat ? document.documentElement.scrollLeft : document.body.scrollLeft;
var y = supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?