CSS Nite LP58フォローアップ(8)鹿野 壮さん

2018年9月29日に都内で開催したCSS Nite LP58「Coder’s High 2018」のフォローアップとして、の鹿野 壮さん(ICS)『もう一歩踏み込んで現場で使うCSS Grid』セッションのスライドなどを公開します。

ハンズオンで学ぶCSS Grid

鹿野 壮さん(ICS)を講師に迎え、CSS Gridの基本を抑えつつ、より一歩使いこなすためのテクニックをハンズオンで学びます。

メッセージ、補足など

今回はご参加ありがとうございました。各モダンブラウザで使えるようになって1年経ったCSS Grid。2018年のオススメの書き方、採用事例、IE 11の対応方法、未来のCSS Gridまでを解説しました。アンケートでは「現場で使ってみようと思った」「CSS Gridの環境が便利になっていて驚いた」などの声をいただき嬉しく思います。新しい手法や技術を知ることは、自分自身の表現力や作業効率を上げることに直結します。ワクワクしながら新しい技術を一緒に学びましょう。

フォローアップでは、発表での補足とお寄せいただいた質問をいくつかピックアップして回答します。

アンケートでいただいた質問に関して

(質問)縦にコンテンツが並んでいるケースでも使うことはあるか?

はい、あります。今回紹介した案件では、固定幅のヘッダー・フッター、可変幅のメインコンテンツ、gapプロパティを用いたレイアウトの際に使用しました。サンプルコードは次のとおりです。

(質問)チームの学習コストはどれくらいかかったか?

CSS Gridを案件に導入した2017年は、本セッションで紹介したエリア名の行列定義ができなかったため、覚えてもらうことに苦労しました。Autoprefixerの進化でエリア名の行列定義が可能になると、他のCSSによるレイアウトよりも簡単だという声もあり、数回使用するだけでCSS Gridを覚えてもらえました。

(質問)Sassを使用した場合、Autoprefixerをどのタイミングで使えばよい?

Sassのコンパイル後に、Autoprefixerによる変換を実行します。

(質問)要素が重なる表現は可能か?

同じ行・同じ列にアイテムを配置すると、アイテム同士は重なります。z-indexで重なり順を制御することもできます。

(質問)repeat()メソッドを使った場合、IE 11でアイテムがすべて左上に並んでしまうがどうしたらいいか?

行・列の繰り返しに使用するrepeat()メソッドは、AutoprefixerによるIE 11向け変換が可能です。しかし、アイテムの配置の際に注意点があります。IE 11を除くブラウザでは行・列の左上から順にアイテムが配置されていきますが、IE 11では自動的に配置されないので次のように配置位置を指定する必要があります。

▼ CSS

/* 1行目・1列目に配置する */
	.item:nth-child(1) {
	  grid-row: 1;
	  grid-column: 1;
	}
	
	/* 1行目・2列目に配置する */
	.item:nth-child(2) {
	  grid-row: 1;
	  grid-column: 2;
	}

行数、列数が増えると手動で記述するのは煩わしいので、我々の案件ではSassを使って次のように対応しました。$rowNum$columnNumを変更すればコピペで使えるので是非ご利用ください。

▼ Sass

.item {
	  // 行数(3行)
	  $rowNum: 3;
	  // 列数
	  $columnNum: 5;
	  
	  // 左上から順番に配置する
	  @for $row from 1 through $rowNum {
	    @for $column from 1 through $columnNum {
	      $index: ($row - 1) * $columnNum + $column;
	      &:nth-child(#{$index}) {
	        grid-row: $row;
	        grid-column: $column;
	      }
	    }
	  }
	}

また、gapのIE 11向け変換はrepeat()メソッドを使った場合は不可能です(2018/10/01時点)。我々の案件では、repeat()メソッドを用いる場合はmarginpaddingでアイテム間のスペースを設けることにしました。

(質問)repeat()メソッドで、行数・列数を固定して行幅や列幅が動的に変化するレイアウトがしたい

3行5列の行列を作成するには、次のようなコードを書きます。grid-template-rowsは行のサイズのみを指定するプロパティ、grid-template-columnsは列のサイズのみを指定するプロパティです。

▼ CSS

.container {
	  display: grid;
	  grid-template-columns: repeat(5, 1fr);
	  grid-template-rows: repeat(3, 1fr);
	}

repeat()メソッドをIE 11で使う場合の注意点」で紹介したアイテムの配置を行えば、IE 11でもレイアウトが可能です。サンプルを用意しました。

(質問)repeat()メソッドで、画面サイズに応じて行数や列数が動的に変化するレイアウトがしたい

repeat()メソッドの第一引数にauto-fillを指定すると、コンテナーのサイズに応じて行数や列数の変わるレイアウトが可能です。詳しくは、記事「これは便利!CSS Gridのauto-fillとauto-fitの使い分けでRWDが捗る - WPJ」を参照ください。

▼ 画面サイズに応じて100pxサイズの列の数を変えるCSSコード

.container {
	  display: grid;
	  grid-template-columns: repeat(auto-fill, 100px);
	}

ただし、auto-fillはIE 11では使えないので、repeat()メソッドではなくgrid-templateプロパティなどで行数・列数を書き換えるか、Flexboxでレイアウトします。

感想

いただいた感想の中から、とくに印象深かった感想をいくつかピックアップします。Gridの便利さが伝わったようで何よりです。

  • 行番号・列番号での指定が難しかったので、grid-templateプロパティを用いたエリア名の書き方がわかりやすかった。
  • 昨年も参加したが、昨年よりもCSS Gridを使うのに便利な環境になっていることがわかった
  • IE 11でgapプロパティの変換が可能になったことを知らなかった
  • IE 11の対応を気にしていたが、今回の話を聞いて使ってみようと思った
  • display: contentsやCSS Houdiniが、早く全ブラウザに実装されてほしい
  • うにちゃんが可愛かった

さいごに

次の媒体でWebデザインやフロントエンドの情報について発信しています。こちらも是非ご覧ください。

もしCSS Gridの学習をしていて不明な点があれば、Twitter等で気軽にご相談くださいませ。

2019年、CSS Niteでは49回の関連イベントを通して123セッションが行われました。その中からベスト・セッション+αを選びました。

2010年から2019年のベスト・セッション