当前位置: 首页 > 知识库问答 >
问题:

前端 - flex布局如何让换行后元素从头开始且和上一行有一定间距?

朱和惬
2023-04-27

描述

要求是,各个元素之间相距24px,换行后,下一行的元素和第一行的开头元素对齐,并且和上一行元素也是24px的间距。

我的解决方案(有问题)

给兄弟元素设置margin-left和top,结果换行后的元素不是从头开始的,第二个元素如果没换行也会有margintop。

于是我就给每个元素设置了margin-right,兄弟元设置margin-bottom,结果第二个元直接换行的话,就触发不了margin-bottom,还是挨在了一起。

如果给每个元素都设置margin-bottom,只有一个元素时,高度看着不正常。

好无语。

难道flex只能用于不换行吗?

解决

.container {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: 16px 16px;
}

共有4个答案

雍志新
2023-04-27

最外层(overvlow:hidden),再拿一个容器套一下,向左上负间距(margin: -10px 0 0 -10px),然后子元素设置左上正间距(margin: 10px 0 0 10px)

程瑞
2023-04-27

一般来说是使用 margin-right + margin-bottom 给每一个元素都添加外边距。

或者使用我这个文章中提到的 gap in flex 的方式 �� 在 Flex 布局中使用 gap 属性。
只不过会有一些兼容问题,特别是在一些老版本的微信中/小程序中打开时。
如果考虑兼容性的话,替代方式可以看我的这个问答 �� 弹性布局(flex布局)中使用gap的兼容性问题应该如何解决?

利俊迈
2023-04-27

你可以用nth-child选择器来解决这个问题,兼容性最好的方案:


<div class="container">
  <div class="row">
    <div class="item">Item 1</div>
    <div class="item">Item 2</div>
    ...
  </div>
  <div class="row">
    <div class="item">Item 1</div>
    <div class="item">Item 2</div>
    ...
  </div>
  ...
</div>

.container {
  display: flex;
  flex-wrap: wrap;
}

.row {
  display: flex;
}

.item {
  margin-right: 24px;
  margin-bottom: 24px;
}

.row .item:last-child {
  margin-right: 0;
}
公冶弘壮
2023-04-27

可以用 gap 属性的话就很容易,直接 gap:24px;否则的话,display: grid,然后配合 gap 属性。最后就是 margin-bottom

 类似资料:
  • 问题: flex:1 等价于 flex: 1 1 0%, 既然flex-basis是0%,那么flex子元素 应该优先使用最小内容宽度吧,第一个子元素的最小内容宽度就是 文本 abdfdofewefdfdsdfewfwefdf的宽度, 第二个flex子元素的最小内容宽度就是图片本身的宽度100px, 第三个flex子元素的最小内容宽度 应该是单个中文字符的宽度吧? 所以剩余空间=flex容器宽度-

  • 创建项目,不就是运行起一个 hello, world 的事吗? 刚工作的时候,总想着能经历从零开始制作前端应用的过程。 工作一段时间后,总会经历要从零创建一个前端应用。 工作上的编程与日常编程,并没有太多的区别。只是有些时候,我们会省略一些步骤;有些时候,我们也会多一些步骤。 创建项目,不就是起一个 hello, world 的事吗?业余的时候,一个人创建项目: 在 GitHub 上创建一个项目。

  • 下载.xlsx的文件,设置了单元格内容换行,但是为什么打开的时候展示的单元格内容是一横行展示的?(ps:复制单元格内容就是,粘贴的格式就是正确的换行格式,双击单元格也会进行换行,但是为什么默认打开展示的是一横行呢,我就想实现一打开就是换行之后的格式) 想实现默认展示如下图格式

  • 我定义了容器显示的flexbox属性:Flex;flex-wrap:包装;justify-content:Center;但第一行总是有3个div,第二行是2个div。如何使它在浏览器调整大小时换行div? 我几乎尝试了所有的方法(更改了父容器的宽度和高度,将width更改为min-width/max-width,设置父容器的margin:0 auto;)。 我想divs会在下一行结束。但总是有3个

  • 问题内容: 有没有办法在多行flexbox中进行换行? 例如,在此CodePen中的每个第三项之后中断。 喜欢 问题答案: 最简单,最可靠的解决方案是在适当的位置插入弹性项目。如果它们足够宽(),则会强制换行。 但这是丑陋的,不是语义上的。相反,我们可以在flex容器内生成伪元素,然后使用它们将它们移到正确的位置。 但是有一个局限性:flex容器只能有和伪元素。这意味着您只能强制2个换行符。 为了

  • 有没有办法在多行FlexBox中进行换行? 例如在此代码页中的每第三项之后中断。 null null 就像