尺寸很重要:为什么脚本会“破坏”布局
\n\n想象一下:你编写了一个完美的自适应网站,在自己的笔记本电脑上测试——一切运行流畅。但在客户的平板电脑上启动时——出现了错误。元素相互重叠,模态窗口移出屏幕边界,某个图库甚至根本无法打开。熟悉吗?
\n\n大多数情况下,问题的根源在于错误地获取了屏幕、浏览器窗口或页面本身的尺寸。Stack Overflow 上关于 "Get the size of the screen, current web page and browser window" 的问题获得了数十万次浏览。这并非偶然:即使是经验丰富的开发人员也会混淆 screen.width、window.innerWidth 和 document.documentElement.clientWidth。
在本文中,我们将分析新手(以及不仅仅是新手)在使用 JavaScript 处理尺寸时最常犯的 5 个错误。您将不仅获得理论知识,还会获得针对实际任务的现成、经过验证的解决方案。
\n\nJavaScript 中处理尺寸的五大错误
\n\n错误 #1:使用 screen.width 而不是 window.innerWidth
\n\n这是经典错误。开发人员想要获取视口(viewport)的宽度,于是编写:
\n\n// ❌ 错误\nconst viewportWidth = screen.width;\nconsole.log(viewportWidth); // 1920 (但这并不是 viewport!)\n\n\n问题出在哪里? screen.width 返回的是显示器的物理宽度(以像素为单位)。即使您缩小浏览器窗口或打开开发者工具,它也不会改变。而 window.innerWidth 是视口(viewport)的宽度,即窗口中显示内容的那部分。
这何时会破坏网站: 如果您根据 screen.width 计算自适应块,当打开 DevTools 或缩小窗口时,网站不会重新调整布局。用户要么看到空白,要么看到元素重叠。
// ✅ 正确\nconst viewportWidth = window.innerWidth;\nconsole.log(viewportWidth); // 当前可见区域的宽度\n\n\n错误 #2:忘记考虑滚动条
\n\n这是第二常见的陷阱。开发人员获取窗口高度并尝试将元素精确居中放置:
\n\n// ❌ 错误\nconst windowHeight = window.innerHeight;\nelement.style.top = windowHeight / 2 + 'px';\n\n\n乍一看似乎正确。但如果内容比屏幕长并且有滚动条,window.innerHeight 会包含滚动条的高度。结果,元素可能会“移出”可见区域的底部边界。
解决方案: 使用 document.documentElement.clientHeight——它返回不包含滚动条的视口高度。
// ✅ 在可见区域内定位的正确方法\nconst viewportHeight = document.documentElement.clientHeight;\nelement.style.top = viewportHeight / 2 + 'px';\n\n\n\n\n\n记住这个规则:
\nwindow.innerWidth/innerHeight——包含滚动条。document.documentElement.clientWidth/clientHeight——不包含滚动条。根据任务选择。
错误 #3:混淆窗口尺寸和页面尺寸
\n\n您想知道用户滚动了多少,并计算页面的总高度:
\n\n// ❌ 错误\nconst pageHeight = window.innerHeight;\nconsole.log(pageHeight); // 这不是页面高度!\n\n\nwindow.innerHeight 是窗口的高度,而不是文档的高度。要获取页面的完整高度(包括已滚动的部分),需要使用 document.documentElement.scrollHeight。
真实案例: 您正在制作无限滚动列表。如果使用 window.innerHeight 来确定加载新帖子的时机,脚本只会触发一次,之后就不再