为什么我的CSS Grid在其祖先显示时会缩小:flex?

时间:2017-08-06 15:34:47

标签: html css css3 flexbox css-grid

当下面代码中的祖先是display: block时,它按预期工作。当它为display: flex时,嵌套网格会缩小。

我想了解为什么会这样。

只需取消注释以下代码中的display: block即可查看结果。网格停止跨越允许的整个区域。

.ctnr{
  display: flex;
  //display: block;
  flex-flow: column;
  align-items: stretch;
}
header{ background: red; height: 2rem; }
main{
	max-width: 15rem;
	height: 25rem;
	margin: auto;
	overflow: auto;
}

.grid{
  display: grid;
	height: 25rem;
  align-items: stretch;
  grid-template-areas: 
  "c1 c1 c1 c2 c3 c3 c3"
  "c4 c4 c4 c4 c3 c3 c3"
  "c4 c4 c4 c4 c5 c6 c6"
  "c4 c4 c4 c4 c7 c7 c7";
	grid-gap: 10px;
}
.grid article{
	cursor: pointer;
}
.grid article:nth-child(odd){
  background: yellow;
}
.grid article:nth-child(even){
  background: cyan;
}
.c1{ grid-area: c1; }
.c2{ grid-area: c2; }
.c3{ grid-area: c3; }
.c4{ grid-area: c4; }
.c5{ grid-area: c5; }
.c6{ grid-area: c6; }
.c7{ grid-area: c7; }
<div class="ctnr">
  <header></header>
  <main>
    <div class="grid">
      <article class="c1">1</article>
      <article class="c2">2</article>
      <article class="c3">3</article>
      <article class="c4">4</article>
      <article class="c5">5</article>
      <article class="c6">6</article>
      <article class="c7">7</article>
    </div>
  </main>
  <footer></footer>
</div>

通过给主

赋予宽度来解决这个问题
main{
    width: 90%;
    max-width: 15rem;
    // ...
}

这“解决”了这个问题,但是我并没有真正理解这里发生的事情。例如,即使它没有宽度,header也不会收缩。

https://jsfiddle.net/6k2313ub/1/

1 个答案:

答案 0 :(得分:4)

这是您问题的根源:

main {
    max-width: 15rem;
    height: 25rem;
    margin: auto;
    overflow: auto;
}

main元素设置为max-width: 15rem

这会在线路上留下很多可用空间(100% - 15rem)。

main元素也设置为margin: auto。由于main是一个弹性项目,此规则告诉它从每一侧平均消耗线上的所有空闲空间。这样可以挤出所有自由空间并使物品垂直和水平居中。

但是弹性自动边距在块布局中不会像这样工作,这就是为什么与display: block存在渲染差异的原因。

如果您希望项目保持全宽,例如在块布局中,请使用min-width而不是max-width。这就是诀窍:

main {
    min-width: 15rem; /* adjusted */
    height: 25rem;
    margin: auto;
    overflow: auto;
}

revised demo 1

或者,只需添加width: 100%即可。这也可以解决问题:

main {
    width: 100%; /* new */
    max-width: 15rem;
    height: 25rem;
    margin: auto;
    overflow: auto;
}

revised demo 2

因此,margin: auto在flex布局中有很大的不同。如果您对标题应用相同的规则,您将得到类似的结果。

revised demo 3

在此处了解有关flex auto margin的更多信息: