レイアウトといえば、ページレベルのデザインを思い浮かべることがよくあります。ただし、ページ内の小さなコンポーネントには、独自の自己完結型レイアウトがあります。
これらのコンポーネント レベルのレイアウトは、ページ上の位置に関係なく自動的に調整されるのが理想的です。コンポーネントがメイン コンテンツ列、サイドバー、またはその両方に配置されるかどうかわからない場合もあります。 コンポーネントの移動先が不明な場合は コンテナに合わせてコンポーネントを調整する必要があります
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;
}
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;
}
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
より広い場合、画像とテキストは横並びで表示されます。
コンテナクエリを使用すると、コンポーネントのスタイルを個別に設定できます。 ビューポートの幅は重要ではなくなりました。含まれる要素の幅に基づいてルールを記述できます。
クエリの組み合わせ
ページ レイアウトにはメディアクエリを使用し、ページ内のコンポーネントにはコンテナクエリを使用できます。
ページの全体的な構造は、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 レイアウトが適用されます。
コンテナクエリは、マイクロ レイアウトに大きな変革をもたらします。コンポーネントは、ブラウザのビューポートとは無関係に自己完結型にできます。
理解度をチェックする
マイクロ レイアウトに関する知識をテストします。
グリッドと Flexbox はどちらもマイクロ レイアウトに役立ちますか?
前回は、ページレベルのマクロのレイアウトについて学習しました。 コンポーネント レベルのマイクロ レイアウトについては以上です。次は、コンテンツの構成要素を詳しく見ていきましょう。 画像をレスポンシブにする方法について説明します。次に、レスポンシブ タイポグラフィを見てみましょう。