我有一个简单的 flex-box 布局,其中包含一个容器,例如:
.grid {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
}
现在我希望最后一行中的项目与其他项目对齐。应该使用 justify-content: space-between;
,因为可以调整网格的宽度和高度。
目前它看起来像
https://i.stack.imgur.com/UrT6g.png
在这里,我希望右下角的项目位于“中间列”中。实现这一目标的最简单方法是什么?这是一个显示此行为的小 jsfiddle。
.exposegrid { 显示:弹性; flex-flow:换行; justify-content: 之间的空格; } .exposetab { 宽度:100px;高度:66px;背景颜色:rgba(255, 255, 255, 0.2);边框:1px 实心 rgba(0, 0, 0, 0.4);边框半径:5px;盒子阴影:1px 1px 2px rgba(0, 0, 0, 0.2);边距底部:10px; }
添加一个自动填充空间的 ::after
。无需污染您的 HTML。这是一个显示它的代码笔:http://codepen.io/DanAndreasson/pen/ZQXLXj
.grid {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
}
.grid::after {
content: "";
flex: auto;
}
正如其他海报所提到的 - 没有干净的方法将最后一行与 flexbox 左对齐(至少按照当前规范)
然而,值得一提的是:使用 CSS Grid Layout Module,这非常容易产生:
基本上相关代码归结为:
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-fill 的使用(与 auto-fit
相对 - 它(对于 1 行布局)将空轨道折叠为 0 - 导致项目展开以占用剩余空间。这将导致合理的 ' space-between' 布局,当网格只有一行时,这在我们的例子中不是我们想要的。(查看 this demo 以查看它们之间的区别)。
3)为网格行和列设置间隙/排水沟 - 在这里,因为想要一个“间隔”布局 - 间隙实际上是最小间隙,因为它会根据需要增长。
4) 类似于弹性盒。
ul {显示:网格;网格模板列:重复(自动填充,100px);网格间隙:1rem; justify-content: 之间的空格; /* 无聊的属性 */ list-style: none;背景:小麦;填充:2rem;宽度:80vw;边距:0 自动; } li { 高度:50px;边框:1px 纯绿色; }
Codepen Demo(调整大小看效果)
:after
伪元素可能会导致不需要的结果。
一种技术是插入一些额外的元素(与您期望在一行中拥有的最大元素数一样多),这些元素的高度为零。空间仍然被分割,但多余的行倒塌为空:
http://codepen.io/dalgard/pen/Dbnus
身体{填充:5%; } div { 溢出:隐藏;背景颜色:黄色; } ul { 显示:弹性;弹性包装:换行;边距:0 -4px -4px 0;列表样式:无;填充:0; } li { 弹性:1 0 200px;高度:200px;右边框:4px 纯黑色;边框底部:4px 纯黑色;背景颜色:深粉色; } li:empty { 高度: 0;边框:无; } *, :before, :after { box-sizing:border-box; }
将来,这可能会通过使用多个 ::after(n)
来实现。
没有任何额外的标记,只需添加 ::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>
flex-basis: 10em
而不是宽度,那就更好了。
我知道这里有很多答案,但是.. 最简单的方法是使用 grid
而不是 flex
和 grid template columns
与 repeat
和 auto fills
,您必须在其中设置像素数您从代码段中为每个元素提供了 100px
。
.exposegrid { 显示:网格;网格模板列:重复(自动填充,100px); justify-content: 之间的空格; } .exposetab { 宽度:100px;高度:66px;背景颜色:rgba(255, 255, 255, 0.2);边框:1px 实心 rgba(0, 0, 0, 0.4);边框半径:5px;盒子阴影:1px 1px 2px rgba(0, 0, 0, 0.2);边距底部:10px; }
你不能。 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;
}
一种可能的解决方案是在 .grid
容器上使用 justify-content: flex-start;
,对其子元素使用大小限制,并在 适当的子元素上使用边距 - 取决于所需的列数。
对于 3 列网格,基本 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
如果您想要一个在项目之间有一些空间的网格,并且项目开始时没有任何初始空间,那么这个简单的解决方案可以工作:
.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/
接受的答案虽然很好,但它会导致第二行的元素之间没有空格..
你也可以这样做:
.exposegrid:last-child {
margin-right: auto;
}
space-between
提供的元素之间的所有间距。
使用 CSS 网格为我解决了这个问题,
此解决方案仅适用于您拥有固定数量的列,即否。要在单行中显示的元素
-> 使用网格但不指定行数,随着元素数量的增加,它会包含在列中并动态添加行,我在此示例中指定了三列
-> 你不必给你的孩子/细胞任何位置,因为它会修复它,这是我们不想要的。
.grid-class{
display: grid;
grid-template-columns: repeat(3, 1fr);
column-gap: 80px;
}
是的。!我们可以,但有一些媒体查询和预定义的最大列数。
这里使用 4 列。检查我的代码:
.container { 显示:弹性;显示:-webkit-flex;显示:-moz-flex; flex-flow:换行; -webkit-flex-flow:换行; -moz-flex-flow:换行; } .container .item { 显示:弹性;显示:-webkit-flex;显示:-moz-flex;证明内容:中心; -webkit-justify-content:中心; -moz-justify-content:中心;弹性基础:25%; //最大列数 %, 25% = 4 Columns } .container .item .item-child { width: 130px;高度:180px;背景:红色;边距: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%; } }
注意 1) 无需创建子 div。它可以是任何其他标签,如 'img' r 任何你想要的。2)如果你想要更多列,请调整媒体查询和最大列数。
如果要将最后一项与网格对齐,请使用以下代码:
网格容器
.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 的最大宽度。
可以使用“flex-start”并手动添加边距。它需要一些数学技巧,但绝对很容易做到,并且可以很容易地与像 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
这是很多答案的组合,但它正是我所需要的——也就是说,将 flex 容器中的最后一个子元素向左对齐,同时保持间隔行为(在这种情况下,它是一个三列布局)。
这是标记:
.flex-container {
display: flex;
justify-content: space-between;
flex-direction: row;
}
.flex-container:after {
content: "";
flex-basis: 30%;
}
flex-grow: 0.9
而不是 flex-basis
适用于任意数量的列。在一堆现代浏览器中测试 - 它适用于所有浏览器,但填充在 IE 中被破坏(但在 Edge0 中工作
如果您希望网格视图中的项目与最后一个元素的距离相等。确保您的卡片宽度为 100% 使用以下 css。这工作得很好
.container {
/* ... snip ... */
display: grid;
grid-template-columns: repeat(auto-fill, 100px);
justify-content: space-between;
grid-gap: 20px;
}
此版本是固定宽度块的最佳方式:
http://codepen.io/7iomka/pen/oxxeNE
在其他情况下 - dalgard 版本
http://codepen.io/dalgard/pen/Dbnus
身体{填充:5%; } div { 溢出:隐藏;背景颜色:黄色; } ul { 显示:弹性;弹性包装:换行;证明内容:中心;边距:0 -4px -4px 0;列表样式:无;填充:0; } li { 弹性:1 0 200px;高度:200px;最大宽度:200px;最小宽度:200px;右边框:4px 纯黑色;边框底部:4px 纯黑色;背景颜色:深粉色; } li:empty { 高度: 0;边框:无; } *, :before, :after { box-sizing:border-box; }
只需添加几个具有相同属性的假项目,除了高度设置为 0px 到最后。
即使 Flexbox 出现了差距,我也会添加一个可行的解决方案。
它使用兄弟组合器来检查 2 个条件。
它检查的第一个条件是元素是否是倒数第二个 div:nth-last-child(2)
对于 4 列布局,我们需要检查位置 2 和3 检查它是在 4 个div:nth-of-type(4n+2)
的第二行还是在一个行的第三个 div:nth-of-type(4n+3)
对于 3 列布局,我们只需要检查位置 2
div:nth-of-type(3n+2)
然后我们可以像下面这样组合 4 列布局
div:nth-last-child(2) + div:nth-of-type(4n+2)
div:nth-last-child(2) + div:nth-of-type(4n+3)
我们还需要处理一种极端情况,即 3n+2 和4 的倍数将获得 35% 的边距右 div:nth-last-child(2) + div:nth-of-type(4n+4)
3列布局将是
div:nth-last-child(2) + div:nth-of-type(3n+2)
然后我们需要为上面的选择器添加一个边距。需要计算margin-right,这取决于flex-basis。
我添加了一个包含 3 列和 4 列的示例以及一个媒体查询。我还添加了一个小的 JavaScript 按钮,它添加了一个新的 div,以便您检查它是否有效。
它是一点点 CSS,但它可以工作。如果您需要更多解释,我也在我的网站上写过这个。 https://designkojo.com/css-programming-using-css-pseudo-classes-and-combinators
变量编号 = 11; $("#add").on("click", function() { number = number + 1; $("#main").append("
.grid
中删除了justify-content: space-between;
并删除了.grid:after
,它的工作原理相同。现在,如果您尝试 like this,它会完全崩溃。请注意,每组 4 个的宽度加起来不等于 100%。在 OP's fiddle 中,宽度以 px 为单位设置,因此您的解决方案 doesn't work 这种情况。space-between
正确分布。但是,当我将.grid:after
的flex-basis
设置为与网格中其他项目相同的大小(每个断点,覆盖上述默认/基本模块代码)时,最后一行正确展开。似乎可以在 Safari、iOS、Firefox、Chrome 上运行(需要测试 IE),并且在我最初的实现中我最大的行大小是 3。{ content: "";flex: 0 0 32%;max-width: 480px;}
并且我通过媒体查询更改更改了最大宽度,因此网格在所有宽度上都是完美的。