css如何人为的制造边距塌陷(margin collapse)效果?

如图,宽度不固定的灰色容器中有N个固定宽高的div盒子

盒子均设置了右边距和下边距

最下面的两个盒子,希望盒子的下边缘能和灰色容器的下边缘重合

尝试方案:

  1. 首先想到css的边距塌陷,实际测试发现边距塌陷在这种布局中无效
  2. 给下面的两个盒子单独设置margin-bottom:0,由于灰色容器宽度不固定,最下层的盒子数量不固定,该方案不可

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>边距塌陷</title>
    <style>
      .main {
        width: 700px;
        margin: 100px auto;
        background-color: #efefef;
      }
      .d1 {
        /*  */
      }
      .d2 {
        width: 100px;
        height: 100px;
        border: 1px solid red;
        margin-bottom: 50px;
        margin-right: 50px;
        display: inline-block;
      }
    </style>
  </head>
  <body>
    <div class="main">
      <div class="d1">
        <div class="d2"></div>
        <div class="d2"></div>
        <div class="d2"></div>
        <div class="d2"></div>
        <div class="d2"></div>
        <div class="d2"></div>
        <div class="d2"></div>
        <div class="d2"></div>
        <div class="d2"></div>
        <div class="d2"></div>
      </div>
    </div>
  </body>
</html>
阅读 1.6k
2 个回答

因为你的 .d2 的容器改变为了 inline-block 破坏了 margin 合并。

所以我觉得想要实现你期望的布局,可以使用 flex 搭配 gap 属性来实现,具体CSS代码如下:

.main {
  width: 700px;
  margin: 100px auto;
  background-color: #efefef;
}
.d1 {
  display: flex;
  flex-wrap: wrap;
  gap: 50px;
}
.d2 {
  width: 100px;
  height: 100px;
  border: 1px solid #f00;
}

这里是 CodePen的在线Demo

但是 gap in flex 会有一些兼容问题,但可以用 grid 布局来解决。


本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题