Flexbox - 根据显示的项目重复布局

时间:2018-05-16 10:18:24

标签: html css flexbox

我正在尝试使用flexbox创建一个砌体样式布局,我的目标是看起来像这样......

enter image description here

我可以简单地创建布局,但我希望根据显示的项目数重复布局。

任何人都有类似的例子或如何处理它的任何指导?

我正在考虑先做一些PHP处理来计算出有多少项,然后生成布局,不确定这是否是实现它的最佳方法。

2 个答案:

答案 0 :(得分:3)

您可以使用Flexbox执行此操作,只需使用flex-wrap: wrap并将前两项的宽度设置为50%,将其他3项设置为33.33%。您还需要在项目宽度中包含边距。

* {
  box-sizing: border-box;
}
.layout {
  display: flex;
  flex-wrap: wrap;
}
.item {
  height: 100px;
  margin: 5px;
  border: 1px solid black;
}
.item:nth-child(5n + 1),
.item:nth-child(5n + 2) {
  height: 150px;
  background: blue;
  flex: 0 0 calc(50% - 10px);
}
.item:nth-child(5n + 3),
.item:nth-child(5n + 4),
.item:nth-child(5n + 5) {
  background: blue;
  flex: 0 0 calc(33.33% - 10px);
}
<div class="layout">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

您也可以使用grid-template-columns: repeat(6, 1fr)进行网格布局,然后制作前两项[{1}}和其他3 span 3。这意味着前两个项目将分别占3个单位的6个,其他3个单位将占2个单位的6个。

span 2
* {
  box-sizing: border-box;
}
.layout {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(6, 1fr);
  grid-auto-rows: 150px 100px;
}
.item {
  border: 1px solid black;
}
.item:nth-child(5n + 1),
.item:nth-child(5n + 2) {
  grid-column: span 3;
}
.item:nth-child(5n + 3),
.item:nth-child(5n + 4),
.item:nth-child(5n + 5) {
  grid-column: span 2;
}

答案 1 :(得分:-1)

是的,这可以通过flexbox来实现。以下是如何实现这一目标:

.masonry {
    display: flex;
    flex-flow: row wrap;
    width: 100%;
}

.masonry-item {
    overflow: hidden;
    border-radius: 5px;
    margin: 0 0 8px 8px;
    background-color: #333;
    flex: auto;
}
<div class="masonry">
  <div class="masonry-item">
  <!-- this will be your inner content you dont need to specifically give this width and height -->
    <div style="width: 200px; height: 100px;"></div>
  </div>
  <div class="masonry-item">
    <div style="width: 150px; height: 100px;"></div>
  </div>
  <div class="masonry-item">
    <div style="width: 150px; height: 150px;"></div>
  </div>
  <div class="masonry-item">
    <div style="width: 250px; height: 150px;"></div>
  </div>
  <div class="masonry-item">
    <div style="width: 100px; height: 100px;"></div>
  </div>
  <div class="masonry-item">
    <div style="width: 100px; height: 100px;"></div>
  </div>
  <div class="masonry-item">
    <div style="width: 100px; height: 100px;"></div>
  </div>
  <div class="masonry-item">
    <div style="width: 300px; height: 100px;"></div>
  </div>
  <div class="masonry-item">
    <div style="width: 100px; height: 100px;"></div>
  </div>
  <div class="masonry-item">
    <div style="width: 150px; height: 100px;"></div>
  </div>
  <div class="masonry-item">
    <div style="width: 150px; height: 100px;"></div>
  </div>
  <div class="masonry-item">
    <div style="width: 100px; height: 100px;"></div>
  </div>
</div>

无论你有多少内容,这都适合他们。