マイクロ レイアウト

レイアウトといえば、ページレベルのデザインを思い浮かべることがよくあります。ただし、ページ内の小さなコンポーネントには、独自の自己完結型レイアウトがあります。

これらのコンポーネント レベルのレイアウトは、ページ上の位置に関係なく自動的に調整されるのが理想的です。コンポーネントがメイン コンテンツ列、サイドバー、またはその両方に配置されるかどうかわからない場合もあります。 コンポーネントの移動先が不明な場合は コンテナに合わせてコンポーネントを調整する必要があります

幅の広い 2 つの列と幅の狭いレイアウト。メディア オブジェクトは、列の幅が広いか狭いかによってレイアウトが異なります。

GRid

CSS グリッドは、ページレベルのレイアウトだけでなく、その内部のコンポーネントにも適しています。

この例では、::before::after疑似要素によって、見出しの両側に装飾線が作成されます。見出し自体はグリッド コンテナです。 個々の要素は、利用可能なスペースを常に線で埋めるようにレイアウトされます。

h1 {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  gap: 1em;
}
h1::before,
h1::after {
  content: "";
  border-top: 0.1em double black;
  align-self: center;
}
グリッド オーバーレイを表示している Firefox のデベロッパー ツール。 グリッド オーバーレイを表示している Chrome のデベロッパー ツール。
Firefox や Chrome などのパソコン版ブラウザには、デザインにグリッド線やエリアを重ねて表示できるデベロッパー ツールが用意されています。

Chrome DevTools でグリッド レイアウトを調べる方法をご覧ください。

Flexbox

その名のとおり、Flexbox を使用するとコンポーネントを柔軟に構成できます。コンポーネント内のどの要素を最小サイズまたは最大サイズにするかを宣言し、それに応じて他の要素を柔軟に調整できます。

この例では、利用可能なスペースの 4 分の 1 を画像が占め、残りの 4 分の 3 はテキストが占めています。 ただし、画像のサイズが 200 ピクセルを超えることはありません。

.media {
  display: flex;
  align-items: center;
  gap: 1em;
}
.media-illustration {
  flex: 1;
  max-inline-size: 200px;
}
.media-content {
  flex: 3;
}
Flexbox のオーバーレイを表示している Firefox のデベロッパー ツール。 Flexbox のオーバーレイを表示している Chrome のデベロッパー ツール。
Firefox と Chrome のデベロッパー ツールを使用すると、Flexbox コンポーネントの形状を可視化できます。

Chrome DevTools で Flexbox のレイアウトを検査する方法をご確認ください。

コンテナクエリ

Flexbox では、コンテンツからデザインできます。 要素のパラメータ(範囲や幅など)を指定し、ブラウザに最終的な実装を任せることができます。

しかし、コンポーネント自体はコンテキストを認識しません。メイン コンテンツとサイドバーのどちらで使用されているかは認識されません。 このため、コンポーネントのレイアウトがページ レイアウトよりも複雑になる可能性があります。 コンテキストに応じたスタイルを適用できるようにするには、コンポーネントに含まれるビューポートのサイズ以上の情報をコンポーネントに伝える必要があります。

ページ レイアウトでは、コンテナはブラウザのビューポートであるため、コンテナの幅は不明です。メディアクエリはページレベルのコンテナのディメンションをレポートします。

コンテナのディメンションをレポートするには、コンテナクエリを使用します。

まず、コンテナとして機能する要素を定義します。

main,
aside {
  container-type: inline-size;
}

つまり、インライン ディメンションに対してクエリを実行できます。 英語のドキュメントの場合、これは横軸です。 コンテナの幅に基づいてスタイルを変更します。

コンポーネントがコンテナ内にある場合は メディアクエリと同様の方法でスタイルを適用できます

.media-illustration {
  max-width: 200px;
  margin: auto;
}

@container (min-width: 25em) {
  .media {
    display: flex;
    align-items: center;
    gap: 1em;
  }

  .media-illustration {
    flex: 1;
  }

  .media-content {
    flex: 3;
  }
}

メディア オブジェクトが 25em よりも狭いコンテナ内にある場合、Flexbox スタイルは適用されません。画像とテキストは縦方向に表示されます。

ただし、コンテナ要素の幅が 25em より広い場合、画像とテキストは横並びで表示されます。

コンテナクエリを使用すると、コンポーネントのスタイルを個別に設定できます。 ビューポートの幅は重要ではなくなりました。含まれる要素の幅に基づいてルールを記述できます。

サイズの異なる 2 つのコンテナ。

クエリの組み合わせ

ページ レイアウトにはメディアクエリを使用し、ページ内のコンポーネントにはコンテナクエリを使用できます。

ページの全体的な構造は、main 要素と aside 要素からなります。 両方の要素内にメディア オブジェクトがあります。

<body>
  <main>
     <div class="media">…</div>
     <div class="media">…</div>
  </main>
  <aside>
     <div class="media">…</div>
  </aside>
</body>

ビューポートの幅が 45em よりも広い場合、メディアクエリは main 要素と aside 要素にグリッド レイアウトを適用します。

@media (min-width: 45em) {
  body {
    display: grid;
    grid-template-columns: 3fr 1fr;
  }
}

メディア オブジェクトのコンテナクエリのルールに変更はありません。含まれる要素が 25em より幅が広い場合にのみ、水平方向の Flexbox レイアウトが適用されます。

幅の広い 2 つの列と幅の狭いレイアウト。メディア オブジェクトは、列の幅が広いか狭いかによってレイアウトが異なります。

コンテナクエリは、マイクロ レイアウトに大きな変革をもたらします。コンポーネントは、ブラウザのビューポートとは無関係に自己完結型にできます。

理解度をチェックする

マイクロ レイアウトに関する知識をテストします。

グリッドと Flexbox はどちらもマイクロ レイアウトに役立ちますか?

True
🎉
False
🎉? グリッドと Flexbox は、極めて小さなレイアウトでも非常に便利です。

前回は、ページレベルのマクロのレイアウトについて学習しました。 コンポーネント レベルのマイクロ レイアウトについては以上です。次は、コンテンツの構成要素を詳しく見ていきましょう。 画像をレスポンシブにする方法について説明します。次に、レスポンシブ タイポグラフィを見てみましょう。