【问题标题】:Does CSS grid suppress margin collapse inside grid items?CSS网格是否会抑制网格项目内的边距折叠?
【发布时间】:2020-11-26 01:59:10
【问题描述】:

我了解 CSS 网格元素会抑制 相邻的子网格项目之间(相邻的兄弟姐妹)之间的边距折叠。

但我认为我看到的是,网格元素似乎也抑制了边距折叠单个网格项目中,通过抑制该项目与该项目自己的子项之间的边距折叠(父-后代边距折叠)。

这是怎么回事?这是应该发生的事情吗?

你可以像这样在 sn-p 中看到它:

main {  
  display: grid; 
  outline: 1px solid green;
}

section {
  margin: 25px 0 25px 0;
  outline: 1px solid red;
}

div {
  margin: 25px 0 25px 0;
  outline: 1px solid blue;
}
<main>
  <section>
    <div>X</div>
    <div>Y</div>
  </section>
</main>

正如你所看到的,如果你运行这个 sn-p,X 和 Y 之间有 25 px 的空间。这是因为 X 的 25px margin-bottom 与它相邻的兄弟 Y 的 25px margin-top 重叠,正如预期的那样。

但是在 X 内容区域(蓝色轮廓)和网格项目内容区域的顶部(绿色轮廓)之间有 50 px 的空间。这似乎是因为 X div's 25px margin-top 与section's 25px margin-top 相加而不是折叠。这让我感到困惑。

如果您将 main 切换到 display:block,那么您将获得正常的折叠行为,其中 divsection 的 margin-top 一起折叠。它们还与main 本身的顶部边缘一起折叠,以便边缘空间延伸到main 的内容区域之外(以绿色勾勒)。

我不明白为什么会发生这种情况,也看不出规范中有什么暗示网格应该影响网格项内的折叠行为。

【问题讨论】:

    标签: css css-grid margin


    【解决方案1】:

    来自the specificaton

    网格项为其内容建立独立的格式化上下文。但是,网格项是网格级框,而不是块级框:它们参与容器的网格格式化上下文,而不是块格式化上下文。

    建立新的块格式化上下文的元素的边距(例如浮动和具有“溢出”而不是“可见”的元素)不会与其流入的子元素一起折叠。@987654322 @

    因此,inside 网格项的边距不能与 outside

    的网格项的边距一起折叠

    如果所有相关的边距都在inside

    ,您可以让边距折叠inside网格

    main {
      display: grid;
    }
    
    section {
      margin: 25px 0;
      outline: 1px solid red;
    }
    
    div {
      margin: 25px 0;
      outline: 1px solid blue;
    }
    <main>
      <section>
        <div>X</div>
        <div>X</div>
      </section>
    </main>

    如您所见,我们在网格项内的两个 div 之间只有 25px

    【讨论】:

    • 感谢您的回答,说明了 sn-p 工具,以及对规范的仔细引用,我将更仔细地研究!但是,我认为您的示例也显示了令我困惑的事情,即父-后代边距折叠不会在网格项目中发生。我更新了我的问题以使这一点更清楚。但是您可以通过在 sn-p 中的主要元素中添加绿色轮廓来自己看到它。也许这是因为“他们参与了容器的网格格式化上下文,而不是块格式化上下文。”?
    • @algal 这是在网格项目中没有发生父-后代边距折叠 --> 这就是我解释的。网格项建立独立的格式化上下文,因此不再有父子边距折叠。里面的世界是封闭的,无法与外界进行更多的互动。
    • @algal 你有 3 层。网格容器建立了一个网格格式化上下文,因此其外部的任何内容都不会与其内部一起折叠。然后,兄弟的网格项目不能相互交互,因为在网格格式化上下文中没有边距折叠。然后每个网格项创建一个格式化上下文,因此内部的任何内容都不会与网格项的外部一起折叠
    • @algal 是的,不折叠的规则是:网格容器不会与网格项一起折叠。网格项不会相互折叠,网格项不会与其子项一起折叠。就这样。所有其他组合都超出了 CSS 网格范围,考虑到不同的规则,它们将(或不会)折叠
    • 再次感谢您的耐心等待。我从未在任何地方看到这些规则如此清晰地表述。
    猜你喜欢
    • 2013-09-28
    • 2010-09-11
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    相关资源
    最近更新 更多