936 字
5 分钟

元素滚动事件和页面滚动事件

欢迎来到我的博客!#

使用 Markdown 格式编写。

今天学到了什么#

  • 元素滚动事件和页面滚动事件

image-20260209101007778

这是一个非常容易混淆的知识点!因为 clientoffsetscroll 这三个家族非常相似,但细节(比如包不包含边框、滚动条)又完全不同。

为了帮你理清思路,我先把 滚动事件 讲清楚,然后为你整理那张 核心属性对比表

一、 元素滚动事件 (scroll)#

1. 什么是滚动事件? 当用户滚动页面或某个容器时触发。千万注意:只有当内容超出容器高度,出现滚动条时,滚动事件才有意义。

2. 核心语法

document.documentElement.scrollTop
// 1. 监听整个页面的滚动 (最常用)
window.addEventListener('scroll', function() {
// 获取页面滚动了多少距离 (HTML文档向上卷去了多少)
const n = document.documentElement.scrollTop
console.log('页面滚走了:', n)
})
// 2. 监听某个具体盒子的滚动
const box = document.querySelector('.box')
box.addEventListener('scroll', function() {
console.log('盒子内部滚走了:', box.scrollTop)
})

二、 三大家族属性对比表 (Client / Offset / Scroll)#

这三大系列属性通常都是 只读 的(不能通过赋值来修改它们,除了 scrollTop/scrollLeft 是可写的)。

家族系列包含属性组成公式 (重点)作用/含义是否包含边框(Border)?是否包含滚动条?
offsetoffsetWidth
offsetHeight
内容 + padding + border“实际占地面积”
用于获取元素在页面中占据的真实宽高。
包含包含
clientclientWidth
clientHeight
内容 + padding“可视区域大小”
盒子内部你能看到的白色区域大小,不含边框。
❌ 不含❌ 不含
scrollscrollWidth
scrollHeight
内容 + padding + 溢出内容“实际内容大小”
如果内容很多被卷起来了,它是整个内容的真实高度。
❌ 不含❌ 不含

三、 属性详细图解与场景#

为了方便记忆,你可以这样理解它们的用途:

1. offset 系列 (定位与占位)#

  • 常用属性offsetWidth, offsetHeight, offsetLeft, offsetTop
  • offsetLeft / offsetTop:
    • 获取元素距离 带有定位父元素 的左/上侧距离。
    • 如果父级都没有定位,则以文档左上角为准。
    • 场景:我想知道这个元素在页面什么位置(比如做模态框定位、图片懒加载判断)。

2. client 系列 (可视区)#

  • 常用属性clientWidth, clientHeight, clientLeft (其实就是左边框宽度), clientTop (上边框宽度)
  • 场景
    • 获取浏览器窗口可视宽度的最常用方法:document.documentElement.clientWidth (响应式适配时常用)。
    • 只要你想知道“容器内部能装多少东西”,就用它。

3. scroll 系列 (滚动控制)#

  • 常用属性scrollWidth, scrollHeight, scrollTop, scrollLeft
  • scrollTop (最重要):
    • 这也是唯一一个“可读写”的属性
    • 读取:知道页面卷去了多少。
    • 写入 el.scrollTop = 0:让页面瞬间回到顶部。
  • 场景:页面滚动显示/隐藏侧边栏(如:当 scrollTop > 300 时显示“回到顶部”按钮)。

四、 快速记忆口诀#

  • offset (偏移/占位):连皮带肉(这种最粗糙,连边框都算进去,用来算位置)。
  • client (客户端/可视):去皮留肉(不要边框,只要里面能看的地方)。
  • scroll (滚动):虽然卷起来了,但依然是我的肉(包括看不见的溢出内容)。

五、 页面尺寸事件 (resize)#

最后补充一下你提到的页面尺寸事件:

// 当浏览器窗口大小发生变化时触发
window.addEventListener('resize', function() {
// 配合 clientWidth 获取当前屏幕宽度
let w = document.documentElement.clientWidth
console.log('当前屏幕宽度变为:', w)
})

这通常用来做移动端适配(rem布局)或响应式布局的JS处理。

赞助支持

如果这篇文章对你有帮助,欢迎赞助支持!

赞助
元素滚动事件和页面滚动事件
https://firefly.cuteleaf.cn/posts/study-everyday/2026-02-08今日学习-元素滚动事件和页面滚动事件/
作者
LJC
发布于
2026-02-08
许可协议
CC BY-NC-SA 4.0
最后更新于 2026-02-08,距今已过 40 天

部分内容可能已过时

目录