CSS Gridを使って簡単なレイアウトを作りながら理解を深めよう 

CSS-Gridサムネイル

CSSのGridシステムの基本の復習を兼ねて、簡単なレイアウトを作りながら理解を深めます。

目次

CSS Gridシステムとは

CSSグリッドレイアウトモジュールの略です。

基本的な概念はこちら。

MDN Web Docs
CSS グリッドレイアウト - CSS: カスケーディングスタイルシート | MDN CSS グリッドレイアウトモジュールは、ページを大きな領域に分割することや、 HTML のプリミティブから構成されたコントロールの部品間の、寸法、位置、レイヤーに関する関...

CSS Gridsを使えば、 flexboxよりも簡単にはやくレイアウトを構築することができます。

また、flexboxと合わせて使うことで両方のメリットを得ることができます。

以下、Gridと略します。

CSS Gridのメリット

  • 二次元グリッドシステムが導入されたことで、より自由なレイアウトも簡単にはやく作ることができる
  • Bootstrapのような制限のあるフレームワークを使わなくて良くなった
  • レスポンシブの対応も簡単(Mediaクエリのコード量を減らせる)

CSS Gridのプロパティ

CSSグリッドに関する用語はFlexboxの用語と少し似ています。つまり、 Flexboxでflexコンテナがあるように、 CSSグリッドではgridコンテナがあり、要素のdisplayプロパティをgridに設定することで、 新しいグリッドコンテナが作成されます。

  • Gridの親要素 = Grid Container
  • Gridの子要素 = Grid Item
  • column = 列(縦)
  • row = 行(横)

※設定によって、columnを横・rowを縦にすることもできます

CSS Gridの主要なプロパティ一覧

Container
grid-template-rows
grid-template-columns
grid-template-areas
grid-templateで一括指定できる
grid全体のレイアウト指定
row-gap
column-gap
gapで一括指定できる
行や列の間のすき間 (溝)を定義
justify-items
align-items
justify-content
align-content
items=子要素
content=親要素
align=垂直方向の指定
justify=水平方向の指定
grid-auto-rows
grid-auto-columns
grid-auto-flow
grid-autoはアルゴリズムで暗黙的に生成される行や列を明示的に指定することができる。
grid-auto-flow=自動配置のアルゴリズムの動作を制御し、追加アイテムがどのようにグリッドに流れ込むかを指定するもの。デフォルトはrow。

メモ:2023/12月現在、gapの個別指定や偶数奇数要素の指定はできない

Item
grid-row-start
grid-row-end
grid-column-start
grid-column-end
grid-rowで行を一括指定できる
grid-columnで列を一括指定できる
grid-areaで行・列を一括指定できる
justify-self
align-self
justify=水平方向の指定
align=垂直方向の指定
orderアイテムを並べる順序を決める。値の昇順に配置される。0や-1も指定可能。

よく使う関数

repeat() 関数は 繰り返し同じ大きさのitemを作りたい時に便利です。例えば、repeat(3, 40%)は幅40%の要素を3つ作ってくれます。

よく使う大きさ指定の単位

Pxはもちろんremや%も使えるけど、fr(分数ユニット)は便利なのでよく使います。

1fr = 要素が使える範囲のいっぱいいっぱい。Spanを使うとセルを跨ぐことができます。

今回作る簡単なレイアウト

完成図

CSS Gridで作ったレイアウト

画面を小さくしても、要素が崩れないように作ります。

画面幅を小さくしたCSS Gridレイアウト

説明だけでは眠くなってしまうので、作りながら細かい解説をしていこうと思います。

HTMLでマークアップ

<div class="container">
  <div class="header">header</div>
  <div class="smallbox smallbox--1">small-1</div>
  <div class="smallbox smallbox--2">small-2</div>
  <div class="smallbox smallbox--3">small-3</div>
  <div class="main-content">main-content</div>
  <div class="sidebar">sidebar</div>
  <div class="footer">footer</div>
</div>

基本的に、Gridの場合はflexboxのように各セクションの子要素を親要素で囲む必要はありません。

SCSSでレイアウトを作る

手順

  • containerでGridを設定(grid-templateとgapはここで指定)
  • 今回は、row=4・column=4でtemplateを設定する
.container {
  background-image: linear-gradient(90deg, rgba(233, 233, 233, 1), rgba(172, 172, 172, 1));
  margin: 30px auto;

  display: grid;
  grid-template-rows: 100px 200px 400px 100px; //rowは画面幅が変わっても変わらないのでpx指定

  //columnとgapは画面幅に合わせて調整されるようにする(今回サイドバーは固定幅)
  grid-template-columns:repeat(3, 1fr) 200px; //サイドバーは他のカラムより小さいので等分ではない
  grid-gap: 1.5rem;

 //子要素全体の指定
  & > * {
    background-image: linear-gradient(90deg, rgba(144, 245, 154, 1), rgba(4, 202, 255, 1));
    color: #fff;
    font-size: 30px;
    font-family: sans-serif;
    padding:20px;
  }

ここで一度、検証ツールでgrid-lineを確認(Google Chromの場合は、検証ツール→ layout→ Show line numbers)すると、rowは上から・columnは左から1~5の番号が振られています。これがgrid-line(番号)になります。

何も指定していない時は番号ですが、grid-lineに名前を付けることも可能(詳しくは後述)。Show line numbersをShow line nameにすると名前も確認できます。

grid-lineの検証方法説明画像

grid-lineの検証はfirefoxも見やすくておすすめです。

headerにgrid番号を振ります。

gridの全幅を指定する際は、最後までという意味の-1を使います

.header {
    //grid-rowを入れてもいいけどアルゴリズムの自動配置があるので不要
    grid-column: 1 / -1;
    
  }

sidebarにgrid番号を振ります

.sidebar {
    //spanはセルの範囲 span 2 とすると2セル分
    grid-row: 2 / span 2;

    //grid-column: 4 / -1;でも間違いではない
    grid-column: 4 / 5;
  }
  • smallboxは「grid-row: 2 / 3;」と書きたいところですが、アルゴリズムの自動配置でOK。

main-contentに番号を振る。

.main-content {
    //grid-row = これも自動配置のため書かなくてOK
    grid-column: 1 / span 3;

  }

footerを設定。

 .footer {
    //grid-rowは自動配置
    grid-column: 1 / -1;
  }
} //--container

以上で、簡単なレイアウトが完成しました。

グリッドラインに名前をつける方法

小規模レイアウトなら、グリッドラインは番号指定でも特に支障はありませんが、大規模(10段以上の)レイアウトになってくると「あれ?ここ何番目のラインだっけ?」となることがあるので、グリッド線に名をつけた方が管理がしやすいです。

グリッド線に名前をつける場合はパーツ名に-star -end とパーツの始まり終わりとするとわかりやすいです。[名前は大括弧で囲みます]

HTMLマークアップは同じなので割愛します。

.container {
  background-image: linear-gradient(90deg, rgba(233, 233, 233, 1), rgba(172, 172, 172, 1));
  margin: 30px auto;

  display: grid;

//rowグのリッド線に名前をつける
  grid-template-rows: [header-start] 100px [header-end small-start] 200px [small-end main-start] 400px [main-end footer-start] 100px [footer-end];

//columnのグリッド線に名前をつける
//repeat()で作ったグリッドにも名前を入れます。その際、リピートの数だけ自動で1から順番に番号が振られます。
  grid-template-columns:repeat(3, [col-start] 1fr [col-end]) 200px [grid-end];
  grid-gap: 30px;

  & > * {
    background-image: linear-gradient(90deg, rgba(144, 245, 154, 1), rgba(4, 202, 255, 1));
    color: #fff;
    font-size: 30px;
    font-family: sans-serif;
    padding:20px;
  }

//プロパティで使用するときは、[]なしで名前のみ記載すればOK。番号は半角スペースを開けて記述
  .header {
    grid-column: col-start 1 / grid-end ;
  }

  .sidebar {
    grid-row: header-end / footer-start;
    grid-column: col-end 3 / grid-end;
  }

  .smallbox {
    //grid-row: 2 / 3; 自動配置のため不要

  }

  .main-content {
    grid-column: col-start 1 / col-end 3;

  }

  .footer {
    grid-column: col-start 1 / grid-end;
  }
}

以上です。番号よりも視覚的にどのパーツのグリッドか一目瞭然になりました。

グリッドエリアに名前をつける方法

こちらは、小規模レイアウト(4×4とか5×5くらいのレイアウト)に向いてます。

テンプレートエリア(セル)に、名前をつけていきます。テキストでレイアウトを表現するような感じになります。自動配置されてるものはプロパティに書かなくてもOK。

この方法では、最初にグリッドレイアウトを考えておくことが重要になってきます。※グリッドエリアの名前が過不足しているとグリッド自体が機能しないので注意

.container {
  background-image: linear-gradient(90deg, rgba(233, 233, 233, 1), rgba(172, 172, 172, 1));
  margin: 30px auto;
  
  display: grid;
  grid-template-rows:  100px  200px 400px 100px;
  
  grid-template-columns:repeat(3, 1fr) 200px;
  
  grid-template-areas: "head head head head"
                       "box-1 box-2 box-3 side"
                       "main main main side"
                       "foot foot foot foot";
//空のセルを作りたいときは.(ドット)を使います。例)". head head ."
  
  grid-gap: 30px;
  
  & > * {
    background-image: linear-gradient(90deg, rgba(144, 245, 154, 1), rgba(4, 202, 255, 1));
    color: #fff;
    font-size: 30px;
    font-family: sans-serif;
    padding:20px;
  }
  
  .header {
    grid-area: head; 
  }
  
  .sidebar {
    grid-area: side ;
    
  }
  
  .smallbox--1 {grid-area: box-1;}
  .smallbox--2 {grid-area: box-2;}
  .smallbox--3 {grid-area: box-3;}
  
  .main-content {
    grid-area: main;   
  }
  
  .footer {
    grid-area: foot;   
  }
}

以上。

参考にした教材はUdemyです。CSS Gridの講座は海外の講師が分かりやすく、教材も豊富でした。字幕があるので英語が得意じゃなくても大丈夫でした。

Udemyホームページ

まとめ

Gridには、何も指定せずともアルゴリズムの自動配置があり、明示的に指定しなくてもよしなにしてくれるという便利な機能があります。

今までの横並び方法よりもコードを書く量が少なくなりましたし、大規模なグリッドスタイルの時や、アプリのように幾つアイテムがあるかわからない時に便利ですね。

最近のモダンなサイトではGridがよく使われている印象です。またGridを使って何かを作りながら学んでいこうと思います。

シェアはこちらから!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Webクリエイター/大阪在住
Webで何かを作るのが好きです。もっと色々つくるために基礎の深い理解が必要と思ってこのブログを作りました。学びのアウトプットが中心です。
趣味:旅行とボディメイク(半年で-10kg達成)

目次