【问题标题】:CSS flex children gutters with margin带边距的 CSS flex 儿童排水沟
【发布时间】:2016-11-22 06:40:00
【问题描述】:

我有一个画廊布局,我想用边距分隔每个框。问题是每行中的最后一个框与网格不对齐;右侧还有空间,如何在不使用填充的情况下做到这一点? (这将迫使我添加另一个包装 div)

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}
ul {
  list-style-type: none;
}
.flex {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
  -ms-flex-wrap: wrap;
  flex-wrap: wrap;
}
.align-center {
  -webkit-box-align: center;
  -webkit-align-items: center;
  -ms-flex-align: center;
  align-items: center;
}
.space-between {
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
  -ms-flex-pack: justify;
  justify-content: space-between;
}
.container {
  max-width: 1000px;
  margin: 0 auto;
  height: 100%;
  padding: 0 1em;
  border: 1px solid;
}
nav {
  background: #464646;
  height: 70px;
}
.box {
  background: lightblue;
  padding: 1em;
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 calc(50% - 1em);
  -ms-flex: 0 0 calc(50% - 1em);
  flex: 0 0 calc(50% - 1em);
  text-align: center;
  margin-right: 1em;
  margin-bottom: 1em;
}
<nav>
  <div class="container flex align-center space-between">

    <ul>
      <li>Logo</li>
    </ul>

    <ul>
      <li>Home</li>
    </ul>

  </div>
</nav>

<div class="container">

  <header>
    <h1>Header</h1>
  </header>

</div>

<div class="container">

  <div class="gallery flex">
    <div class="box">BOX 1</div>
    <div class="box">BOX 2</div>
    <div class="box">BOX 3</div>
  </div>

</div>

注意:我不能使用 flex grow: 1 因为我并不总是连续有两个框。

我不能在中间使用空格,因为网格是动态的,例如,如果框的宽度为 33.33%,并且您有五个框,则第二行将有两个框,一个在左侧,第二个在右侧。

【问题讨论】:

  • 好问题。只发布相关的 HTML / CSS 会很有用。这将使阅读更容易。

标签: html css


【解决方案1】:

方法#01:

在parnet和child上分别添加如下css(此方法仅在一行只有2个box时有效):

/* For Parent Element */
.flex {
  justify-content: space-between;
}

/* For Child Element */
.flex-child {
  flex: 0 0 calc(50% - 0.5em);
}

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}
ul {
  list-style-type: none;
}
.flex {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
  -ms-flex-wrap: wrap;
  flex-wrap: wrap;
}
.align-center {
  -webkit-box-align: center;
  -webkit-align-items: center;
  -ms-flex-align: center;
  align-items: center;
}
.space-between {
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
  -ms-flex-pack: justify;
  justify-content: space-between;
}
.container {
  max-width: 1000px;
  margin: 0 auto;
  height: 100%;
  padding: 0 1em;
  border: 1px solid;
}
nav {
  background: #464646;
  height: 70px;
}
.box {
  background: lightblue;
  padding: 1em;
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 calc(50% - 0.5em);
  -ms-flex: 0 0 calc(50% - 0.5em);
  flex: 0 0 calc(50% - 0.5em);
  text-align: center;
  margin-bottom: 1em;
}
<nav>
  <div class="container flex align-center space-between">
    <ul>
      <li>Logo</li>
    </ul>
    <ul>
      <li>Home</li>
    </ul>
  </div>
</nav>
<div class="container">
  <header>
    <h1>Header</h1>
  </header>
</div>
<div class="container">
  <div class="gallery flex space-between">
    <div class="box">BOX 1</div>
    <div class="box">BOX 2</div>
    <div class="box">BOX 3</div>
    <div class="box">BOX 4</div>
    <div class="box">BOX 5</div>
    <div class="box">BOX 6</div>
    <div class="box">BOX 7</div>
    <div class="box">BOX 8</div>
    <div class="box">BOX 9</div>
  </div>
</div>

方法#02:

  1. 在子元素两侧添加边距。
  2. 以相同数量的负边距从左/右扩展父级。

注意:如果出现水平滚动,则在.gallery 的父级上添加overflow: hidden

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}
ul {
  list-style-type: none;
}
.flex {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
  -ms-flex-wrap: wrap;
  flex-wrap: wrap;
  margin: 0 -0.5em;
}
.align-center {
  -webkit-box-align: center;
  -webkit-align-items: center;
  -ms-flex-align: center;
  align-items: center;
}
.space-between {
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
  -ms-flex-pack: justify;
  justify-content: space-between;
}
.container {
  max-width: 1000px;
  margin: 0 auto;
  height: 100%;
  padding: 0 1em;
  border: 1px solid;
}
nav {
  background: #464646;
  height: 70px;
}
.box {
  background: lightblue;
  padding: 1em;
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 calc(50% - 1em);
  -ms-flex: 0 0 calc(50% - 1em);
  flex: 0 0 calc(50% - 1em);
  text-align: center;
  margin: 0 0.5em 1em;
}
<nav>
  <div class="container flex align-center space-between">
    <ul>
      <li>Logo</li>
    </ul>
    <ul>
      <li>Home</li>
    </ul>
  </div>
</nav>
<div class="container">
  <header>
    <h1>Header</h1>
  </header>
</div>
<div class="container">
  <div class="gallery flex">
    <div class="box">BOX 1</div>
    <div class="box">BOX 2</div>
    <div class="box">BOX 3</div>
  </div>
</div>

【讨论】:

  • 我不喜欢这个解决方案,因为我需要同时维护容器和孩子的。我会等待更多的答案。
  • 但是现在无法控制空间宽度
  • @RedJohn 我添加了另一个更适合我的变体。
  • @RedJohn 我想你可以。您可以使用px 代替em
  • @RedJohn 在发布解决方案之前,我假设您将连续只有 2 个框。如果您有超过 2 个,我建议您使用 2nd 方法。
【解决方案2】:

使用gap/row-gap/column-gap

.flex: {
  display: flex;
  gap: 2rem;
}

查看更多here

【讨论】:

    【解决方案3】:

    只需改变两件事:-

    1. 删除边距-右:1em;来自 box 类的样式。
    2. 添加新样式 justify-content: space-between;在你的弹性课程中。

    【讨论】:

    • 但是现在无法控制空间宽度
    • 你可以控制盒子的大小吗?
    • 您的解决方案不对。将这些框更改为连续 3 个,然后在第二行再添加两个。贪婪需要灵活。
    【解决方案4】:

    检查下面的 sn-p。解决了

    使用 CSS

    box:nth-child(2n+1){margin-left:0px;}

       
    
     * {
          box-sizing: border-box;
          margin: 0;
          padding: 0;
        }
        ul {
          list-style-type: none;
        }
        .flex {
          display: -webkit-box;
          display: -webkit-flex;
          display: -ms-flexbox;
          display: flex;
          -webkit-flex-wrap: wrap;
          -ms-flex-wrap: wrap;
          flex-wrap: wrap;
        }
        .align-center {
          -webkit-box-align: center;
          -webkit-align-items: center;
          -ms-flex-align: center;
          align-items: center;
        }
        .space-between {
          -webkit-box-pack: justify;
          -webkit-justify-content: space-between;
          -ms-flex-pack: justify;
          justify-content: space-between;
        }
        .container {
          max-width: 1000px;
          margin: 0 auto;
          height: 100%;
          padding: 0 1em;
          border: 1px solid;
        }
        nav {
          background: #464646;
          height: 70px;
        }
        .box {
          background: lightblue;
          padding: 1em;
          -webkit-box-flex: 0;
          -webkit-flex: 0 0 calc(50% - 1em);
          -ms-flex: 0 0 calc(50% - 1em);
          flex: 0 0 calc(50% - 1em);
          text-align: center;
          margin-left: 2em;
          margin-bottom: 1em;
          }
        .box:nth-child(2n+1){
          margin-left:0px;
          }
       
    
     <nav>
          <div class="container flex align-center space-between">
    
            <ul>
              <li>Logo</li>
            </ul>
    
            <ul>
              <li>Home</li>
            </ul>
    
          </div>
        </nav>
    
        <div class="container">
    
          <header>
            <h1>Header</h1>
          </header>
    
        </div>
    
        <div class="container">
    
          <div class="gallery flex">
            <div class="box">BOX 1</div>
            <div class="box">BOX 2</div>
            <div class="box">BOX 3</div>
          </div>
    
        </div>

    【讨论】:

    • 请解释一下。
    • 使用 nth-child(2n+1){margin-left:0px;}。在 2 框后它的边距为 0
    • 如果您注意到,两个盒子之间的装订线空间增加了。! @RedJohn 的问题不是这样