CSSで余白のないレスポンシブグリッドレイアウト

画面の幅に応じて1行のブロック数が変わるグリッドレイアウトを作ってみましょう。以下は完成例です:

まずHTMLコードを書きましょう:

html<div class="parent">
  <div class="child">1</div>
  <div class="child">2</div>
  <div class="child">3</div>
  <div class="child">4</div>
  <div class="child">5</div>
  <div class="child">6</div>
  <div class="child">7</div>
  <div class="child">8</div>
  <div class="child">9</div>
  <div class="child">10</div>
  <div class="child">11</div>
  <div class="child">12</div>
</div>

次に、親要素にスタイルを追加します:

css.parent {
  display: flex;
  flex-wrap: wrap;
  width: 95%;
  margin: 50px auto;
}

次に、幅を設定せずにブロック自体にスタイルを設定します:

css.child {
  box-sizing: border-box;
  height: 100px;
  padding: 20px;
  border: 1px solid green;
}

ブロックの幅はパーセント単位で設定する必要があります。これにより、画面サイズが変更されてもブロックの幅がスムーズに変化します。また、特定の画面幅では、1行に収まるブロック数を変えるために、ブロックの幅を変更する必要があります。

1行に4ブロック配置するコードを書いてみましょう:

css@media (min-width: 1000px) {
  .child {
    width: 25%;
  }
}

次に1行に3ブロック配置します:

css@media (min-width: 700px) and (max-width: 1000px) {
  .child {
    width: 33.3333%;
  }
}

次に1行に2ブロック配置します:

css@media (min-width: 400px) and (max-width: 700px) {
  .child {
    width: 50%;
  }
}

1行に1ブロック配置します:

css@media (max-width: 400px) {
  .child {
    width: 100%;
  }
}

すべてのコードをまとめてみましょう:

css.parent {
  display: flex;
  flex-wrap: wrap;
  width: 95%;
  margin: 50px auto;
}
.child {
  box-sizing: border-box;
  height: 100px;
  padding: 20px;
  border: 1px solid green;
}

@media (max-width: 400px) {
  .child {
    width: 100%;
  }
}
@media (min-width: 400px) and (max-width: 700px) {
  .child {
    width: 50%;
  }
}
@media (min-width: 700px) and (max-width: 1000px) {
  .child {
    width: 33.3333%;
  }
}
@media (min-width: 1000px) {
  .child {
    width: 25%;
  }
}
Задание 1

私のコードを、ブロックの幅が calc 関数を使って計算されるように修正してください。

Задание 2

画面幅が小さくなるにつれて、最初は1行に4要素、次に2要素、そして1要素となるグリッドレイアウトを作成してください。

Задание 3

画面幅が小さくなるにつれて、最初は1行に6要素、次に3要素、そして1要素となるグリッドレイアウトを作成してください。