css - 使用 flexbox 将 flex 元素内的元素换行到下一行

标签 css flexbox

我有一个包含“产品框”的 flexbox,它们本身包含产品的缩略图。如果产品框在该行的空间不足,有没有办法将缩略图换到下一行?每个产品我可能有 10 多个缩略图,因此如果需要它甚至可能需要运行到下一个行,但它们仍然应该与产品的重置“内联”而不是换行符他们的开始和结束。

我不必使用 flexboxes,但我认为它们可能对这样的事情有用。但是我无法弄清楚这一点。谢谢!

.products {
  display: flex;
  background: yellow;
}

.product {
  flex: 1;
  margin: 1em;
  background: magenta;
}

.thumbnail {
  display: inline-block;
  margin: 1em;
  width: 100px;
  height: 40px;
  background: blue;
}
<div class="products">
  <div class="product">
    <div class="thumbnail"></div>
    <div class="thumbnail"></div>
    <div class="thumbnail"></div>
  </div>
  <div class="product">
    <div class="thumbnail"></div>
    <div class="thumbnail"></div>
    <div class="thumbnail"></div>
  </div>
</div>

发生了什么:

enter image description here

我希望发生的事情:

enter image description here

最佳答案

通过一些较小的调整,您可以实现这一目标,其中不对缩略图进行分组并使用包装器来补偿上边距。

.products {
  background: yellow;
}

.wrapper {
  display: inline-flex;          /*  avoid collapsed margin on parent element  */
  flex-wrap: wrap;
  margin-top: -15px;             /*  so margin only affect second row  */
}

.products a {
  padding: 1em;
  margin-top: 15px;
  background: magenta;
}

.products a:nth-child(3n) {      /*  target every 3rd element with a right margin  */
  margin-right: 15px;
}

.thumbnail {
  width: 100px;
  height: 40px;
  background: blue;
  color: white;
}
<div class="products">
  <div class="wrapper">
    <a href="#"><div class="thumbnail">1</div></a>
    <a href="#"><div class="thumbnail">2</div></a>
    <a href="#"><div class="thumbnail">3</div></a>
    <a href="#"><div class="thumbnail">4</div></a>
    <a href="#"><div class="thumbnail">5</div></a>
    <a href="#"><div class="thumbnail">6</div></a>
  </div>
</div>


正如您在评论中提到的,缩略图的数量是任意的,使用 nth-child 在要作为一个组查看的元素之间创建间隙可能不切实际。

基于这一事实,并假设您动态生成这些缩略图,您可以使用空格元素,或者像下面那样,添加内联边距。

.products {
  background: yellow;
}

.wrapper {
  display: inline-flex;          /*  avoid collapsed margin on parent element  */
  flex-wrap: wrap;
  margin-top: -15px;             /*  so margin only affect second row  */
}

.products a {
  padding: 1em;
  margin-top: 15px;
  background: magenta;
}

.thumbnail {
  width: 100px;
  height: 40px;
  background: blue;
  color: white;
}
<div class="products">
  <div class="wrapper">
    <a href="#"><div class="thumbnail">1</div></a>
    <a href="#"><div class="thumbnail">2</div></a>
    <a style="margin-right: 15px" href="#"><div class="thumbnail">3</div></a>
    <a href="#"><div class="thumbnail">4</div></a>
    <a href="#"><div class="thumbnail">5</div></a>
    <a style="margin-right: 15px" href="#"><div class="thumbnail">6</div></a>
  </div>
</div>

关于css - 使用 flexbox 将 flex 元素内的元素换行到下一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46867912/

相关文章:

css - 元素下方的背景颜色和背景图片

asp.net - 最大化网站的并行下载

css - Twitter Bootstrap Rails 在 variables.less 3.0 之前加载 bootswatch.less

html - 图片未出现在 <div> 标签中

css - 如何将 Material UI 选项卡移动到 AppBar 等父项的底部?

html - CSS3 flexbox : vertically center two different sized items, 但让它们的顶部对齐在相同的高度

html - 将列与 bootstrap 垂直对齐

html - CSS 无法使用 flex 使元素在垂直和水平方向居中

css - 如何使文本与 block 居中但左对齐?

html - Flexbox 和 Position Absolute without Top/Bottom in Chome vs. FF & IE