聖杯レイアウト
聖杯レイアウト(Holy Grail Layout) は、長い間いろいろな解法が提示されてきた、古典的なCSSの問題です。もし聖杯レイアウトの歴史についてご存知でなければ、このA List Apartの記事はとても良い要約であり、よく知られた解法についてのリンクとなっています。
聖杯レイアウトの本質は、ヘッダーとフッター、3つのカラムのあるページです。中央のカラムはメインコンテンツを含み、左右のカラムは広告やナビゲーションのような補助的なコンテンツを含みます。
この問題を解くためのほとんどのCSSの解法は下記のゴールを目指すものです。
- 伸縮する中央のコンテナと、固定幅のサイドバーを持つこと。
- 中央のカラム(メインコンテンツ)はHTMLソースの最初に登場すること。
- すべてのカラムは、どのカラムが一番高いかに関係なく、同じ高さであること。
- 最小限のマークアップしか必要にならないこと。
- コンテンツの量が少なかったとしても、フッターはページの下部に"固定"されること。
不幸にも、これらのゴールの特質と、CSSの元来の制約により、すべてのゴールを満たす古典的な解法はありませんでした。
Flexboxを用いることで、完全な解法がついに可能になります。
The HTML
<body class="HolyGrail">
<header>…</header>
<div class="HolyGrail-body">
<main class="HolyGrail-content">…</main>
<nav class="HolyGrail-nav">…</nav>
<aside class="HolyGrail-ads">…</aside>
</div>
<footer>…</footer>
</body>
The CSS
中央のコンテンツを伸縮させ、フッターをページ下部に固定するには、スティッキーフッターの例と同じテクニックを使うことで解決できます。唯一の違いは、聖杯レイアウトの中央行(.HolyGrail-body
)は子を正しく並べる為にdisplay:flex
が必要になることだけです。
.HolyGrail {
display: flex;
min-height: 100vh;
flex-direction: column;
}
.HolyGrail-body {
display: flex;
flex: 1;
}
伸縮する中央カラムと固定幅のサイドバーで構成される、3つの同じ高さのカラムのスタイリングは簡単です:
.HolyGrail-content {
flex: 1;
}
.HolyGrail-nav, .HolyGrail-ads {
/* カラム幅は12em */
flex: 0 0 12em;
}
.HolyGrail-nav {
/* ナビゲーションを左に */
order: -1;
}
レスポンシブ化する
聖杯レイアウトは、PCブラウザーが主流の時代におけるWebデザインです。しかし、モバイル機器が増えるにつれ、レスポンシブデザインの人気が上昇しており、聖杯レイアウトも流行から外れつつあります。
どのみち、Flexboxなら、モバイルファーストかつモバイルフレンドリーなバージョンの聖杯レイアウトを作ることも簡単です。このgistでは単に中央セクションをデフォルトでflex-direction:column
にし、より大きなスクリーンではflex-direction:row
にします。
以下にレスポンシブかつモバイルファーストな完全な例を示します。ブラウザーをリサイズすることで動作を確認することが出来ます。
.HolyGrail,
.HolyGrail-body {
display: flex;
flex-direction: column;
}
.HolyGrail-nav {
order: -1;
}
@media (min-width: 768px) {
.HolyGrail-body {
flex-direction: row;
flex: 1;
}
.HolyGrail-content {
flex: 1;
}
.HolyGrail-nav, .HolyGrail-ads {
/* 12em is the width of the columns */
flex: 0 0 12em;
}
}
Github上にある、HolyGrail
コンポーネントの完全なソースを参照してください。