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

如何裁剪Grid单元格并为其添加滚动功能?

问题描述

有一篇关于将1fr限制为0的优质文章:Why does minmax(0, 1fr) work for long elements while 1fr doesn't?

我希望实现一个可随内容增长但不超出父容器范围的单元格。

目前我的Grid中有一个单元格内容过长,未展开就已超出屏幕,因此需要实现两个效果:一是裁剪单元格尺寸,二是添加滚动功能。

我使用了上述文章中的minmax(0, 1fr),让Grid可以将单元格压缩至0,但它仍无法有效计算高度,导致滚动条因缺少固定高度信息而无法激活。

示例代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>

    body
    {
      width: 100vw;
      height: 100vh;
      margin: 0;
      padding: 0;
      overflow: hidden;
    }
    .page
    {
        height: 100%;
        
        /*display: flex;
        flex-direction: column;*/
        
        display:grid;
        grid-template-rows: min-content minmax(0, 1fr);
    }
    .header
    {
    }
    .content
    {
       flex-grow: 1;
       flex-shrink: 1;
       flex-basis: 0;
    }
    
    .quiz-grid
    {
      height: 100%;
      max-height: 100%;
      display: grid;
      grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
      grid-template-rows: minmax(0, 1fr) min-content;
      grid-template-areas: 
        "left    main   right" 
        "footer footer footer";
    }
    .quiz-cell-left
    { 
      grid-area: left;
      min-height: 0;
    }
    .quiz-cell-right
    { 
      grid-area: right;
      min-height: 0;
    }
    .quiz-cell-main
    { 
      grid-area: main;
      border: 1px red solid;
      min-height: 0;
    }
    .quiz-cell-footer 
    { 
      grid-area: footer;
      justify-self: center;
      align-self: center;
    }
    
    /* my scroll view component */
    .scroll-container
    {
      position: relative;
      width: 100%;
      min-height: 0;
      background-color: azure;
    
      
      max-height: 100%;
    }
    .scroll-content
    {
      height: 100%;
      width: 100%;
      overflow-y: auto;
    }
</style>
</head>
<body>

<div class="page">
  <div class="header">Header</div>
  
  <div class="content">
<div class="quiz-grid">
  <div class="quiz-cell-main">
    
    <div class="scroll-container">        <div class="scroll-content">
    <h1>something</h1>
    <h1>else</h1>
    <h1>alice</h1>
    <h1>cat</h1>
    <h1>or dog</h1>
    <h1>now</h1>
    <h1>world</h1>
    <h1>something</h1>
    <h1>else</h1>
    <h1>alice</h1>
    <h1>cat</h1>
    <h1>or dog</h1>
    <h1>now</h1>
    <h1>world</h1>
    <h1>something</h1>
    <h1>else</h1>
    <h1>alice</h1>
    <h1>cat</h1>
    <h1>or dog</h1>
    <h1>now</h1>
    <h1>world</h1>
    <h1>something</h1>
    <h1>else</h1>
    <h1>alice</h1>
    <h1>cat</h1>
    <h1>or dog</h1>
    <h1>now</h1>
    <h1>world</h1>
    
     </div>
   </div> 
    
  </div>
  
  <div class="quiz-cell-footer">
    footer
  </div>
</div>
  </div>
</div>

</body>
</html>

代码说明:内容位于“main”单元格中,其他元素(header、footer)用于确保解决方案不会过于简化。

更新记录

更新1:最初我使用flex进行外层布局,后来换成grid,至少实现了部分裁剪,但滚动功能仍未解决。

更新2:从技术上看似乎解决了问题(正在排查潜在问题)——我将双div滚动容器也基于grid实现,设置grid-template-rows: minmax(0, auto);,但这其实是误打误撞,我只是发现grid会传递高度信息,尝试后可行。但我仍疑惑为什么flex不适合外层布局,以及如何不借助grid将高度信息传递给双div滚动容器(我并不排斥grid,但这样下去我可能会到处用grid)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:17:18