You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算桌面式滚动条是否显示(递归问题)

滚动条互相触发的判断难题

给定容器样式:

.container {
  width: 100px;
  height: 100px;
  overflow: auto;
}

原本预期是当内容宽度或高度超过100px时,才会出现对应方向的滚动条,但实际情况并非如此:如果内容宽度设为101px,水平滚动条会出现,而它会占用容器的可用高度,进而触发垂直滚动条。注意:此问题仅针对桌面端占用空间的滚动条,而非触摸设备上的叠加式滚动条。

示例代码

CSS

.container {
  width: 100px;
  height: 100px;
  overflow: auto;
  margin-bottom: 1em;
}

.content1 {
  width: 100px;
  height: 100px;
  background: green;
}

.content2 {
  width: 101px;
  height: 100px;
  background: green;
}

HTML

<div class="container">
  <div class="content1"></div>
</div>

<div class="container">
  <div class="content2"></div>
</div>

使用桌面端滚动条时,会看到仅内容宽度超出容器,却同时出现水平和垂直两个滚动条的现象。现在需要在不查询DOM的前提下,通过代码判断滚动条是否会显示,这是一个递归依赖的问题——垂直滚动条的存在会挤压水平方向的可用空间,反之亦然。

下面是一段错误的判断代码,因为垂直滚动条的判断结果会影响水平滚动条的判断,而水平滚动条的存在又会反过来影响垂直方向的可用高度:

const viewportWidth = 100
const viewportHeight = 100

const contentWidth = 101 // 超出容器宽度
const contentHeight = 100

const scrollbarSize = 16

// 错误逻辑:这里应该在hasHScroll为true时减去scrollbarSize
// 但hasHScroll的判断又依赖hasVScroll的结果
const hasVScroll = contentHeight > viewportHeight

const hasHScroll = contentWidth - (hasVScroll ? scrollbarSize : 0)

内容的提问来源于stack exchange,提问作者nanobar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:15:15