Pixiv - KiraraShss
936 字
5 分钟
元素滚动事件和页面滚动事件
欢迎来到我的博客!
使用 Markdown 格式编写。
今天学到了什么
- 元素滚动事件和页面滚动事件

这是一个非常容易混淆的知识点!因为 client、offset 和 scroll 这三个家族非常相似,但细节(比如包不包含边框、滚动条)又完全不同。
为了帮你理清思路,我先把 滚动事件 讲清楚,然后为你整理那张 核心属性对比表。
一、 元素滚动事件 (scroll)
1. 什么是滚动事件? 当用户滚动页面或某个容器时触发。千万注意:只有当内容超出容器高度,出现滚动条时,滚动事件才有意义。
2. 核心语法
// 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)? | 是否包含滚动条? |
|---|---|---|---|---|---|
| offset | offsetWidth offsetHeight | 内容 + padding + border | “实际占地面积”。 用于获取元素在页面中占据的真实宽高。 | ✅ 包含 | ✅ 包含 |
| client | clientWidth clientHeight | 内容 + padding | “可视区域大小”。 盒子内部你能看到的白色区域大小,不含边框。 | ❌ 不含 | ❌ 不含 |
| scroll | scrollWidth 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处理。
赞助支持
如果这篇文章对你有帮助,欢迎赞助支持!
最后更新于 2026-02-08,距今已过 40 天
部分内容可能已过时