如何制作破碎/波浪形网格

How to make a broken / wavy grid

我已经尝试使用具有负底边距和正顶边距的 flexbox,但是 flexbox 的子元素比看起来更难设置样式。

有没有更好的方法可以达到这个效果?
Flexbox 是否适合这里?

我怎样才能用一个好的现代解决方案实现这个目标?
你会如何明智地处理这种响应?

.broken-grid {
  display: flex;
  justify-content: center;
  margin: 0 0 -30px -30px;
}

.broken-grid__item {
  display: flex;
  flex-direction: column;
  margin-bottom: 30px;
  padding-left: 30px;
}

.visual {
  width: 25vw;
  height: 100%;
  margin-bottom: 30px;
}

.visual:nth-child(4n + 2) {
  margin-bottom: -50px;
  margin-top: 100px;
}

.visual:nth-child(4n + 3) {
  margin-top: -50px;
  margin-bottom: 100px;
}
<div class="broken-grid">
  <div class="broken-grid__item">
    <picture class="visual">
      <source srcset="https://picsum.photos/700" type="image/webp">
      <img src="https://picsum.photos/700" alt="">
    </picture>
    <picture class="visual">
      <source srcset="https://picsum.photos/700" type="image/webp">
      <img src="https://picsum.photos/700" alt="">
    </picture>
  </div>
  <div class="broken-grid__item">
    <picture class="visual">
      <source srcset="https://picsum.photos/700" type="image/webp">
      <img src="https://picsum.photos/700" alt="">
    </picture>
    <picture class="visual">
      <source srcset="https://picsum.photos/700" type="image/webp">
      <img src="https://picsum.photos/700" alt="">
    </picture>
  </div>
  <div class="broken-grid__item">
    <picture class="visual">
      <source srcset="https://picsum.photos/700" type="image/webp">
      <img src="https://picsum.photos/700" alt="">
    </picture>
    <picture class="visual">
      <source srcset="https://picsum.photos/700" type="image/webp">
      <img src="https://picsum.photos/700" alt="">
    </picture>
  </div>
  <div class="broken-grid__item">
    <picture class="visual">
      <source srcset="https://picsum.photos/700" type="image/webp">
      <img src="https://picsum.photos/700" alt="">
    </picture>
    <picture class="visual">
      <source srcset="https://picsum.photos/700" type="image/webp">
      <img src="https://picsum.photos/700" alt="">
    </picture>
  </div>
</div>

在这个例子中,我使用了常规 css。

Flexible 显示被使用,就像子元素一样,通过 inheritance - display: inherit。我对间隔使用 gap 规则 - gap: 15px.

为了用图像定义偶数/奇数块,我使用了 :nth-child() 伪 类 和 evenodd属性。

body {
    height: 100vh;
    margin: 0;
}

.broken-grid {
    display: flex;
    justify-content: center;
    align-items: center;
    gap: 15px;
    width: 100%;
    height: 100%;
}

.broken-grid__item {
    display: inherit;
    flex-direction: column;
    gap: inherit;
    flex: 25%;
}

.visual img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.broken-grid__item:nth-child(odd) {
    margin-top: 50px;
}

.broken-grid__item:nth-child(even) {
    margin-bottom: 50px;
}
<div class="broken-grid">
    <div class="broken-grid__item">
        <picture class="visual">
            <source srcset="https://picsum.photos/700" type="image/webp" />
            <img src="https://picsum.photos/700" alt="" />
        </picture>
        <picture class="visual visual--">
            <source srcset="https://picsum.photos/700" type="image/webp" />
            <img src="https://picsum.photos/700" alt="" />
        </picture>
    </div>
    <div class="broken-grid__item">
        <picture class="visual">
            <source srcset="https://picsum.photos/700" type="image/webp" />
            <img src="https://picsum.photos/700" alt="" />
        </picture>
        <picture class="visual visual--">
            <source srcset="https://picsum.photos/700" type="image/webp" />
            <img src="https://picsum.photos/700" alt="" />
        </picture>
    </div>
    <div class="broken-grid__item">
        <picture class="visual">
            <source srcset="https://picsum.photos/700" type="image/webp" />
            <img src="https://picsum.photos/700" alt="" />
        </picture>
        <picture class="visual visual--">
            <source srcset="https://picsum.photos/700" type="image/webp" />
            <img src="https://picsum.photos/700" alt="" />
        </picture>
    </div>
    <div class="broken-grid__item">
        <picture class="visual">
            <source srcset="https://picsum.photos/700" type="image/webp" />
            <img src="https://picsum.photos/700" alt="" />
        </picture>
        <picture class="visual visual--">
            <source srcset="https://picsum.photos/700" type="image/webp" />
            <img src="https://picsum.photos/700" alt="" />
        </picture>
    </div>
</div>