【问题标题】:justify-content: space-between with equal space between first and last items also [duplicate]justify-content:space-between,第一项和最后一项之间的空间相等[重复]
【发布时间】:2017-07-06 09:07:20
【问题描述】:

我想用 flexbox 设置一个简单的 elastic* 网格...

.container{
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
}

...但是我希望外边距等于项目之间的间距。

*“弹性”是指宽度不固定。它们都是百分比,因此在不同的屏幕宽度下总宽度不同。

这似乎不是justify-content: space-between 的默认行为。它在每个项目“周围”生成相等的空间,但空间不会像边距那样折叠。所以结果是“中间”空间的宽度是最右边和最左边的两倍(假设你的 flex-direction 是row)。

在下面的草图中,第一张图是justify-content: space-between 自然所做的。注意宽度 A 和 B。第二张图是我想要的(只有一个一致的排水沟 C)。

flexbox 可以做到这一点吗?

更新

如果可能的话,我想避免添加“行”包装元素。伪元素解决方案听起来就像一张票(请参阅下面的答案),但让我们解决一下,以便项目可以是未确定的数字(并换行到新行)

【问题讨论】:

  • 喜欢插图。
  • @Michael_B 实际上,我希望它根据断点而有所不同。这就是为什么我试图避免使用行包装器。作为一个简单的概念证明,假设 2/row 最多 1000px,然后 3/row。你认为我们可以使用:nth-child() 做到这一点吗?或者也许没关系......
  • 发布了一个 3:rd 示例,使用断点
  • 刚刚在搜索另一个问题时遇到了这个问题。 justify-content: space-around; 不是一个选项吗?

标签: html css flexbox


【解决方案1】:

您可以将space-between 与来自父级的伪元素一起使用

.flex {
  display: flex;
  width: 500px;
  border: 1px solid black;
  justify-content: space-between;
}
.flex > div {
  background: #eee;
  border: 1px solid #aaa;
  height: 100px; width: 100px;
}
.flex:before,.flex:after {
  content: '';
}
<div class="flex">
  <div></div>
  <div></div>
  <div></div>
</div>

【讨论】:

  • 哇这太聪明了!你能简要解释一下它为什么起作用吗?伪元素是否被视为弹性项目?我原以为它们会在 flex 上下文之前/之后“出现”……但我猜不是?
  • @emersonthis 是的。当我花了大约一个小时尝试调试 flex 布局时,我第一次了解到这项工作是偶然的,只是为了了解 :before 和 :after 元素被视为 flex 子元素。
  • @emersonthis 但重要的是要记住伪元素的行为类似于与其关联的元素的子元素。例如,您可以执行div { position: relative; } div:after { position: absolute; } 并且:after 伪元素将绝对相对于div 定位。或div { border: 1px solid black; } div:before { content: 'foo'; },并且“foo”将在边界内。这些元素的行为类似于子元素。
【解决方案2】:

在item前后使用0宽度的伪元素怎么样?

.container{
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    border: 1px solid #C55;
}

.column {
  flex: 1 20%;
  max-width: 20%;
  height: 100px;
  background: #C55;
}

.even:before, .even:after{
  content: '';
  display: block;
  width: 0;
}
no side spacing:
<div class="container">
  <div class="column"></div>
  <div class="column"></div>
  <div class="column"></div>
</div>
<br>
side spacing:
<div class="container even">
  <div class="column"></div>
  <div class="column"></div>
  <div class="column"></div>
</div>

【讨论】:

    【解决方案3】:

    几个伪元素可以实现这一点:

    flex-container {
      display: flex;
      justify-content: space-between;
      background-color: orangered;
    }
    
    flex-item {
      flex: 0 0 20%;
      height: 100px;
      margin: 5px 0;
      background-color: lightyellow;
    }
    
    flex-container::after {
      content: '';
    }
    
    flex-container::before {
      content: '';
    }
    <flex-container>
      <flex-item></flex-item>
      <flex-item></flex-item>
      <flex-item></flex-item>
    </flex-container>

    大多数(如果不是全部)浏览器将 flex 容器上的伪元素解释为 flex 项。 ::before 伪是第一项,::after 是最后一项。

    这是来自 Firefox 文档的参考:

    In-flow ::after and ::before pseudo-elements are now flex items (bug 867454)。

    上面的代码有效,因为justify-content: space-between 现在包含五个弹性项目,但第一个和最后一个宽度为 0。

    我不确定这是否可以在具有纯 CSS 的 多行容器 (flex-wrap: wrap) 中工作。您可以尝试在弹性项目上使用auto 边距,而不是在容器上使用justify-content。否则,JavaScript。

    【讨论】:

    • 你知道浏览器支持这种技术的任何细节吗?基本上,哪些浏览器考虑伪元素弹性项目?
    • 我相信所有主流浏览器都有相同的行为。
    • 太棒了。我偶然发现了这一点,这表明一些(较旧的)IE11 版本在这方面存在问题。但听起来这几天生产起来很安全:connect.microsoft.com/IE/feedbackdetail/view/1058330/…
    • 如果我尝试使用flex-wrap: wrap 技术和margin: auto justify-content 设置应该是什么?默认?
    • 我不确定你的最终目标是什么,所以我不知道auto margins 是否适合你:jsfiddle.net/uu9chyey/1
    【解决方案4】:

    您可以避免使用使用边距来定位元素的伪元素。

    第一个元素是特殊情况,需要一个margin-left;所有其他人都只有margin-right。

    但此解决方案不适用于启用换行。 (没有办法针对第二行及后续行的第一个元素)

    .flex {
      display: flex;
      width: 500px;
      border: 1px solid black;
    }
    
    .flex > div {
      background: lightblue;
      height: 100px; 
      width: 100px;
      margin-right: auto;
    }
    
    .flex > div:first-child {
      margin-left: auto;
    }
    <div class="flex">
      <div></div>
      <div></div>
      <div></div>
    </div>

    【讨论】:

      【解决方案5】:

      计算差异并将margin-left 添加到左侧元素,将margin-right 添加到右侧元素。虽然我知道您想要一个 HTML/CSS 解决方案,但您可以使用 JavaScript 来完成此操作,并使其具有完美的响应性,或者只是使用 HTML/CSS 感受页边距大小。

      HTML

      <div class="box" id="element"></div>
      <div class="box"></div>
      <div class="box"></div>
      

      JS

      window.addEventListener('load', setMargins);
      
      var boxClass = document.getElementsByClassName('box');
      
      function setMargins() {
          var element = document.getElementById('element');
          var widthOfElement = element.clientWidth;
          var sizeOfEachMargin = (window.innerWidth - (widthOfElement * 3)) / 4;
      
          for (var i = 0; i < boxClass.length; i++) {
              boxClass[i].style.marginLeft = sizeOfEachMargin + 'px';
          }
      }
      

      【讨论】:

      • 为了让这个答案对 OP 有用,您应该添加一些代码示例来说明应该如何完成。
      • @Brandon 请您现在取消对我的评论投反对票吗?
      • 我没有投反对票或赞成票。我在审核队列中看到了,添加了评论并通过了审核。
      • @Brandon 审核队列是什么?
      • 当您获得 2000 声望时,您将获得进入审核队列的权限,允许您批准或拒绝其他人已标记为待审核的帖子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2017-12-21
      • 2017-02-19
      • 2021-04-03
      相关资源
      最近更新 更多