除了 Bootstrap 的 h-100(本质是 height: 100%),还有多种通用方法可让元素撑满父容器高度,适配不同布局场景(纯 CSS、Flexbox、Grid、定位等),以下是常用方案及适用场景:

一、核心思路:不同布局模型的满高实现

方案1:Flexbox 弹性布局(推荐,适配性最好)

父容器设为 Flex 容器,子元素自动撑满高度(无需手动设 height),是目前最通用的满高方案,兼容 Bootstrap 栅格。

用法:
<!-- 父容器(比如 Bootstrap 的 row/col) -->
<div class="row g-4" style="display: flex;">
  <div class="col" style="display: flex;"> <!-- 列也设为 Flex 容器 -->
    <!-- 子元素(产品卡片)自动撑满列的高度 -->
    <div class="card product-card" style="flex: 1;"> 
      <!-- 卡片内容 -->
    </div>
  </div>
</div>
核心 CSS:
/* 父容器:开启 Flex 布局 */
.parent {
  display: flex;
  height: 100%; /* 若父容器需先撑满上级,可加这个 */
}
/* 子元素:flex:1 表示占满父容器剩余空间(高度/宽度) */
.child {
  flex: 1; /* 等价于 flex-grow:1; flex-shrink:1; flex-basis:0% */
}
优势:
  • 无需计算高度,自动适配父容器;
  • 兼容 Bootstrap 栅格,可替代 h-100 解决卡片高度统一问题;
  • 子元素内容溢出时可配合 overflow: auto 滚动,不破坏布局。

方案2:Grid 网格布局(适合复杂网格场景)

父容器设为 Grid 容器,子元素默认占满网格单元格高度,适合多列/多行的网格布局。

用法:
/* 父容器 */
.parent {
  display: grid;
  height: 100%; /* 父容器先撑满上级 */
}
/* 子元素:自动占满网格单元格高度,无需额外设置 */
.child {
  /* 可选:强制占满 */
  height: 100%; 
  /* 或 grid-row: 1 / -1; 占满所有行 */
}
适配 Bootstrap 卡片示例:
<div class="row g-4" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));">
  <div class="col">
    <div class="card product-card" style="height: 100%;">...</div>
  </div>
</div>

方案3:绝对定位(适合“层叠/悬浮”场景)

子元素设为绝对定位,通过 top/bottom/left/right 强制撑满父容器,需父容器设为相对定位。

用法:
/* 父容器:必须设为相对定位 */
.parent {
  position: relative;
  height: 300px; /* 父容器需有明确高度,或 100% */
}
/* 子元素:绝对定位撑满 */
.child {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  /* 可选:避免内容溢出 */
  overflow: auto;
}
优势/注意:
  • 子元素脱离文档流,适合遮罩、弹窗、背景层等场景;
  • 父容器必须有 position: relative,且需有明确高度(或 height: 100%),否则会相对于视口定位。

方案4:CSS 视口单位(vh/vw)(适合“占满屏幕高度”)

vh(视口高度,1vh = 屏幕高度的 1%)替代百分比,直接让元素占满视口高度(而非父容器),适合全屏组件(如首页 banner、登录页)。

用法:
/* 占满整个屏幕高度 */
.child {
  height: 100vh; 
  /* 或 占满父容器高度 + 视口适配 */
  height: calc(100% - 60px); /* 结合 calc 计算,比如减去导航栏高度 */
}
注意:
  • 100vh 是“屏幕高度”,不是“父容器高度”,若父容器高度小于屏幕高度,会超出父容器;
  • 移动端需注意:部分浏览器(如 Safari)的 100vh 会包含地址栏/工具栏,可改用 dvh(动态视口高度):height: 100dvh

方案5:min-height: 100%(保底方案)

height: 100% 类似,但 min-height 保证元素至少占满父容器高度,若内容超过父容器,会自动撑开(避免内容溢出被截断)。

用法:
.child {
  min-height: 100%; /* 至少占满父容器高度,内容多则自适应 */
  height: auto; /* 配合使用,允许高度自动增长 */
}
适用场景:
  • 产品卡片:既保证高度统一,又避免长名称/多内容被截断;
  • 替代 h-100,解决 height: 100% 导致内容溢出的问题。

方案6:Bootstrap 辅助类(补充)

除了 h-100,Bootstrap 还提供了适配 Flex 布局的类,可间接实现满高:

类名作用搭配场景
d-flex给元素设 display: flex父容器开启 Flex 布局
flex-fill子元素设 flex: 1子元素占满 Flex 容器空间
align-items-stretch行级 Flex 容器,让列自动拉伸高度搭配 row d-flex 使用
示例(Bootstrap 原生类替代 h-100):
<div class="row g-4 d-flex align-items-stretch">
  <div class="col">
    <div class="card product-card d-flex flex-column h-100">
      <!-- 卡片内容 -->
    </div>
  </div>
</div>

二、不同方案对比(选对场景更重要)

方案核心优势适用场景注意事项
Flexbox(flex:1)自动适配、兼容性好、不截断内容产品卡片、栅格布局、通用满高父容器需设 display: flex
Grid 布局适合多列/多行网格、自动对齐商品列表、仪表盘、复杂网格兼容 IE11+
绝对定位脱离文档流、层叠场景遮罩、弹窗、背景层父容器需 position: relative
vh 单位快速占满屏幕高度全屏组件、登录页、banner移动端注意地址栏影响(用 dvh)
min-height: 100%保底满高,内容多则自适应产品卡片、内容不确定的容器需父容器有明确高度
Bootstrap h-100快速适配 Bootstrap 生态简单栅格布局、卡片高度统一父容器需有高度,内容溢出会截断

三、实战推荐(针对你的产品卡片场景)

优先选择 Flexbox 方案(Bootstrap 原生类+Flex),兼顾兼容性和灵活性:

<!-- 行级开启 Flex,列自动拉伸 -->
<div class="row g-4 d-flex align-items-stretch">
  {% for product in products %}
    <div class="col">
      <!-- 卡片设为 Flex 容器,内容自动布局 -->
      <div class="card product-card d-flex flex-column h-100">
        <a href="{% url 'product_detail' product.pk %}" class="product-link flex-grow-1">
          <img src="..." class="card-img-top product-image" alt="...">
          <div class="card-body">
            <h5 class="card-title">{{ product.name }}</h5>
          </div>
        </a>
        <div class="card-body pt-0">
          <a href="{% url 'product_detail' product.pk %}" class="btn btn-outline-primary">{% trans 'View Details' %}</a>
        </div>
      </div>
    </div>
  {% endfor %}
</div>
  • d-flex:开启 Flex 布局;
  • align-items-stretch:让列自动拉伸高度;
  • flex-column:卡片内部垂直布局;
  • flex-grow-1:链接区域占满卡片剩余高度,按钮固定在底部。

这种方式既保证卡片高度统一,又避免内容溢出,是产品卡片布局的最优解。
(来自豆包)

标签: none