边缘在flexbox中折叠

Cof*_*ite 43 css css3 flexbox

通常,在CSS中,当父级及其最后一个子级具有边距时,边距会折叠以创建单个边距.例如

article {
  margin-bottom: 20px
}

main {
  background: pink;
  margin-bottom: 20px;
}

footer {
  background: skyblue;
}
Run Code Online (Sandbox Code Playgroud)
<div id="container">
  <main>
    <article>
      Item 1
    </article>
    <article>
      Item 2
    </article>
  </main>
  <footer>Footer</footer>
</div>
Run Code Online (Sandbox Code Playgroud)

如您所见,即使在标签和标签20px上都指定了边距,您也只能在最后一个文章页脚之间获得边距.articlemain20px

但是,当使用flexbox时,我们40px在最后一篇文章页脚之间得到一个边距- 20p从文章到主页的整个x边距,以及20px主页面页脚的另一个边距.

#container {
  display: flex;
  flex-direction: column;
}

article {
  margin-bottom: 20px
}

main {
  background: pink;
  margin-bottom: 20px;
}

footer {
  background: skyblue;
}
Run Code Online (Sandbox Code Playgroud)
<div id="container">
  <main>
    <article>
      Item 1
    </article>
    <article>
      Item 2
    </article>
  </main>
  <footer>Footer</footer>
</div>
Run Code Online (Sandbox Code Playgroud)

有没有办法让flexbox边距的行为与非flexbox边缘的行为相同?

Mic*_*l_B 62

边距折叠是块格式化上下文的一个特征.

flex格式化上下文中没有边距折叠.

3. Flex Containers:flexinline-flex display

Flex容器为其内容建立新的flex格式上下文.这与建立块格式化上下文相同,除了使用flex布局而不是块布局.例如,浮动不会侵入Flex容器,并且Flex容器的边距不会随其内容的边距而折叠.

  • nnnnnooooooooooooooo不要告诉我这个!如何摆脱模块之间的额外空间? (41认同)
  • 令人讨厌的是,我们没有办法在我们认为合适的情况下打开/关闭边缘崩溃 (10认同)
  • @TomRoggero可能为该内容添加了一个包装,以在块格式化上下文中工作?然后,包装程序存在于flex格式设置上下文中,但不存在其内容-我想是这样。但是,换行往往会破坏良好,美观的语义标记。 (2认同)
  • 为了澄清一些我不清楚的事情:它是 *flex items* (而不是 *flex 容器* 本身)不会折叠边距。下面是一个示例:https://jsfiddle.net/tup8nxqo/ 您会注意到弹性项目 A、B、C 每个都有 50 像素的边距,但相距 100 像素。两个 Flex 容器各有 100 像素的边距,这些边距会折叠。 (2认同)
  • @HenrikN,要明确一点——因为你提到了 A、B 和 C 的相对边距——边距折叠仅适用于垂直边距。[水平边距永远不会塌陷。](https://www.w3.org/TR/CSS22/box.html#collapsing-margins) (2认同)
  • 为什么所有美好的事物都必然带有一些缺陷? (2认同)

ori*_*dam 25

尽管使用 Flexbox 无法实现边距折叠,但您可以使用它gap来实现相同的结果:

.parent {
    display: flex;
    flex-wrap: wrap;
    flex-direction: row;
    column-gap: 5px;
    row-gap: 15px;
      
    max-width: 70px;
    outline: 1px solid #440;
}

.parent > div {
    background: #8ff;
    width: 20px;
    height: 20px;
}
Run Code Online (Sandbox Code Playgroud)
<div class="parent">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
</div>
Run Code Online (Sandbox Code Playgroud)

https://coryrylan.com/blog/css-gap-space-with-flexbox


Tre*_*vor 6

注意:这不是一种使边距在弹性框布局中的行为方式与在块布局中相同的方法;然而,在某些情况下,这可能有助于解决保证金问题。

您可以使用伪选择器来获得您想要的效果,而不是依靠折叠边距:

main{
  display: flex;
  flex-direction: column;
  margin-bottom: 20px;
}

article{
  margin-bottom: 20px;
  background: #eee;
}

article:last-child{
  margin-bottom: 0;
}

footer{
  background: #eef;
}
Run Code Online (Sandbox Code Playgroud)
<main>
  <article>
    This is article number 1
  </article>
  <article>
    This is article number 2
  </article>
  <article>
    This is article number 3
  </article>
</main>
<footer>
  This is the footer of the page
</footer>
Run Code Online (Sandbox Code Playgroud)