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

如何用纯CSS实现网格行在高度不足时自动隐藏?

问题描述

<body>采用绑定浏览器窗口高度的Grid布局,其中一列包含<aside>元素,该元素为1列4行的Grid,包含两个固定高度标题和同为1列Grid的.asidebox类容器。需求是:当浏览器窗口高度不足以显示所有自然高度的行时,.asidebox仅显示能容纳的行,行保持自然高度不伸缩。

尝试通过让.asidebox垂直收缩适配窗口+配置grid-template-rows: repeat(auto-fit, ...)实现,但多种配置均未达成预期,调整<aside>的grid-template-rows也无效。

纯CSS解决方案

核心思路是利用容器高度限制+溢出隐藏结合Grid的内容对齐,实现超出部分自动隐藏:

  • 调整<aside>的Grid行配置,让两个.asidebox的高度分配逻辑改为自适应内容但不超出可用空间:
aside {
    background-color: darkkhaki;
    display: grid;
    grid-template-columns: 1fr;
    /* 标题用auto,asidebox用minmax(0, auto),避免强行拉伸 */
    grid-template-rows: auto minmax(0, auto) auto minmax(0, auto);
    align-content: start; /* 让Grid内容从顶部开始排列,不拉伸 */
}
  • 给.asidebox添加高度限制和溢出隐藏,同时保持行的自然高度:
.asidebox {
    display: grid;
    grid-template-rows: repeat(auto-fill, min-content); /* 按内容高度生成行 */
    max-height: 100%; /* 限制高度不超过父容器分配的空间 */
    overflow: hidden; /* 隐藏超出容器的行 */
    min-height: 0; /* 确保容器能收缩到0,避免父容器强制拉伸 */
}
  • 保留原有文章样式,确保内容自然高度:
.asidebox > article {
    border: 2px solid green;
    padding: 2px;
    background-color: yellow;
}

为什么之前的auto-fit不生效?

repeat(auto-fit, ...)在Grid的行方向上的行为和列方向不同:auto-fit主要用于响应式列布局,会自动创建/删除列来适配容器宽度,但在行方向上,浏览器不会自动删除超出高度的行,只会尝试拉伸或压缩行高。因此需要通过overflow: hidden直接隐藏超出容器的行内容。

完整测试代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        p, h1, h2, h3, h4 {
            margin: 0;
            padding: 0;
        }
        
        body {
            display: grid;
            margin: 0;
            border-bottom: 3px solid purple;
            background-color: #f1e2ad;
            grid-template-columns: 5fr minmax(min-content, 30%);
            grid-template-rows: 99vh;
            overflow-y: hidden;
        }

        aside {
            background-color:darkkhaki;
            display: grid;
            align-content: start;
            grid-template-columns: 1fr;
            grid-template-rows: auto minmax(0, auto) auto minmax(0, auto);
        }
        
        .asidebox {
            display: grid;
            min-height: 0;
            grid-template-rows: repeat(auto-fill, min-content);
            max-height: 100%;
            overflow: hidden;
        }

        .asidebox > article {
            border: 2px solid green;
            padding: 2px;
            background-color: yellow;
        }
    </style>
</head>
<body>
    <div id="esq"></div>
    <aside id="dir">
        <h2>News</h2>
        <div class="asidebox">
            <article class="news">
                <h4>Title</h4>
                <p>Lorem ipsum dolor sit amet consectetur, adipisicing elit</p>
            </article>
            <article class="news">
                <h4>Title</h4>
                <p>Lorem ipsum dolor sit amet consectetur, adipisicing elit</p>
            </article>
            <article class="news">
                <h4>Title</h4>
                <p>Lorem ipsum dolor sit amet consectetur, adipisicing elit</p>
            </article>
        </div>
    
    
        <h2>Top reporters</h2>
        <div class="asidebox">
            <article class="user">
                <h4>Title</h4>
                <p>Lorem ipsum dolor sit amet consectetur, adipisicing elit</p>
            </article>
            <article class="user">
                <h4>Title</h4>
                <p>Lorem ipsum dolor sit amet consectetur, adipisicing elit</p>
            </article>
            <article class="user">
                <h4>Title</h4>
                <p>Lorem ipsum dolor sit amet consectetur, adipisicing elit</p>
            </article>
            <article class="user">
                <h4>Title</h4>
                <p>Lorem ipsum dolor sit amet consectetur, adipisicing elit</p>
            </article>
        </div>
    </aside>
</body>
</html>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:19:58