grid-template-area
プロパティーで、識別子を使って特化型のグリッドを作ることが増えた。こういう場合、各グリッド項目に対して、grid-area
プロパティーで名前を付けていくことになる。この名前付けを、CSSファイルではなく、HTMLファイルに書いてしまった方がいいのではないだろうか。
例えば以下のようなリストがあり、そのレイアウトにグリッドを使うとする。グローバル・ヘッダーのナビゲーションを想定している。例なのでa
要素は省略した。
<ul class="nav">
<li class="news">News</li>
<li class="feature">Feature</li>
<li class="column">Column</li>
<li class="store">Store</li>
<li class="search">Search</li>
</ul>
このHTMLに対して、CSSファイルで、レイアウトを書き、各項目に識別子を付ける。例えば、3列2行にして、2行目の真ん中を空項目で埋めることにしたい。恣意的だが、空項目の部分にロゴが食い込むようなグローバル・ヘッダーを想像しておいてほしい。
.nav {
grid-template-areas:
"a b c"
"d . e";
}
.news {
grid-area: a;
}
.feature {
grid-area: b;
}
.column {
grid-area: c;
}
.store {
grid-area: d;
}
.search {
grid-area: e;
}
この名前付けが冗長で、かつ定義より利用が前に来てしまうので、落ち着かない。逆順に書くと、親要素へのルールセットよりも、子要素のルールセットが前に来てしまい、同じく落ち着かない。HTML側でこう書いておきたい。
<ul class="nav">
<li style="grid-area: news">News</li>
<li style="grid-area: feature">Feature</li>
<li style="grid-area: column">Column</li>
<li style="grid-area: store">Store</li>
<li style="grid-area: search">Search</li>
</ul>
クラスの代わりにこうしておくと、CSS側では、.nav
へのスタイルのみでよくなる。CSSでクラス名が使いたい場合は、HTML側にクラス名も重ねて書いてもいい。CSS側で属性セレクターを使って[style*="column"]
と書いてもいいだろう。
.nav {
grid-template-areas:
"news feature column"
"store ....... search";
}
あたかもgrid-template-areas
プロパティーでクラス名を直接使えるように書ける。また、定義済みを参照しているだけなので、とても落ち着く。HTML側は、テンプレート・システムによって生成されるので、コストが下がり、ミスタイプも減る。このように、特化型で、構造や内容物に強く依存する場合なら、style
属性に書いてしまってもいい気がしている。
こういったgrid-template-areas
プロパティーで識別子だけを使う、固定的なグリッド・レイアウトは、グローバル・ヘッダーやグローバル・フッターで出番がある。項目の数やラベルが安定しているので、決め打ちで割り当てても問題は起きにくい。描画領域幅に合わせてレイアウトを変える場合も、grid-template-areas
プロパティーを上書きするだけと、細かいグリッドを定義しておいて、複雑に組み合わせるようなことをせずに済む。
そんなわけで、現在のページ・ヘッダーは、識別子を使ったグリッド・レイアウトになっている。試行錯誤した過程で、このウェブサイトでいろいろ試していた。左寄せではないが、おさまりがいいので、しばらく使うかもしれない。