ChatGPT解决这个技术问题 Extra ChatGPT

设置弹性盒项目之间距离的更好方法

为了设置 flexbox 项目之间的最小距离,我在 .item 上使用 margin: 0 5px,在容器上使用 margin: 0 -5px。对我来说,这似乎是一个 hack,但我找不到更好的方法来做到这一点。

#box { 显示:弹性;宽度:100px;边距:0 -5px; } .item { 背景:灰色;宽度:50px;高度:50px;边距:0 5px; }

这不是 hack - 它是对齐项目的预期方法之一。不过还有其他属性。请参阅w3.org/TR/css3-flexbox/#alignment
是的,我明白了。但是例如,有 column-gap 属性使我们能够控制与容器的距离:w3.org/TR/css3-multicol/#column-gap
当然,这是 flexbox 的边距塌陷。另一个问题是 [如何阻止 flexbox 中的最后一个边距塌陷? ](stackoverflow.com/questions/38993170/…)
CSS Box Alignment Module Level 3 包括关于 gaps between boxes 的部分 - 适用于多列元素、弹性容器和网格容器。所以最终这将很简单:row-gap: 5px - 完成。
这是我对 flexbox 的首选参考:css-tricks.com/snippets/css/a-guide-to-flexbox 希望您能理解!

g
guettli

Flexbox 没有折叠边距。

Flexbox 没有任何类似于表格边框间距的功能(编辑:CSS 属性间隙在较新的浏览器中发挥了这个作用,我可以使用吗)

因此,实现你所要求的有点困难。

根据我的经验,不使用 :first-child/:last-child 且无需对 flex-wrap:wrap 进行任何修改即可工作的“最干净”方式是在容器上设置 padding:5px,在子级上设置 margin:5px。这将在每个孩子之间以及每个孩子与其父母之间产生10px差距。

Demo

.upper { 边距:30px;显示:弯曲;弹性方向:行;宽度:300px;高度:80px;边框:1px 红色实心;填充:5px; /* 这个 */ } .upper > div { flex: 1 1 auto;边框:1px 红色实心;文本对齐:居中;边距:5px; /* 那将导致 10px 的间隙 */ } .upper.mc /* multicol test */ { flex-direction: column;弹性包装:换行;宽度:200px;高度:200px; }

aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa< /div>
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa


这并没有完成与问题相同的事情,您将在最左边和最右边有一个 10px 的缩进,我假设他们不打算这样做。因此,原始问题中的负边距。
如果设置了 order 属性呢? :first-child/:last-child 不会按预期工作。
“Flexbox 没有折叠边距。”非常有见地,而且显然是正确的,但我可以要求引用吗?
这不是比原来的问题更糟糕的答案吗?此方法要求您在容器周围留出空间,并且排水沟必须始终为偶数。
@chharvey,来自规范 w3.org/TR/css-flexbox-1/#item-margins,“相邻弹性项目的边距不会折叠。”
F
Flimm

CSS 间隙属性:

新的 gap CSS property 用于多列、flexbox 和网格布局,现在可以在较新的浏览器中使用! (请参阅我可以使用 link 1link 2)。它是 row-gapcolumn-gap 的简写。

#box {
  display: flex;
  gap: 10px;
}

CSS 行间距属性:

flexbox 和网格布局的 row-gap CSS property 允许您在行之间创建间隙。

#box {
   display: flex;
   row-gap: 10px;
}

CSS column-gap 属性:

用于多列、弹性框和网格布局的 column-gap CSS property 允许您在列之间创建间隙。

#box {
  display: flex;
  column-gap: 10px;
}

例子:

#box { 显示:弹性;弹性包装:换行;宽度:200px;背景颜色:红色;间隙:10px; } .item { 背景:灰色;宽度:50px;高度:50px;边框:1px 黑色实心; }


它不适用于我的 Windows 10 + Chrome 90.0.4430。它的作用类似于边距,第四个元素换行。请在我的显示器上查看您自己的片段的屏幕截图 i2.paste.pics/a1f42d884cb5a64ddf80632e87178869.png
@MarcoPanichi 您看到的结果是预期的结果。注意每行的第一个项目之前没有红色边距。如果您不想换行,可以将其关闭:flex-wrap: nowrap。您可能还想尝试:justify-content: space-between
我使用这种方法面临的一个限制是,如果有两列需要与其他列不同的间隙,那么您将无法实现。
@sallushan Flex 布局本身没有列。如果您需要不同列的不同间隙等功能,那么我推荐 CSS 网格,而不是 flex。
我不会在 flex box 上使用“gap”(如果我错了,请纠正我,但它更适合显示:网格),因为它会使列过早换行。最好坚持旧的边距/填充解决方案。示例:jsfiddle.net/wmtz8dch/1
R
Roumelis George

这不是黑客攻击。 bootstrap 及其网格也使用了相同的技术,但是 bootstrap 使用 padding 代替 margin。

.row {
  margin:0 -15px;
}
.col-xx-xx {
  padding:0 15px;
}

此方法的唯一问题是保持具有背景颜色的高度相等的项目。使用 height:100%; width:100% 进行绝对定位会忽略项目的填充。
这里的问题在于 IE10 和 11。flex-basis 值不考虑 box-sizing: border-box,因此具有任何填充或边框的子级将溢出父级(或在这种情况下换行)。 Source
这种方法还有一个问题:像这样调整页边距可以扩大页面宽度。演示:jsfiddle.net/a97tatf6/1
尽管我同意这不是 hack,但被广泛使用的事实并不意味着它不是 hack。查看 polyfills、临时安全补丁、十六进制编辑等
当然,这是一个 hack。因为 Bootstrap 使用这种方法并不意味着它不是 hack。这只是意味着 Bootstrap 使用了 hack。
D
Dariusz Sikorski

具有多行支持的 Flexbox 和 css calc

您好,下面是我对所有支持 flexbox 的浏览器的工作解决方案。没有负边距。

Fiddle Demo

.flexbox { 显示:弹性;弹性方向:行;弹性包装:换行; justify-content: 之间的空格; } .flexbox > div { /* 1/3 - 每行 3 列 10px - 列间距 */ box-sizing: border-box;边距:10px 10px 0 0;轮廓:1px 点缀红色;宽度:计算(1/3*100% - (1 - 1/3)*10px); } /* 将最后一行的列左对齐 3n - 每行 3 列 */ .flexbox > div:nth-child(3n) { margin-right: 0; } .flexbox::after { 内容:'';弹性:自动; } /* 删除第一行的上边距 -n+3 - 每行 3 列 */ .flexbox > div:nth-child(-n+3) { margin-top: 0; }

col
col
col
col
col
< /div>

请注意,此代码可以使用 SASS 更短

更新 2020.II.11 左侧最后一行的对齐列

2020.II.14 更新删除了最后一行的 margin-bottom


我喜欢这个解决方案,但如果最后一行只有 2 个项目,它会失败。由于 justify-content,这些项目没有堆叠在一起。
要解决这两项问题,只需更改为 justify-content: space-evenly;justify-content: space-around;
@PaulRooney 在有多个列表的站点上,如果列表是由 CMS 生成的,您可能并不总是知道项目的数量。
不幸的是,这个解决方案没有响应,而负边距是。
T
TylerH

您可以使用 & > * + * 作为选择器来模拟 flex-gap(对于单行):

#box { 显示:弹性;宽度:230px;轮廓:1px 纯蓝色; } .item { 背景:灰色;宽度:50px;高度:100px; } /* ----- Flexbox 间隙: ----- */ #box > * + * { margin-left: 10px; }

如果你需要支持 flex wrapping,你可以使用一个 wrapper 元素:

.flex { 显示:弹性;弹性包装:换行; } .box { 背景:灰色;高度:100px;最小宽度:100px;弹性:自动; } .flex-wrapper {outline: 1px 纯红色; } /* ----- 弹性间隙 10px: ----- */ .flex > * { margin: 5px; } .flex { 边距:-5px; } .flex-wrapper { 宽度:400px; /* 可选 */ 溢出:隐藏; /* 可选 */ }


但需要注意的一点是,* 运算符不会像您预期的那样增加特异性。因此,根据您现有的 css,您可能需要增加 .flex > * 选择器的特异性,或者如果有其他选择器对该元素应用边距,则将 !important 添加到规则中。
如果您在移动设备上有按钮宽度:100%,这将不起作用
T
Tracker1

您可以使用透明边框。

我在尝试构建一个可以回退到旧浏览器的表格 + 表格单元模型的弹性网格模型时考虑了这个问题。在我看来,列装订线的边框是最合适的选择。即表格单元没有边距。

例如

.column{
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  border-bottom: 10px solid transparent;
}

另请注意,flexbox 需要 min-width: 50px;。 flex 模型不会处理固定大小,除非您对希望固定的特定子元素执行 flex: none;,因此将其排除在 "flexi" 之外。 http://jsfiddle.net/GLpUp/4/ 但所有列连同 flex:none; 不再是弹性模型。这是更接近 flex 模型的东西:http://jsfiddle.net/GLpUp/5/

因此,如果您不需要旧浏览器的表格单元回退,您实际上可以正常使用边距。 http://jsfiddle.net/GLpUp/3/

使用背景时需要设置 background-clip: padding-box;,否则背景会流入透明边框区域。


很好的答案。在 flexbox 中,边距的使用方式不同(比如吸收额外的空间),因此透明边框为均匀间隔的元素提供了一个很好的解决方案,这些元素可以用类似边距的行为进行包装
除非您使用背景颜色,否则您的背景会超出您想要的范围。
@ahnbizcad 使用不同的背景颜色,您可以使用白色或适当的颜色,具体取决于背景的方式。
@ahnbizcad:如果您不需要 IE8 支持,这是一个更好的解决方案:background-clip: padding-box
阿尔宾在这里的评论需要更多的选票!这是最好的解决方案。透明边框,结合 background-clip: padding-box (以及容器上的负边距,如果需要,以进行正确的边缘对齐)是一个完美的解决方案。 IE8 无论如何都不支持 flexbox,所以它不支持背景剪辑应该无关紧要。
T
TylerH

即使有多行或任意数量的元素,此解决方案也适用于所有情况。但是该部分的计数应该与您想要的第一行中的 4 和第二行中的 3 相同,这样第四个内容的空间将是空白的,容器不会填充。

我们正在使用 display: grid; 及其属性。

#box { 显示:网格;宽度:100px;网格间隙:5px; /* 项目之间的空间 */ grid-template-columns: repeat(4,1fr); /* 决定列数(4) 和大小(1fr | 1 Fraction | 你也可以使用像素和其他值) */ } .item { background: gray;宽度:100%; /* 宽度不是必需的,仅添加这个是为了理解宽度作为网格模板分配空间的 100% **默认宽度将是 100%** */ 高度:50px; }

此方法的缺点是在 Mobile Opera Mini 中不支持,在 PC 中只能在 IE10 之后使用。

Note for complete browser compatability including IE11 please use Autoprefixer

旧答案不要将其视为旧解决方案,如果您只想要单行元素并且它适用于所有浏览器,它仍然是最好的解决方案之一。

此方法用于 CSS 兄弟组合,因此您也可以通过许多其他方式对其进行操作,但如果您的组合错误,也可能会导致问题。

.item+.item{
  margin-left: 5px;
}

下面的代码可以解决问题。在这种方法中,不需要将 margin: 0 -5px; 赋予 #box 包装器。

适合您的工作样本:

#box { 显示:弹性;宽度:100px; } .item { 背景:灰色;宽度:22px;高度:50px; } .item+.item{ 左边距:5px; }


我已经编辑了您基于网格的答案,以证明它确实可以正常工作,即使最后一行的项目较少。为了证明它在这种情况下有效。 (如果您不喜欢此更改,请随时恢复。)
根据这个问题,他们只要求用子元素正确填充空间而无需破解,我所做的就是使用网格,我们可以根据我们定义的grid-template-columns而不是动态地进行管理。因此,如果您将值赋予 1fr 1fr 1fr 1fr,那么它会将 div 拆分为 4fractions 并尝试填充每个 fractions 中的子元素,据我所知,这是 grid 中的唯一方法。我在答案中所说的是,如果用户需要将 div 拆分为 4 并将它们与许多元素一起使用,即使是多行,gid 也会有所帮助。
S
Stickers

假设如果您想在项目之间设置 10px 空间,您可以为所有项目设置 .item {margin-right:10px;},然后将其重置为最后一个 .item:last-child {margin-right:0;}

您还可以使用通用兄弟 ~ 或下一个 + 兄弟选择器来设置除第一个 .item ~ .item {margin-left:10px;} 之外的项目的左边距或使用 .item:not(:last-child) {margin-right: 10px;}

Flexbox 非常聪明,它会自动重新计算并平均分配网格。

身体{边距:0; } .container { 显示:弹性; } .item { 弹性:1;背景:灰色;高度:50px; } .item:not(:last-child) { margin-right: 10px; }

如果要允许 flex wrap,请参见以下示例。

身体{边距:0; } .container { 显示:弹性;弹性包装:换行;左边距:-10px; } .item { 弹性:0 0 计算(50% - 10px);背景:灰色;高度:50px;边距:0 0 10px 10px; }


如果项目被包装,这将不起作用,因为 :last-child 不会影响行尾的每个最后一个孩子,对吗?
@Flimm 我添加了一种使用 flex wrap 的方法,请参见上面的第二部分。
O
Ollie Williams

更新:现在所有现代浏览器(Edge/Chrome/Opera/Samsung Internet/Safari/Firefox)都支持 flexbox 的 gap

最终他们会将 gap 属性添加到 flexbox。在此之前,您可以使用已经具有 gap 属性的 CSS 网格,并且只有一行。比处理利润要好。


此处讨论:github.com/w3c/csswg-drafts/issues/1696 — 他们还将简化 CSS Grid、Flexbox 和 CSS Columns 的命名。
只提 Chromium 而不是 Edge/Chrome/Opera 可能没问题。还有,三星上网是主要浏览器吗?呜?无论如何,它也是 Chromium 驱动的。
T
TylerH

我找到了一个基于通用兄弟选择器 ~ 的解决方案,并允许无限嵌套。

See this code pen for a working example

基本上,在列容器内部,每个在另一个子元素之前的子元素都会获得上边距。同样,在每个行容器内,每个在另一个之前的子元素都有一个左边距。

.box { 显示:弹性;弹性增长:1;弹性收缩:1; } .box.columns { 弹性方向:行; } .box.columns>.box~.box { margin-left: 5px; } .box.rows { 弹性方向:列; } .box.rows>.box~.box { margin-top: 5px; }


由于未全局应用边距,这会导致不同大小的项目。
您还需要添加一些额外的 CSS 来处理较小的屏幕,因为它在移动设备上看起来有点奇怪,我会将 .box ~ .box 规则应用于较大的屏幕,对于较小的屏幕,将 .box 类设置为具有最大宽度100% 和保证金底部。
T
TylerH

根据 #ChromeDevSummit,在 Firefox and Chromium-based browsers 中实现了 Flexbox 的 gap 属性。

这是Live Demo


c
chris

从sawa的回答继续,这里有一个稍微改进的版本,它允许您在项目之间设置一个固定的间距,而没有周围的边距。

http://jsfiddle.net/chris00/s52wmgtq/49/

还包括 Safari “-webkit-flex” 版本。

.outer1 {
    background-color: orange;
    padding: 10px;
}

.outer0 {
    background-color: green;
    overflow: hidden;
}

.container
{
    display: flex;
    display: -webkit-flex;
    flex-wrap: wrap;    
    -webkit-flex-wrap: wrap;
    background-color: rgba(0, 0, 255, 0.5);
    margin-left: -10px;
    margin-top: -10px;
}

.item
{
    flex-grow: 1;
    -webkit-flex-grow: 1;
    background-color: rgba(255, 0, 0, 0.5);
    width: 100px;
    padding: 10px;
    margin-left: 10px;
    margin-top: 10px;
    text-align: center;
    color: white;
}

<div class="outer1">
    <div class="outer0">
        <div class="container">
            <div class="item">text</div>
            <div class="item">text</div>
            <div class="item">text</div>
            <div class="item">text</div>
            <div class="item">text</div>
            <div class="item">text</div>
        </div>
    </div>
</div>

这与问题中给出的示例基本相同吗?
V
Veiko Jääger

我已经将它用于包装和固定宽度的列。这里的关键是 calc()

SCSS 示例

$gap: 10px;

dl {
  display: flex;
  flex-wrap: wrap;
  padding: $gap/2;

  dt, dd {
    margin: $gap/2;}

  dt { // full width, acts as header
    flex: 0 0 calc(100% - #{$gap});}

  dd { // default grid: four columns 
    flex: 0 0 calc(25% - #{$gap});}

  .half { // hall width columns
    flex: 0 0 calc(50% - #{$gap});}

}

Full Codepen sample


这仍然会在第一个项目之前和最后一个项目之后添加一个装订线,OP 可以防止使用负边距。
Flexbox 不支持 IE 11 中“flex”项内的 calc()。
不能一直使用。想象一下直接孩子是否也需要边界
填充不是一个好的选择
T
Tim

具有 -x(负)边距的弹性容器和具有 x(正)边距或填充的弹性项目都会导致所需的视觉结果:弹性项目之间只有 2x 的固定间隙。

无论是在弹性项目上使用边距还是填充,这似乎只是一个偏好问题。

在这个例子中,弹性项目被动态缩放以保持固定间隙:

.flex-container { 
  margin: 0 -5px;
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
}

.flex-item {
  margin: 0 5px; // Alternatively: padding: 0 5px;
  flex: 1 0 auto;
}

抱歉,我没听懂。您的答案引入了哪些问题中未直接说明的新内容?
首先,我想总结一下弹性项目上的边距和填充都会导致预期的结果,因为现有的答案只提到一个或另一个。其次,我想举一个例子,通过缩放弹性项目本身来保留间隙。
这是一个显示此效果的 codepen 示例。 codepen.io/dalgard/pen/Dbnus
i
iClusterDev

在我的解决方案中使用 Flexbox 我已将 justify-content 属性用于父元素(容器),并在项目的 flex-basis 属性内指定了边距。检查下面的代码片段:

.container { 显示:弹性; flex-flow:换行; justify-content:空间环绕;边距底部:10px; } .item { 高度:50px;显示:弯曲;证明内容:中心;对齐项目:居中;背景颜色:#999; } .item-1-4 { 弹性基础:计算(25% - 10px); } .item-1-3 { 弹性基础:计算(33.33333% - 10px); } .item-1-2 { 弹性基础:计算(50% - 10px); }

1
2
3
4
1
2
3
1
2


不错啊啊啊啊啊
M
Michael Benjamin

使用 flexbox,创建排水沟是一件很痛苦的事情,尤其是在涉及包装时。

您需要使用负边距 (as shown in the question):

#box {
  display: flex;
  width: 100px;
  margin: 0 -5px;
}

...或更改 HTML (as shown in another answer):

<div class='flex-wrapper'>
  <div class='flex'>
    <div class='box'></div>
    <div class='box'></div>
            ...
  </div>
</div>

... 或者是其他东西。

在任何情况下,您都需要一个丑陋的 hack 来使其工作,因为 flexbox 不提供“flex-gap”功能(at least for now)。

然而,使用 CSS 网格布局,排水沟的问题很简单。

Grid 规范提供了在网格项目之间创建空间的属性,同时忽略了项目和容器之间的空间。这些属性是:

网格列间隙

网格行间隙

grid-gap(上述两个属性的简写)

最近,该规范已更新为符合 CSS Box Alignment Module,它提供了一组对齐属性供所有盒子模型使用。所以现在的属性是:

柱间隙

行间隙

间隙(速记)

但是,并非所有 Grid-supporting browsers 都支持较新的属性,因此我将在下面的演示中使用原始版本。

此外,如果项目和容器之间需要间距,则容器上的 padding 可以正常工作(参见下面演示中的第三个示例)。

从规范:

10.1。间距:row-gap、column-gap 和 gap 属性 row-gap 和 column-gap 属性(以及它们的 gap 简写),当在网格容器上指定时,定义网格行和网格列之间的间距。它们的语法在 CSS Box Alignment 3 §8 Gaps Between Boxes 中定义。这些属性的效果就像受影响的网格线获得了粗细:两条网格线之间的网格轨迹是代表它们的排水沟之间的空间。

.box { 显示:内联网格;网格自动行:50px;网格模板列:重复(4、50px);边框:1px纯黑色; } .one { 网格列间隙:5px; } .two { 网格列间隙:10px;网格行间隙:10px; } .three { 网格间隙:10px;填充:10px; } .item { 背景:浅灰色; }



更多信息:

浏览器对 CSS 网格的支持

更容易定义仅适用于弹性项目之间的边距(讨论)

弹性盒项目之间的间距


t
tillsanders

为什么不这样做:

.item + .item {
    margin-left: 5px;
}

这使用 adjacent sibling selector 来赋予所有 .item 元素,但第一个元素除外 margin-left。多亏了 flexbox,这甚至可以产生同样宽的元素。当然,这也可以使用垂直定位的元素和 margin-top 来完成。


只要弹性项目始终在一行中,这将起作用。如果允许包装,那么它可能还不够。
M
MK10

这是我的解决方案,不需要在子元素上设置任何类:

.flex-inline-row {
    display: inline-flex;
    flex-direction: row;
}

.flex-inline-row.flex-spacing-4px > :not(:last-child) {
    margin-right: 4px;
}

用法:

<div class="flex-inline-row flex-spacing-4px">
  <span>Testing</span>
  <span>123</span>
</div>

除了上面给出的内联示例之外,同样的技术可以用于普通的 flex 行和列,并且可以使用 4px 以外的间距类进行扩展。


但它不适用于 flex-wrap
w
wutzebaer

我经常在这种情况下使用 + 运算符

#box { 显示:弹性;宽度:100px; } .item { 背景:灰色;宽度:50px;高度:50px; } .item + .item { margin-left: 5px; }


l
lukefrake

我发现最简单的方法是使用百分比,只允许边距计算你的宽度

这意味着如果您使用示例,您最终会得到类似的结果

#box {
   display: flex;
}

.item {
   flex: 1 1 23%;
   margin: 0 1%;
}

确实意味着您的值是基于宽度的,尽管这可能对每个人都不利。


刚刚遇到这个解决方案,是的,它非常好。至少在我的情况下有效(对于那些觉得它很有趣的人来说一支笔:codepen.io/rishatmuhametshin/pen/XXjpaV)。
A
Andres Paul

您可以使用新属性 gap。我复制粘贴我在此 article 中找到的说明以及更多信息

CSS 网格布局已经有一段时间了。通过指定包含元素的内部间距而不是子元素周围的间距,gap 解决了许多常见的布局问题。例如,使用间隙,您不必担心子元素的边距会导致包含元素的边缘周围出现不需要的空白:

不幸的是,目前只有 FireFox 支持 flex 布局中的间隙。

@使用 postcss-preset-env { 阶段:0;浏览器:最近 2 个版本 } 部分 { 宽度:30vw;显示:网格;间隙:1rem;网格模板列:重复(自动调整,最小最大(12ch,1fr)); &[弹性] { 显示:弹性;弹性包装:换行;边距底部:3rem; } .tag { 颜色:白色;背景:HSL(265 100% 47%);填充:0.5rem 1rem;边界半径:1rem; } 按钮 { 显示:内联弹性;放置项目:中心;间隙:0.5rem;背景:HSL(265 100% 47%);边框:1px 实心 hsl(265 100% 67%);白颜色;填充:1rem 2rem;边界半径:1rem;字体大小:1.25rem; } 身体 { 最小高度:100vh;显示:弯曲;弹性方向:列;证明内容:中心;对齐项目:居中; }

Grid

Awesome
Coo
Rad
数学

Flex

Awesome
Coo
Rad
数学


gap 已在此处的答案中被推荐 stackoverflow.com/a/58041749/2756409 此外,这不是 CSS。
Safari 仍然不支持 gap
A
Andreas

这是一个使用灵活框完成间距的卡片 UI 元素网格:

https://i.stack.imgur.com/7km7e.png

我对通过操纵填充和边距来手动间隔卡片而感到沮丧,但结果并不好。下面是我发现非常有效的 CSS 属性组合:

.card-container { 宽度:100%;高度:900px;溢出-y:滚动;最大宽度:继承;背景颜色:#ffffff; /*这里是相关的 flexbox 的东西*/ display: flex;弹性方向:行;证明内容:中心;对齐项目:弹性开始;弹性包装:换行; } /*.card 元素的补充样式*/ .card { width: 120px;高度:120px;背景颜色:#ffeb3b;边框半径:3px;边距:20px 10px 20px 10px; }

希望这对现在和未来的人们有所帮助。


更新:此间距对于需要特定对齐方式(例如居中、左方等)的移动呈现 HTML 元素有效。如果您发现自己使用 flex box 进行移动开发,那么我在切换到纯基于边距的对齐方式时会感到宽慰。
z
zurfyx

Columnify - N 列的独奏课程

Flexbox 和 SCSS

.columnify {
  display: flex;

  > * {
    flex: 1;

    &:not(:first-child) {
      margin-left: 2rem;
    }
  }
}

弹性盒和 CSS

.columnify { 显示:弹性; } .columnify > * { flex: 1; } .columnify > *:not(:first-child) { margin-left: 2rem; }

JSFiddle 上玩它。


A
Amo Wu

#box { 显示:弹性;宽度:100px; } .item { 背景:灰色;宽度:50px;高度:50px; } /* 你的意思是实用程序 */ .u-gap-10 > *:not(:last-child) { margin-right: 10px; }


i
iamandrewluca

只需在选择器中使用 .item + .item 即可匹配第二个 .item

#box { display: inline-flex;边距:0 -5px; } .item { 背景:灰色;宽度:10px;高度:50px; } #box .item + .item { margin-left: 10px; }


K
Keviin Cosmos

我发现了一个黑客,因为我真的需要这个我自己。

/* 网格 */ .container { display: flex; flex-flow:换行; justify-content: 之间的空格; } .container::after, /* 这确保奇数元素离开而不是空格 */ .item { content:"";宽度:计算(33.3333% - 20px);边距底部:40px; } /* 额外的样式 - 不重要 */ .item { height: 100px;背景:#787878; }

这是一个带有很好的弹性增长类别的帖子网格。我想你会喜欢的。 See Codepen


S
Salman A

假设:

你想要 4 列网格布局与包装

项数不一定是4的倍数

为除第 1、5、9 项以外的每一项设置左边距;并在每个项目上设置固定宽度。如果左边距为 10px,那么每行将在 4 个项目之间有 30px 的边距,项目的百分比宽度可以计算如下:

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

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

.flex { 显示:弹性;弹性方向:行;弹性包装:换行;边距:1em 0;背景颜色:桃子; } .item { 左边距:10px;边框:1px 实心;填充:10px;宽度:计算(100% / 4 - 2px - 20px - 10px * (4 - 1) / 4);背景颜色:木瓜鞭; } .item:nth-child(4n + 1) { margin-left: 0; } .item:nth-child(n + 5) { margin-top: 10px; }

1
2
3
4
1
2
< div class="item">3
4
5
6
1
2
3
4
5
6
7
8
9


N
Nick

确实有一种很好的、整洁的、纯 CSS 的方式来做到这一点(人们可能会认为它“更好”)。

在这里发布的所有答案中,我只找到了一个成功使用 calc() 的答案(作者 Dariusz Sikorski)。但是当提出:“但如果最后一行只有 2 个项目,它会失败”没有扩展解决方案。

该解决方案通过替代负边距解决了 OP 的问题,并解决了 Dariusz 面临的问题。

笔记:

此示例仅演示 3 列布局

它使用 calc() 让浏览器按照它想要的方式进行数学运算——100%/3(尽管 33.3333% 应该也可以工作)和 (1em/3)*2(虽然 .66em 也应该可以正常工作)。

如果元素少于列,它使用 ::after 填充最后一行

.flex-container { 显示:弹性; justify-content: 之间的空格;弹性包装:换行; } .flex-container:after { content: ""; } .flex-container > div, .flex-container:after { box-sizing:border-box;宽度:计算((100%/3)-((1em/3)*2)); } .flex-container > :nth-child(n + 4) { margin-top: 1em; } /* 以下只是可视化项目 */ .flex-container > div, .flex-container:after { font-size: 2em; } .flex-container { margin-bottom:4em; } .flex-container > div { text-align: center;背景颜色:#aaa;填充:1em; } .flex-container:after { 边框:1px 红色虚线; }

示例 1(2 个元素)

1
2

示例 2 ( 3个元素)

1
2
3

同样在 https://codepen.io/anon/pen/rqWagE


j
jnmrobinson

它并非在所有情况下都有效,但如果您有灵活的子宽度 (%) 并且知道每行的项目数,您可以使用 nth-child 选择器非常清晰地指定必要元素的边距。

这在很大程度上取决于您所说的“更好”是什么意思。这种方式不需要子元素或负面元素的额外包装标记 - 但这些东西都有它们的位置。

部分{显示:块宽:100vw; } .container { 对齐内容:弹性开始;对齐项目:拉伸;背景颜色:#ccc;显示:弯曲; flex-flow:换行;证明内容:弹性开始;宽度:100%; } .child-item { 背景颜色:#c00;保证金底部:2%;最小高度:5em;宽度:32%; } .child-item:nth-child(3n-1) { margin-left: 2%;右边距:2%; }

< div class="child-item">


没有反应。仅适用于固定宽度的父级。
OP 不要求响应式解决方案,他们的示例使用固定宽度。鉴于这使用 % 值,很容易认为这是响应式的,因为项目将适应按百分比设置的父级的大小。
T
Tunasing

我之前遇到过同样的问题,然后偶然发现了这个问题的答案。希望它可以帮助其他人以供将来参考。

长答案简短,为您的孩子弹性项目添加边框。然后您可以将弹性项目之间的边距指定为您喜欢的任何内容。在片段中,我使用黑色来说明,如果您愿意,可以使用“透明”。

#box { 显示:弹性;宽度:100px; /* 边距:0 -5px; *删除这个*/ } .item { 背景:灰色;宽度:50px;高度:50px; /* 边距:0 5px; *删除这个*/边框:1px纯黑色; /* 添加这个 */ } .item.special{ 边距:0 10px; }