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

使用CSS Grid实现动态高度布局:中间行滚动不挤压底部行

解决Grid布局中中间行内容过多挤压末行的问题

我看了你的代码,问题的核心在于中间区域的<ul>设置了固定的height:70%,而且包裹它的容器没有限制自身高度的机制,导致当列表内容过多时,会撑大整个中间的Grid行,进而挤压底部的min-content行。

下面是修正后的代码,完美实现你要的效果:

修正后的CSS

* { box-sizing: border-box; }
body { overflow-y: hidden; height: 100vh; margin: 0; } /* 消除body默认边距,避免布局偏移 */
.grid { display: grid; grid-template-rows: min-content 1fr min-content; height: 100% }
ul { 
  list-style: none; 
  overflow-y: auto; 
  flex: 1; /* 替换height:70%,让ul自动填充父容器剩余空间 */
  margin: 0; /* 消除ul默认边距 */
  padding: 0; /* 消除ul默认内边距 */
}
li { margin: 5px; background-color: red; padding: 10px; } /* 增加padding让列表项更直观 */
.s-1 { background-color: green; min-height: 100px; padding: 10px; }
.s-3 { background-color: blue; min-height: 100px; padding: 10px; }
/* 给中间的Grid子项添加Flex布局,限制内部元素高度 */
.grid > div:nth-child(2) {
  display: flex;
  flex-direction: column;
}

修正后的HTML

<section class="grid">
  <div class="s-1">Section 1</div>
  <div>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
      <li>6</li>
      <li>7</li>
      <li>8</li>
      <li>9</li>
      <li>10</li>
      <li>11</li>
      <li>12</li>
    </ul>
  </div>
  <div class="s-3">Section 3</div>
</section>

关键调整说明:

  • 给中间的Grid子项添加Flex布局:让它成为Flex容器,这样内部的<ul>可以通过flex:1自动填充容器的全部可用空间,同时限制容器自身不会超出Grid分配的1fr高度。
  • 替换ul的height为flex:1:不再用固定百分比高度,而是让ul占满父容器的剩余空间,当内容超出时,overflow-y:auto会触发内部滚动,不会撑大父容器。
  • 消除默认边距/内边距:避免浏览器默认样式导致的布局偏差,让效果更准确。

这样调整后,首行和末行会始终保持min-height的最小高度,中间行占据剩余空间,且仅自身内容过多时滚动,完全不会挤压末行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:48:24