2018年1月31日(水)
2017年11月4日(土)ベルサール半蔵門 イベントホールで開催したCSS Nite LP54「Coder's High 2017」のフォローアップとして、鹿野 壮さん(ICS)の『Grid Layoutがやってきた! Flexboxやfloatとの適切な使い分け方法』セッションのスライドなどを公開します。
フォローアップメッセージは、イベント開催直後(2017年11月)の時点のものです。
「Grid Layoutがやってきた! Flexboxやfloatとの適切な使い分け方法」を担当した鹿野です。今回はご参加ありがとうございました。
2017年、全主要ブラウザが対応したCSS Grid。その概要、コーディング方法、IE 11の対応方法、floatやFlexboxとの使い分けまでを解説しました。
など、想像よりも多くの反響があり嬉しく思います。私自身がGridについて深く学びたかったこともあり、皆さんと一緒にGridの魅力を体験できる時間だったと感じます。
フォローアップとして、アンケートやTwitterでお寄せいただいた質問をいくつかピックアップして回答します。
可能です。
セッション中に紹介したデモ「Rodchenko Poster Layout - CSS Grid」では、.background
の要素にGrid指定、その中の#card
に対して更にGrid指定となっています。
<table>
のcolspan
属性(セルを横に繋げる指定)は可能ですか?span
という単位が使えます。
grid-row-start: 1;grid-row-end: span 2;
と指定すると、「行の一つ目のラインから、2つ分伸ばしください」という意味になります。
行と列の定義についてまとめることが可能です。
セッションで紹介した方法です。
.item {grid-row-start: 1;grid-row-end: 3;grid-column-start: 1;grid-column-end: 2;}
行の開始・終了、列の開始・終了をまとめて指定する方法です。 /
で区切ります。
.item {grid-row: 1 / 3;grid-column: 1 / 2;}
行と列をまとめて指定する方法です。 /
で区切り、次のように指定します。
grid-area: (行開始番号) / (列開始番号) / (行終了番号) / (列終了番号)
セッション中に紹介したメインビジュアルのアイテム位置定義は、次のように記述できます。
.main-visual {grid-area: 1 / 1 / 3 / 2;}
Grid未対応ブブラウザでもGridレイアウトが可能なポリフィルがあります。しかし、次のような課題があります(参考記事「CSS Grid Layoutをガッツリ使った所感 - Qiita」)。
overflow
の解釈・スクロールバーの発生有無が想定と異なったポリフィルを使う際は、これらの課題に注意してください。
Gridにしておいたほうが管理しやすいケースが多いです。
例えば、今回のセッション内で紹介した「猫の3つのサムネイル画像横並び」を複数行にしたければ、display: flex
の代わりにdisplay: grid
を指定する方がよいでしょう。ただし、ページ全体のコンテナ .container
ではなく、猫のサムネイルのコンテナ .other-photos
に対してGridを指定し、 .other-photos
内のみでGridレイアウトの影響が及ぶようにする方が全体のレイアウトへの影響が少なくてラクです。
fr
とは何の略ですか?fraction
です。(越智さん、フォローツイートありがとうございます! https://twitter.com/o_ti/status/926724288610164736 )
fr
を使う場合、他の要素は可変にしない方がいいのでしょうか?可変要素をいくつ並べても問題ありません。
fr
という単位は、「余白がある場合、その要素をどれだけ拡大するか」を指定しますが、複数の要素にfr
を使うと要素の拡大率がfr
の数によって変わります。いくつか例を見てみましょう。
次のCSSコードでは、2行のレイアウトになります。1行目のサイズが100px、2行目は残りの領域全てです。
.container {display: grid;grid-template-rows: 100px 1fr;}
fr
が一つだけの場合次のCSSコードでは、3行のレイアウトになります。1行目のサイズが100px、2行目と3行目は、残りの領域を半分ずつに分解したサイズになります。
.container {display: grid;grid-template-rows: 100px 1fr 1fr;}
2fr
のように、fr
に2以上を指定すると余った領域をその数分だけ確保します。次のCSSコードでは、3行のレイアウトになります。
.container {display: grid;grid-template-rows: 100px 1fr 2fr;}
FlexboxのGridを使ったことがある人であれば、 flex-grow
プロパティと似たような挙動をすると覚えるとよいでしょう。記事「CSS Grid Layout を極める!(場面別編) - Qiita」にわかりやすい解説がありますので、合わせて参照ください。
3行3列のGridを、画面サイズ500px以上のときは2行4列に変更しつつ、各セルのサイズを変更してみましょう。
.container {display: grid;grid-template-rows: 1fr 220px 30px;grid-template-columns: 50% 160px 1fr;}@media (min-width: 500px) {.container {grid-template-rows: 1fr 500px;grid-template-columns: 400px 300px 1fr 200px;}}
行1から3まで、列1から2まで配置したmain-visual
を、画面サイズ500px以上のときは列1から4まで配置するように変更してみましょう。
.main-visual {grid-row-start: 1;grid-row-end: 3;grid-column-start: 1;grid-column-end: 2;}@media (min-width: 500px) {.main-visual {grid-column-start: 1;grid-column-end: 4;}}
いずれの場合も、HTMLコードの構造を一切変えることなくCSSのみで柔軟にレイアウトを変更できるのがポイントです。
各ブラウザは、次のバージョンにてGridに対応しました。
いずれも2017年にリリースされたバージョンで、一番遅かったのがEdge 16(2017/10/17リリース)です。
「ポリフィル」を使うと、Grid未対応ブラウザでもGridのレイアウトが実現できます。副作用もあるので、詳しくは前述の「ポリフィルはありますか?」を参照ください。
デザイン次第ではありますが、デフォルトをGridを使わない1カラムレイアウトにするという方法もあります。
とすることで、Grid対応、未対応ブラウザに対して情報を伝える方法です。私が個人案件で仕事をする際は、この手法を用いています。
@supports
規則を使うことで「グリッドに対応しているブラウザのみ、をを付加することができます。
/* グリッド対応ブラウザで、500px以上のデバイス幅のときのみグリッドを適用する */@supports (display: grid) {@media (min-width: 500px) {.contaner {display: grid;}}}
一番のデメリットは未対応ブラウザがあることです。しかし、昨今のブラウザは自動アップデートが主流になっていますし、IE 11でも対策次第でGridが使えることを考えると、今後Gridが利用できる環境は広がるでしょう。前述の「古いiOS Safari、古いAndroidブラウザ、Grid未対応のブラウザ対応が必要な場合は?」のような対応をしつつ、ブラウザのサポート拡大を待ちましょう。
また、行列の数を増やしすぎると管理が煩雑になるというデメリットもあります。Excelでも行列を多く増やしてセルの結合を多用すると見辛くなるのと同じです。Gridによるレイアウトは大枠部分に留め、細かい部分についてはFlexboxで代用できないか、Gridの入れ子ができないか、等を検討しながらレイアウトしていくのがよいでしょう。
いただいた感想の中から、特に印象深かった感想をいくつかピックアップします。Gridの便利さが伝わったようで何よりです。
CSS Gridの学習には、次のようなサイトが役立ちます。
もしGridの学習をしていて不明な点があれば、Twitter等で気軽にご相談くださいませ。
次の媒体でWebデザインやフロントエンドの情報について発信しています。こちらも是非ご覧ください!
このセッションは「CSS Niteベストセッション2017」にてベスト・セッション10に選ばれました。
2019年、CSS Niteでは49回の関連イベントを通して123セッションが行われました。その中からベスト・セッション+αを選びました。