CSSレイアウトの進化:FloatからGrid、そしてその先へ
10年以上Webサイトを構築している方なら、CSSレイアウトの「暗黒時代」を覚えているでしょう。
divを垂直方向に中央揃えすることは、かつては面接の定番質問でした。私たちはレイアウトのために<table>を使用し、floatを乱用し、clearfixハックに依存していました。
今日、私たちにはFlexboxやGridのような強力なツールがあります。しかし、私たちはどのようにしてここに至ったのでしょうか?そして、次はどうなるのでしょうか?
CSSレイアウトの進化の旅に出かけましょう。
1. テーブル時代(90年代後半)
当初、レイアウトシステムというものはありませんでした。CSSはフォントと色のためのものでした。
開発者たちは、HTMLの<table>要素を使ってページ構造を作れることを発見しました。
<table> <tr> <td width="200">サイドバー</td> <td>メインコンテンツ</td> </tr> </table>
問題点:
- セマンティック的に正しくない(テーブルはデータ用であり、レイアウト用ではない)。
- コードが非常に冗長で保守が難しい。
- レンダリングパフォーマンスが悪かった(ブラウザは閉じタグ
</table>を待つ必要があった)。
2. Float時代とClearfixハック(2000年代)
次にfloatが登場しました。元々は新聞のように画像の周りにテキストを回り込ませるために設計されましたが、開発者はこれを使ってブロック要素を横に並べることができることに気づきました。
.sidebar { float: left; width: 30%; } .content { float: right; width: 70%; }
問題点:
Floatされた要素は通常のドキュメントフローから外れるため、親コンテナの高さが0になってしまう現象が発生しました。これにより、悪名高いClearfixハックが誕生しました:
.clearfix::after { content: ""; display: table; clear: both; }
私たちはこの脆弱なハックの上に、グリッドシステム全体(Bootstrap 2/3のような)を構築しました。
3. Flexbox革命(2010年代)
**Flexbox (Flexible Box Layout)**は、レイアウトのために特別に設計された最初のCSSモジュールでした。
最大の悩みの種を解決してくれました:
- 垂直方向の中央揃え(
align-items: center)。 - 同じ高さのカラム。
- HTMLを変更せずに要素の順序を並べ替える。
.container { display: flex; justify-content: center; /* 水平方向の中央 */ align-items: center; /* 垂直方向の中央 - ついに! */ gap: 1rem; /* Flexboxでもgapが使えるようになりました! */ }
Flexboxは1次元です。1つの行または1つの列にアイテムを配置するのに優れています。
4. CSS Grid:2次元の強国(2017年以降)
Flexboxが1次元の世界を征服している間に、CSS Gridが2次元の世界の主役として登場しました。
Gridを使用すると、行と列を同時に定義できます。
.container { display: grid; grid-template-columns: 200px 1fr; /* サイドバー固定、コンテンツ可変 */ grid-template-rows: auto 1fr auto; /* ヘッダー、本文、フッター */ gap: 20px; }
Gridを使えば、フレームワークなしで、わずか数行のCSSで複雑な雑誌スタイルのレイアウトを作成できます。
Flexbox vs Grid:どちらを使うべき?
- Flexboxを使用: コンポーネント(ナビゲーションバー、カード内部、フォームグループ)。
- Gridを使用: ページ全体のレイアウト(ヘッダー、サイドバー、メインコンテンツ、フッター)。
5. 未来:SubgridとContainer Queries
進化は止まっていません。
Subgrid
subgridを使用すると、子要素が親のグリッドトラックを継承できます。これは、異なるカード内のネストされたコンポーネントを整列させる際のゲームチェンジャーとなります。
.card { grid-row: span 3; display: grid; grid-template-rows: subgrid; /* 親グリッドと内部を整列! */ }
Container Queries (@container)
メディアクエリ(@media)は、ビューポートサイズに基づいてスタイルを指定します。しかし、コンポーネントベースのデザインには、コンテナサイズに基づいたスタイルが必要です。
.card-container { container-type: inline-size; } @container (min-width: 400px) { .card { display: flex; /* コンテナが十分に広ければ横並びレイアウトに切り替え */ } }
結論
CSSは長い道のりを歩んできました。基本的なことを行うためにハックはもう必要ありません。
歴史を理解することで、私たちが持っているツールのありがたみがわかります。まだレイアウトのためにfloatを使っているなら、もう手放す時です。FlexboxとGridを受け入れましょう。それらが現代Webの標準です。
関連ツールを見る
Pockitの無料開発者ツールを試してみましょう