弹性框:将最后一行与网格对齐


378

我有一个简单的flex-box布局,其中包含一个容器:

.grid {
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
}

现在,我希望最后一行中的项目与另一行对齐。justify-content: space-between;应该使用网格,因为可以调整网格的宽度和高度。

目前看起来像

右下角的项目应该在中间

在这里,我希望右下角的项目在“中间列”中。最简单的方法是什么?这是一个显示此行为的小jsfiddle

.exposegrid {
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
}

.exposetab {
  width: 100px;
  height: 66px;
  background-color: rgba(255, 255, 255, 0.2);
  border: 1px solid rgba(0, 0, 0, 0.4);
  border-radius: 5px;
  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
  margin-bottom: 10px;
}
<div class="exposegrid">
  <div class="exposetab"></div>
  <div class="exposetab"></div>
  <div class="exposetab"></div>
  <div class="exposetab"></div>
  <div class="exposetab"></div>
  <div class="exposetab"></div>
  <div class="exposetab"></div>
  <div class="exposetab"></div>
  <div class="exposetab"></div>
  <div class="exposetab"></div>
  <div class="exposetab"></div>
  <div class="exposetab"></div>
  <div class="exposetab"></div>
  <div class="exposetab"></div>
</div>



请在这里我的解决方案,我认为它的工作原理没有很好的破解,只是数学:stackoverflow.com/questions/18744164/...
塞巴斯蒂安·洛伯

5
或者,可以使用更新的css网格模块 -不存在此问题
Danield


1
我为子项的宽度可变的情况添加了通用的JS解决方案,这使得行上的项目数也可变。
tao

Answers:


416

添加::after会自动填充该空间。无需污染您的HTML。这是一个显示它的codepen:http ://codepen.io/DanAndreasson/pen/ZQXLXj

.grid {
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
}

.grid::after {
  content: "";
  flex: auto;
}

17
是否有可能使其以某种方式围绕空间工作?
汤姆(Tom)

60
@DanAndreasson有两个问题,它不是从左边开始的(如它们之间的空间),并且最后一行的项目之间的空间也不同于前一行(模拟“任何大小”的某些固定宽度的项目)网格-两者都相关)... codepen.io/anon/pen/gPoYZE我想要的是维持“策略”(周围的空间或中间的空间),但是像上一行一样从左侧开始...我想知道,是否有可能推广您的惊人解决方案。
汤姆(Tom)

44
这只是工作,因为该项目已填补空间他们和合并百分比宽度等于100%为每组4 在这codepen我删除justify-content: space-between;.grid和删除.grid:after,它的工作原理相同。现在,如果您尝试这样的操作,它将完全崩溃。请注意,每4套的宽度之和不等于100%。在OP的提琴中,宽度以px为单位设置,因此您的解决方案这种情况下不起作用
雅各布·阿尔瓦雷斯

22
尝试使用此解决方案时,最初,最后一行缺少的项目无法通过正确传播space-between。但是,当我将flex-basisof .grid:after的大小设置为与网格中其他项目相同的大小时(每个断点,覆盖上面的默认/基本模块代码),最后一行正确展开。似乎可以在Safari,iOS,Firefox,Chrome(需要测试IE)上使用,并且在初始实现中,我最大的行大小是3。
webbower

8
对于我的需求,它进行了以下修改: { content: "";flex: 0 0 32%;max-width: 480px;}并且我通过更改媒体查询更改了最大宽度,因此网格在所有宽度上都是完美的。
Colin Wiseman '18

160

一种技术是插入一些零高度的额外元素(与您期望连续拥有的元素的最大数量一样多)。空间仍然是分开的,但是多余的行折叠成零:

http://codepen.io/dalgard/pen/Dbnus

body {
  padding: 5%;
}

div {
  overflow: hidden;
  background-color: yellow;
}

ul {
  display: flex;
  flex-wrap: wrap;
  margin: 0 -4px -4px 0;
  list-style: none;
  padding: 0;
}

li {
  flex: 1 0 200px;
  height: 200px;
  border-right: 4px solid black;
  border-bottom: 4px solid black;
  background-color: deeppink;
}
li:empty {
  height: 0;
  border: none;
}

*,
:before,
:after {
  box-sizing: border-box;
}
<div>
  <ul>
    <li>a</li>
    <li>b</li>
    <li>c</li>
    <li>d</li>
    <li>e</li>
    <li>f</li>
    <li>g</li>
    <li>h</li>
    <li>i</li>
    <li>j</li>
    <li>k</li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
  </ul>
</div>

将来,可以通过使用Multiple来实现::after(n)


11
不幸的是,这以一种非语义的方式污染了标记,但是它完全可以工作。:SI希望我知道有其他方法可以复制此行为,无论是flexbox还是其他方式,都不需要非语义元素。
Ryan Norbauer 2014年

33
同意,它很脏,但是可以工作,而且比许多hacks少hacky。烦死了,我一直在使用它,直到:: after(12)获得支持,或者它们添加了一些其他的证明选项。真是太可惜了,因为flexbox正当性目前的工作方式是完全错误的!如果您要证明一段文字的正当性,则永远不要尝试证明最后一行的正当性。应该绝对可以选择,我不敢相信他们会错过这个机会。
Codemonkey 2014年

4
我想出了一个仅CSS的解决方案。.警告是它只能解决两个缺失的项目,因此只能在flex网格中安全地工作,每个包装行最多三个项目。演示:codepen.io/lukejacksonn/pen/dozqVq这里的原理是使用伪元素作为额外的子元素,并赋予它们与容器中的项目相同的flex属性。
lukejacksonn

7
@Codemonkey耶稣。我只是开始使用flexbox来思考如何摆脱所有旨在将网格中的内联块对齐的hack,现在事实证明这是不可能的!我马上就碰到了那个障碍,达到了我认为很难解决所有这些旧的无法解决的CSS问题的极限。我想不是那么快。正确的垂直居中只用了20年的时间-我们当然可以等待。耶稣,看来任务很简单...
Andrey

3
@dalgard我不这么认为。看我的评论
雅各布·阿尔瓦雷斯

108

正如其他张贴者所提到的那样,没有一种干净的方法可以将最后一行与flexbox左对齐(至少根据当前规范)

但是,它的价值在于:使用CSS网格布局模块,可以很容易地实现这一点:

基本上,相关代码可以归结为:

ul {
  display: grid; /* 1 */
  grid-template-columns: repeat(auto-fill, 100px); /* 2 */
  grid-gap: 1rem; /* 3 */
  justify-content: space-between; /* 4 */
}

1)使容器元素成为网格容器

2)设置自动列的宽度为100px的网格。(请注意,使用自动填充(与auto-fit-相对应-对于1行布局,将空轨道折叠为0-导致项目展开以占用剩余空间。这将导致在“ '当网格只有一行,而在我们的情况下不是我们想要的那一行(请查看此演示以了解它们之间的区别)。

3)为网格的行和列设置间隙/装订线-在此处,由于需要“间隔”布局-间隙实际上将是最小间隙,因为它将根据需要增大。

4)类似于flexbox。

Codepen演示(调整大小以查看效果)


4
不错的解决方案。唯一的问题是它不适用于IE10 / 11。
zendu

1
关于auto-fit,Chrome 57-60(以及基于其引擎的浏览器,如Samsung Internet 6.0)中存在一个错误,因为当时的规范有些含糊。现在,说明已经阐明,新版本的Chrome可以auto-fit正确呈现,但是具有旧引擎的浏览器仍在使用中,因此请谨慎使用此值。
Ilya Streltsyn

4
鉴于当前的可能性,这现在应该是公认的答案。:after在边缘情况下,使用伪元素可能会导致不良结果。
保罗

2
@ Danield的建议对我帮助很大,谢谢!
克里斯(Krys)'18年

4
这应该是公认的答案。我将本着渐进增强的精神将它与flexbox结合起来作为后备:不支持网格的浏览器将显示flexbox版本,该版本对我来说足够接近。
Palantir '18

27

没有任何额外的标记,只需添加即可::after为我指定列的宽度。

.grid {
  display:flex;
  justify-content:space-between;
  flex-wrap:wrap;
}
.grid::after{
  content: '';
  width: 10em // Same width of .grid__element
}
.grid__element{
  width:10em;
}

使用这样的HTML:

<div class=grid">
   <div class="grid__element"></div>
   <div class="grid__element"></div>
   <div class="grid__element"></div>
</div>

8
这很有趣,但并不完全正确。当您要处理底行中的两个以上元素时,就会出现问题-上方各行中的元素之间出现的间距永远不会出现在最后一行;这些项目被硬包装在一起,从而消除了原来的空间间隔。
John Haugeland

如果使用flex-basis: 10em而不是宽度,则更好。
beytarovski

14

你不能 Flexbox不是网格系统。它没有语言构造来满足您的要求,至少在使用时没有justify-content: space-between。使用Flexbox可以得到的最接近的结果是使用列方向,这需要设置一个明确的高度:

http://cssdeck.com/labs/pvsn6t4z(注意:不包括前缀)

ul {
  display: flex;
  flex-flow: column wrap;
  align-content: space-between;
  height: 4em;
}

但是,仅使用列会更简单,因为列具有更好的支持,并且不需要设置特定的高度:

http://cssdeck.com/labs/dwq3x6vr(注意:不包括前缀)

ul {
  columns: 15em;
}

2
有一种方法; 看我的答案。
dalgard 2014年

@dalgard,您的答案是一种解决方法,而不是真正的解决方案。cimmanon的答案是正确的。
约拿(Jonah)2016年

1
@Jonah我认为“技术”是对我的回答的公正描述。对于许多人,包括问询者,它当然都可以作为解决方案。
dalgard '16

2
@dalgard并没有改变Flexbox不提供语言结构来执行所要求的事实的事实。此外,我认为添加虚假元素是一种极其肮脏的做法,即使用表格进行布局。
cimmanon

4
这不是很漂亮,但是前端开发是一种可能的艺术。实用主义是一个基本前提。我认为这个词非常被放错了地方,因为被用于造型上的现实世界的网站(参见引导容器元素)99.9%的额外元素。
达加德

12

可能的解决方案是justify-content: flex-start;.grid容器上使用容器,其子容器上的大小限制以及适当的子元素上的边距-取决于所需的列数。

对于三列网格,基本CSS如下所示:

.grid {
    display: flex;
    flex-flow: row wrap;
    justify-content: flex-start;
}

.grid > * {
    flex: 0 0 32%;
    margin: 1% 0;
}

.grid > :nth-child(3n-1) {
    margin-left: 2%;
    margin-right: 2%;
}

这是另一个不完善的解决方案,但它可以工作。

http://codepen.io/tuxsudo/pen/VYERQJ


11

我知道这里有很多答案,但是..最简单的方法是使用a grid代替flexand grid template columnswith repeatauto fills,在其中您必须根据100px代码段设置为每个元素指定的像素数。

.exposegrid {
     display: grid;
     grid-template-columns: repeat(auto-fill, 100px);
     justify-content: space-between;
}
 .exposetab {
     width: 100px;
     height: 66px;
     background-color: rgba(255, 255, 255, 0.2);
     border: 1px solid rgba(0, 0, 0, 0.4);
     border-radius: 5px;
     box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
     margin-bottom: 10px;
}
<div class="exposegrid">
   <div class="exposetab"></div>
   <div class="exposetab"></div>
   <div class="exposetab"></div>
   <div class="exposetab"></div>
   <div class="exposetab"></div>
   <div class="exposetab"></div>
   <div class="exposetab"></div>
   <div class="exposetab"></div>
   <div class="exposetab"></div>
   <div class="exposetab"></div>
   <div class="exposetab"></div>
   <div class="exposetab"></div>
   <div class="exposetab"></div>
   <div class="exposetab"></div>
</div>


2
这是使最后一行项目保持对齐的正确解决方案。
a.barbieri,

我同意,正确的方法是使用网格。使用flexbox可以实现,但使用网格要干净得多。
nbarth

6

是。!我们可以但可以进行一些媒体查询,并且最大列数是预定义的

在这里使用4列。检查我的代码:

.container {
  display: flex;
  display: -webkit-flex;
  display: -moz-flex;
  flex-flow: row wrap;
  -webkit-flex-flow: row wrap;
  -moz-flex-flow: row wrap;
}

.container .item {
  display: flex;
  display: -webkit-flex;
  display: -moz-flex;
  justify-content: center;
  -webkit-justify-content: center;
  -moz-justify-content: center;
  flex-basis: 25%; //max no of columns in %, 25% = 4 Columns
}

.container .item .item-child {
  width: 130px;
  height: 180px;
  background: red;
  margin: 10px;
}

@media (max-width: 360px) {
  .container .item {
    flex-basis: 100%;
  }
}

@media (min-width:360px) and (max-width: 520px) {
  .container .item {
    flex-basis: 50%;
  }
}

@media (min-width:520px) and (max-width: 680px) {
  .container .item {
    flex-basis: 33.33%;
  }
}
<div class="container">

  <div class="item">
    <div class="item-child">1</div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>
  <div class="item">
    <div class="item-child"></div>
  </div>

</div>


1)无需创建子div。它可能是任何其他标签,例如'img'或您想要的任何标签
。2)如果您想要更多列,请调整媒体查询和最大列数。


这仅在最新的IE中创建了3个
-Akxe,

6

如果您想要一个网格,在项目之间和项目之间都留有一定的空间,而没有任何初始空间,那么可以使用以下简单的解决方案:

.grid {
    display: flex;
    flex-flow: row wrap;
    margin: 0 -5px; // remove the inital 5px space
    width: auto;
}
.grid__item {
    width: 25%;
    padding: 0 5px; // should be same as the negative margin above.
}

如果您想要初始的5px空间,则只需删除负边距即可:)简单。

https://jsfiddle.net/b97ewrno/2/

可接受的答案虽然很好,但它导致第二行的元素之间没有空格。


1
感到惊讶的是,这没有更多的赞成票。这是Flex博物馆中的一种精美方法。
Eduardo La Hoz Miranda

1
@EduardoLaHozMiranda谢谢!但是为什么要“博物馆”呢?IE11不支持CSS网格,大多数站点仍需要支持CSS网格。+前端开发中的一些大型计时器仍然声称网格与弹性框有不同的用例。但是,也许您只是
想说

1
哈哈,是啊。当时我很兴奋。只是意味着这是解决此问题的好方法。
Eduardo La Hoz Miranda

@dencey,您无需知道此解决方案的效率,即每行最多25%,即25%,但您可以使用任意百分比
OZZIE

@OZZIE我的意思是项目宽度是固定的(例如100px),但是容器宽度是动态的,因此每行的项目是动态的。
dencey

4

如果要将最后一项与网格对齐,请使用以下代码:

网格容器

.card-grid {
  box-sizing: border-box;
  max-height: 100%;
  display: flex;
  flex-direction: row;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
  justify-content: space-between;
  align-items: stretch;
  align-content: stretch;
  -webkit-box-align: stretch;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
  -ms-flex-flow: row wrap;
  flex-flow: row wrap;
}

.card-grid:after {
  content: "";
  flex: 1 1 100%;
  max-width: 32%;
}

网格中的项目

.card {
  flex: 1 1 100%;
  box-sizing: border-box;
  -webkit-box-flex: 1;
  max-width: 32%;
  display: block;
  position: relative;

}

技巧是将项目的最大宽度设置为等于.card-grid:after的最大宽度。

在Codepen上进行现场演示


cthulu祝福您和您的计算机
L422Y

3
当卡的大小固定并且每行中的卡数未知时,此方法不起作用。codepen.io/zendu/pen/WXNGvo
zen17年

3

可以使用“弹性启动”并手动添加边距。它需要一些数学技巧,但是绝对容易实现,并且可以轻松地与LESS之类的CSS预处理器一起使用。

例如,请参见以下LESS混合:

.flexboxGridMixin(@columnNumber,@spacingPercent) {
  @contentPercent: 100% - @spacingPercent;
  @sideMargin: @spacingPercent/(@columnNumber*2);
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: flex-start;
  > * {
    box-sizing: border-box;
    width: @contentPercent/@columnNumber;
    margin-left: @sideMargin;
    margin-right: @sideMargin;
  }
}

然后可以轻松地使用它来显示响应式网格布局:

ul {
  list-style: none;
  padding: 0;
  @spacing: 10%;
  @media only screen and (max-width: 499px) { .flexboxGridMixin(1,@spacing); }
  @media only screen and (min-width: 500px) { .flexboxGridMixin(2,@spacing); }
  @media only screen and (min-width: 700px) { .flexboxGridMixin(3,@spacing); }
  @media only screen and (min-width: 900px) { .flexboxGridMixin(4,@spacing); }
  @media only screen and (min-width: 1100px) { .flexboxGridMixin(5,@spacing); }
}

li {
  background: pink;
  height: 100px;
  margin-top: 20px;
}

这是一个例子

http://codepen.io/anon/pen/YyLqVB?editors=110


您永远不会使用@contentPercent。你打算吗
neverfox

宽度:@ contentPercent / @ columnNumber;
realtebo

哇 !这个解决方案给我留下了深刻的印象。我会尝试适应我的情况
realtebo '17

3

使用CSS网格为我解决了这个问题,

仅当您具有固定的列数(即否)时,此解决方案才适用。在单行中显示的元素数

->使用网格但不指定行数,因为元素数增加,它会绕入列并动态添加行,在此示例中我指定了三列

->您不必为您的孩子/牢房提供任何位置,因为它可以解决这个问题,这是我们不希望的。

.grid-class{
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  column-gap: 80px;
}


1

此版本是固定宽度块的最佳方法:

http://codepen.io/7iomka/pen/oxxeNE

在其他情况下-dalgard版本

http://codepen.io/dalgard/pen/Dbnus

body {
  padding: 5%;
}

div {
  overflow: hidden;
  background-color: yellow;
}

ul {
  display: flex;
  flex-wrap: wrap;
justify-content:center;
  margin: 0 -4px -4px 0;
  list-style: none;
  padding: 0;
}

li {
  flex: 1 0 200px;
  height: 200px;
  max-width:200px;
  min-width:200px;
  border-right: 4px solid black;
  border-bottom: 4px solid black;
  background-color: deeppink;
}
li:empty {
  height: 0;
  border: none;
}

*,
:before,
:after {
  box-sizing: border-box;
}
<div>
  <ul>
    <li>a</li>
    <li>b</li>
    <li>c</li>
    <li>d</li>
    <li>e</li>
    <li>f</li>
    <li>g</li>
    <li>h</li>
    <li>i</li>
    <li>j</li>
    <li>k</li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
  </ul>
</div>


0

有一种没有flexbox的方法,尽管您需要满足以下条件。1)容器有填充物。2)项目大小相同,您确切知道每行要多少个。

ul {
  padding: 0 3% 0 5%;
}
li {
  display: inline-block; 
  padding: 0 2% 2% 0;
  width: 28.66%;
}

容器右侧的较小填充允许在每个列表项的右侧添加额外的填充。假设与列表对象在同一父级中的其他项目填充0 5%,则将与它们齐平。您还可以将百分比调整为所需的余量,或使用计算px值。

当然,您可以通过使用nth-child(IE 9+)来删除第三个框上的边距来在容器上进行填充而无需填充。


0

使用flexbox和一些媒体查询,我做了以下小变通方法:http ://codepen.io/una/pen/yNEGjv(虽然有点笨拙,但是可以工作):

.container {
  display: flex;
  flex-flow: row wrap;
  justify-content: flex-start;
  max-width: 1200px;
  margin: 0 auto;
}

.item {
  background-color: gray;
  height: 300px;
  flex: 0 30%;
  margin: 10px;

  @media (max-width: 700px) {
     flex: 0 45%;
  }

  @media (max-width: 420px) {
    flex: 0 100%;
  }

  &:nth-child(3n-1) {
    margin-left: 10px;
    margin-right: 10px;
  }
}

0

我为此做了一个SCSS mixin。

@mixin last-row-flexbox($num-columns, $width-items){

  $filled-space: $width-items * $num-columns;
  $margin: calc((100% - #{$filled-space}) / (#{$num-columns} - 1));

  $num-cols-1 : $num-columns - 1;

  &:nth-child(#{$num-columns}n+1):nth-last-child(-n+#{$num-cols-1}) ~ & {
    margin-left: $margin;
  }
  @for $i from 1 through $num-columns - 2 { 
    $index: $num-columns - $i;
    &:nth-child(#{$num-columns}n+#{$index}):last-child{
      margin-right: auto;
    }
  }
}

这是codepen链接:http ://codepen.io/diana_aceves/pen/KVGNZg

您只需要以百分比和列数设置项目宽度。

希望对您有所帮助。


0

这是另外两个scss mixins。

这些mixins假定您将不使用Isotope之类的js插件(它们不遵守html标记顺序,因此会干扰css nth规则)。

另外,您将能够充分利用它们,尤其是当您以移动优先方式编写响应式断点时。理想情况下,您将在较小的断点上使用flexbox_grid(),在以下断点上使用flexbox_cell()。flexbox_cell()将负责重置不再在较大的断点上使用的先前设置的边距。

顺便说一句,只要您正确设置了容器的flex属性,就可以在项目上仅使用flexbox_cell()。

这是代码:

// apply to the container (for ex. <UL> element)
@mixin flexbox_grid($columns, $gutter_width){

  display: flex;
  flex-direction:row;
  flex-wrap:wrap;
  justify-content: flex-start;

  > *{
    @include flexbox_cell($columns, $gutter_width);
  }
}

// apply to the cell (for ex. a <LI> element)
@mixin flexbox_cell($columns, $gutter_width){
  $base_width: 100 / $columns;
  $gutters: $columns - 1;
  $gutter_offset: $gutter_width * $gutters / $columns;

  flex-grow: 0;
  flex-shrink: 1;
  flex-basis: auto; // IE10 doesn't support calc() here

  box-sizing:border-box; // so you can freely apply borders/paddings to items
  width: calc( #{$base_width}% - #{$gutter_offset} );

  // remove useless margins (for cascading breakponts)
  &:nth-child(#{$columns}n){
    margin-right: 0;
  }

  // apply margin
  @for $i from 0 through ($gutters){
    @if($i != 0){
      &:nth-child(#{$columns}n+#{$i}){
        margin-right: $gutter_width;
      }
    }
  }
}

用法:

ul{
   // just this:
   @include flexbox_grid(3,20px);
}

// and maybe in following breakpoints, 
// where the container is already setted up, 
// just change only the cells:

li{
   @include flexbox_cell(4,40px);
}

显然,最终由您来设置容器的填充/边距/宽度和单元格的底部边距等。

希望能帮助到你!


0

这很hacky,但是对我有用。我试图实现一致的间距/边距。

.grid {
  width: 1024px;
  display: flex;
  flex-flow: row wrap;
  padding: 32px;
  background-color: #ddd;  

  &:after {
    content: "";
    flex: auto;
    margin-left:-1%;
  }

  .item {
    flex: 1 0 24.25%;
    max-width: 24.25%;
    margin-bottom: 10px;
    text-align: center;
    background-color: #bbb;

    &:nth-child(4n+2),
    &:nth-child(4n+3),
    &:nth-child(4n+4) {
      margin-left: 1%;
    }

    &:nth-child(4n+1):nth-last-child(-n+4),
      &:nth-child(4n+1):nth-last-child(-n+4) ~ .item {
        margin-bottom: 0;
    }    

  }
}

http://codepen.io/rustydev/pen/f7c8920e0beb0ba9a904da7ebd9970ae/


0

似乎没有人在最后一项上提出弹性增长解决方案。这个想法是让您的最后一个flex项目使用flex-grow占据所有可能的位置:1。

.grid {
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
}

.grid > *:last-child {
  flex-grow: 1;
}

注意:此解决方案不是完美的,尤其是如果您在flex项内有居中元素,因为它会在可能巨大的最后一个flex项上居中。


0

这是很多答案的组合,但它确实满足了我的需要-也就是说,将flex容器中的最后一个孩子向左对齐,同时保持间隔行为(在这种情况下,它是一个三列)布局)。

这是标记:

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

.flex-container:after {
  content: "";
  flex-basis: 30%;
}

1
要更通用:flex-basis大小必须等于孩子的大小。
Christian Toffolo

1
我发现对于任何数量的列,它都可以flex-grow: 0.9代替flex-basis工作。经测试,在一堆现代浏览器-它的作品在他们所有,但填充在IE浏览器坏了(但EDGE0工作
Patabugen

0

假设:

  • 您需要带包装的4列网格布局
  • 项目数不一定是4的倍数

在除第一个,第五个和第九个项目之外的其他所有项目上设置左页边距。如果左边距为10px,则每行将有30px的边距分布在4个项目中。项目的宽度百分比计算如下:

100% / 4 - horizontal-border - horizontal-padding - left-margin * (4 - 1) / 4

对于涉及Flexbox最后一行的问题,这是一个不错的解决方法。

.flex {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  margin: 1em 0 3em;
  background-color: peachpuff;
}

.item {
  margin-left: 10px;
  border: 1px solid;
  padding: 10px;
  width: calc(100% / 4 - 2px - 20px - 10px * (4 - 1) / 4);
  background-color: papayawhip;
}

.item:nth-child(4n + 1) {
  margin-left: 0;
}

.item:nth-child(n + 5) {
  margin-top: 10px;
}
<div class="flex">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
</div>
<div class="flex">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5</div>
  <div class="item">6</div>
</div>
<div class="flex">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5</div>
  <div class="item">6</div>
  <div class="item">7</div>
  <div class="item">8</div>
  <div class="item">9</div>
</div>


0

如果知道行中元素之间的间隔宽度和行中元素的数量,则可以这样做:

示例:连续3个元素,元素之间的间距为10px

div:last-child:nth-child(3n+2) {
  flex-grow: 1
  margin-left: 10px
}


-1

哦,男孩,我认为我找到了一个使用最少的CSS而没有JS的好的解决方案。一探究竟:

img {width:100%;}
li {
  display: inline-block;
  width:8em;
  list-style:none;
}
ul {text-align: justify;}
<ul>
  <li>
    <img src="http://www.planwallpaper.com/static/images/kitty-cat.jpg" />
  </li>
  <li>
    <img src="http://www.planwallpaper.com/static/images/kitty-cat.jpg" />
  </li>
  <li>
    <img src="http://www.planwallpaper.com/static/images/kitty-cat.jpg" />
  </li>
  <li>
    <img src="http://www.planwallpaper.com/static/images/kitty-cat.jpg" />
  </li>
  <li>
    <img src="http://www.planwallpaper.com/static/images/kitty-cat.jpg" />
  </li>
  <li>
    <img src="http://www.planwallpaper.com/static/images/kitty-cat.jpg" />
  </li>
  <li>
    <img src="http://www.planwallpaper.com/static/images/kitty-cat.jpg" />
  </li>
  <li>
    <img src="http://www.planwallpaper.com/static/images/kitty-cat.jpg" />
  </li>
  <li>
    <img src="http://www.planwallpaper.com/static/images/kitty-cat.jpg" />
  </li>
  <li>
    <img src="http://www.planwallpaper.com/static/images/kitty-cat.jpg" />
  </li>
  <li>
    <img src="http://www.planwallpaper.com/static/images/kitty-cat.jpg" />
  </li>
  <li>
    <img src="http://www.planwallpaper.com/static/images/kitty-cat.jpg" />
  </li>
  <li>
    <img src="http://www.planwallpaper.com/static/images/kitty-cat.jpg" />
  </li>
  <li>
    <img src="http://www.planwallpaper.com/static/images/kitty-cat.jpg" />
  </li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
</ul>

这里的关键是要记住,我们正在努力实现的正是text-align: justify它所做的!

HTML中的空元素可以使最后一行完美显示而不改变外观,但是鉴于您要实现的目的,可能不需要。为了在每种情况下实现完美平衡,您至少需要x-4个空元素,x是要显示的元素数,或者n-2,n是要显示的列数。


-1

只需添加一些具有相同属性的假物品,除了最后将高度设置为0px即可。


添加假冒物品在每种情况下都是不好的做法。除非它是强制性的,否则您不应该在DOM中充斥只是为了破解CSS的东西。出于多种原因,从可访问性到用怪异的东西充斥代码库,再到使逻辑变得更复杂,人们难以理解和列举。除非您明确地说这可能是一个不好的解决方案,或者有特殊情况,否则请不要推荐黑客。
Eksapsy

-4

你想对齐

align-content: flex-start;代替justify-content: space-between;

这会将项目的最后一行拉到左侧,并且均匀地分配空间,

.container {
  display: flex;
  flex-flow: row wrap;
  align-content: flex-start;
  /*justify-content: space-between; remove this line!!!! */ 
}

https://codepen.io/anon/pen/aQggBW?editors=1100


danAnderson解决方案不是动态的。PERİOD!

当项目宽度从25更改为28丹·安德森时,图像之间的空间不足

danAnderson:https ://codepen.io/anon/pen/ZwYPmB ? editors = 1100

动态:https//codepen.io/anon/pen/aQggBW?editors = 1100

那就是我一直想说的。dans hacky .....


-7

我能够justify-content: space-between在容器上做到这一点

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.