GitHub 上有用户反馈:目录里有 1000 个文件,切到网格视图后看不到缩略图,只有一排排细横条;横条还能选中、双击预览、右键,就是看不清。
截图里每条横条之间的间距,刚好是网格的 gap(14px)加两条 1px 边框——卡片还在,只是高度被压成了几乎为 0。
复现条件
网格容器是这样的:
.grid {
flex: 1; /* 在纵向 flex 布局里撑满,高度是确定的 */
overflow-y: auto;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
gap: 14px;
align-content: start;
}
.card {
overflow: hidden; /* 让缩略图圆角不溢出 */
/* ... */
}
条目少的时候一切正常,条目一多(一屏放不下)就塌。
根因:滚动容器的自动最小尺寸是 0
CSS Grid 在给 auto 行定尺寸时,先用每个网格项的最小贡献值(minimum contribution)作为行的基础尺寸,再把剩余空间分给各行,直到达到它们的最大内容尺寸。
而规范里有一条:网格项的 min-height: auto 解析成"自动最小尺寸",但如果网格项本身是滚动容器(overflow 不是 visible),自动最小尺寸就是 0。overflow: hidden 也算滚动容器。
于是:
- 每张卡片的最小贡献值都是 0,所有
auto行的基础尺寸都是 0; - 容器高度是确定的(flex 撑满),剩余空间 = 容器高度 − 所有 gap;
- 这点空间被平均分给几十行,每行只分到一两个像素。
条目少的时候剩余空间足够大,每行都能长到内容高度,所以看不出问题;条目一多,行数 × gap 吃掉了大部分高度,分到每行的就只剩一条线了。
修复:一行
.grid {
grid-auto-rows: max-content;
}
让隐式行直接按内容高度排,不再参与"从 0 开始分剩余空间"的过程。超出容器的部分由 overflow-y: auto 正常滚动。卡片上的 overflow: hidden 保留,圆角裁剪不受影响。
另一种修法是给卡片加 min-height: min-content,把自动最小尺寸覆盖掉;但 grid-auto-rows 写在容器上,一处生效,也不怕以后新加的网格项忘了写。
同一个 issue 里的另两处"显示不全"
- 详情抽屉底部按钮被截断:抽屉宽 380px,四个按钮
flex: 1但white-space: nowrap,文字放不下时按钮不会缩,只会把最后一个「细粒度授权」挤出抽屉。改成两列网格(repeat(2, minmax(0, 1fr))),按钮再多也只会换行。 - 窄窗口下工具栏右侧按钮被裁掉:工具栏是单行 flex,窗口窄时「上传」按钮跑出可视区。加上
flex-wrap: wrap,放不下就折到第二行。