CSS Grid 在 flexbox 内时不会增长

Posted

技术标签:

【中文标题】CSS Grid 在 flexbox 内时不会增长【英文标题】:CSS Grid does not grow when inside flexbox 【发布时间】:2019-01-29 04:21:19 【问题描述】:

我对 CSS Grid 的理解是它会增长以填充其父级,但是当父级的大小由弹性框控制时,这似乎无法正常工作。

在this example 中,我预计浅蓝色网格项目会增长到覆盖红色区域。如果网格是独立的,这可以正常工作,但是一旦将其放入 flex 元素(即使使用flex-grow: 1),它就不会增长;

这里发生了什么,有什么方法可以调整样式以达到我的预期?


代码:

布局

<div class="normal-grid">
  <div class="grid-item">Thing 1</div>
  <div class="grid-item">Thing 2</div>
</div>
<div class="flex">
  <div class="flex-grid">
    <div class="grid-item">Thing 1</div>
    <div class="grid-item">Thing 2</div>
  </div>
</div>

风格

.normal-grid 
  height: 100px;
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1fr;
  background: red;


.flex 
  margin-top: 20px;
  height: 100px;
  display: flex;
  flex-direction: column;


.flex-grid 
  flex-grow: 1;
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1fr;
  background: red;


.grid-item 
  background: lightblue;

【问题讨论】:

【参考方案1】:

您可以将flex-basis: 100%; 添加到.flex-grid 以获得您想要的行为。

.normal-grid 
  height: 100px;
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1fr;
  background: red;


.flex 
  margin-top: 20px;
  height: 100px;
  display: flex;
  flex-direction: column;


.flex-grid 
  flex-grow: 1;
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1fr;
  background: red;
  flex-basis: 100%;


.grid-item 
  background: lightblue;
<div class="normal-grid">
  <div class="grid-item">Thing 1</div>
  <div class="grid-item">Thing 2</div>
</div>
<div class="flex">
  <div class="flex-grid">
    <div class="grid-item">Thing 1</div>
    <div class="grid-item">Thing 2</div>
  </div>
</div>

当元素由 flexbox 控制时,必须考虑它们的初始尺寸。在这种情况下,.flex-grid 似乎在缩小 - 所以添加 flex-basis: 100% 将告诉浏览器它的初始大小应该是其大小的 100%。

【讨论】:

另外,在这种情况下,将height: 0;添加到.flex-grid具有相同的效果【参考方案2】:

只要保持row方向(默认方向)就可以得到拉伸效果:

.normal-grid 
  height: 100px;
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1fr;
  background: red;


.flex 
  margin-top: 20px;
  height: 100px;
  display: flex;
  /*flex-direction: column;*/


.flex-grid 
  flex-grow: 1;
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1fr;
  background: red;


.grid-item 
  background: lightblue;
<div class="normal-grid">
  <div class="grid-item">Thing 1</div>
  <div class="grid-item">Thing 2</div>
</div>
<div class="flex">
  <div class="flex-grid">
    <div class="grid-item">Thing 1</div>
    <div class="grid-item">Thing 2</div>
  </div>
</div>

【讨论】:

这行得通,但知道为什么吗?这似乎是一个错误。 @SephReed 是的,可能是一个已修复的错误,因为该问题不再实际发生

以上是关于CSS Grid 在 flexbox 内时不会增长的主要内容,如果未能解决你的问题,请参考以下文章

用于 Django 中动态内容的 CSS Grid/Flexbox

CSS多列布局Multi-column伸缩布局Flexbox网格布局Grid详解

html 使用CSS Grid和Flexbox的LastPass Vault布局

作为 flexbox 的子元素的 CSS 网格未按预期运行

使用 CSS Grid 和 Flexbox 水平对齐位于不同网格单元格中的元素

简单横幅广告-是否有更好的桌面和移动版面布局方式? (Flexbox / CSS Grid)