Skip to the content.

CSS Grid Layout の仕組みを知ろう

Grid Layoutとは、面倒だった複雑なレイアウトを実現するための手法の1つです。
Flexboxは横1方向(X軸)に強い手法だったのに対して、Grid Layoutは縦横2方向に強いレイアウト手法です。

ただ覚えることが多く、複雑な設定があり初心者には難しく感じることもあります。
Flexboxと比べてメリット・デメリットがありうまく使い分けていきましょう。



grid-basic.html

<ul class="container">
  <li class="item">Item1</li>
  <li class="item">Item2</li>
  <li class="item">Item3</li>
  <li class="item">Item4</li>
  <li class="item">Item5</li>
  <li class="item">Item6</li>
</ul>
.container {
  display: grid;
  min-height: 100vh; /* ブラウザ高さいっぱいにする */
  grid-template-columns: 100px 1fr 100px;
  grid-template-rows: 80px 80px 80px;
  gap: 10px;
}
.item {
  background-color: #faa; /* 色指定 */
}




その他の名称

ライン

アイテムを分ける行と列の線です。
ラインには、左上を起点として1から順に番号が振られています。

セル、トラック、エリア

セルとは、行と列に配置される最小の単位です。
トラックとは、コンテナの行と列の事です。
エリアとは、アイテムが結合してできた集まりです。
エリアには名前をつけることができて、アイテムを配置する事ができます。




1fr とは?

frとは、「fraction(比率)」のことでコンテナーに応じたアイテムのサイズを割合で指定する事ができます。

下記の図を表すと grid-template-columns: 100px 1fr 1fr 2fr; となります。
frの合計から、それぞれの数値が割合となって割り当てられます。
ざっくりと固定幅以外のスペースをどのくらいの割合で埋めるか、と覚えてください。




gap とは?

アイテム間の余白を指定できます。
Flexboxでもgapプロパティを用いて余白の調整が可能です。

.container {
  display: grid;
  row-gap: 20px;
  column-gap: 30px;

  /* ショートハンド */
  gap: 20px; /* 縦横20pxの場合 */
  gap: 20px 30px; /* 縦20px 横30pxの場合 */
}




エリアに名前をつけて指定する

それぞれのエリアに名前をつけてレイアウトをしていきます。
.container でレイアウトを明示的に決めて、それぞれのアイテムで名前を同期します。

完成形はこちらです。

まずHTMLを記述します。

<div class="container">
  <header class="header">header</header>
  <main class="main">main</main>
  <aside class="aside">aside</aside>
  <nav class="nav">nav</nav>
  <footer class="footer">footer</footer>
</div>


1. grid-template-areasでエリアに名前をつける

.container {
  display: grid;
  min-height: 100vh; /* ブラウザ高さいっぱいにする */
  gap: 10px 30px;
  grid-template-columns: 180px 1fr 80px;
  grid-template-rows: 60px 1fr 90px;
	
  grid-template-areas:
    "header header header"
    "aside  main   nav   "
    "footer footer footer";
}
/* エリアに名前をつける */  
.header {
  grid-area: header;
  background-color: #F24E1E;
}
.nav {
  grid-area: nav;
  background-color: #1ABCFE;
}
.main {
  grid-area: main;
  background-color: #FF7262;
}
.aside {
  grid-area: aside;
  background-color: #A259FF;
}
.footer {
  grid-area: footer;
  background-color: #0ACF83;
}


2. grid-templateでエリア名と各サイズを明示的に配置する

.container {
  display: grid;
  min-height: 100vh; /* ブラウザ高さいっぱいにする */
  gap: 10px 30px;
  grid-template:
    "header header header" 60px
    "aside  main   nav   " 1fr
    "footer footer footer" 90px
    / 180px   1fr   80px;
}
/* エリアに名前をつける */  
.header {
  grid-area: header;
  background-color: #F24E1E;
}
.nav {
  grid-area: nav;
  background-color: #1ABCFE;
}
.main {
  grid-area: main;
  background-color: #FF7262;
}
.aside {
  grid-area: aside;
  background-color: #A259FF;
}
.footer {
  grid-area: footer;
  background-color: #0ACF83;
}




grid-template-columns

列の数とサイズを設定する為のプロパティです。

grid-template-columns 列の数と幅を定義
100px 1fr 60px image.png
1fr 1fr 1fr image.png




grid-template-rows

行の数とサイズを設定する為のプロパティです。

grid-template-rows 行の数と幅を定義
200px 1fr 100px image.png
1fr 1fr 1fr image.png




1次元方法に対する便利なコード例

image.png

grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));



repeat関数

同じサイズが続く時にrepeat関数で部分的な繰り返しができます。
この関数は CSS グリッドのプロパティである grid-template-columnsgrid-template-rows の中で使う事が可能です。

grid-template-columns: repeat(3, 1fr);
/*
繰り返す回数, サイズ 
1fr 1fr 1fr と同じ意味
*/

第一引数(繰り返す回数)

:::note info auto-fitとauto-fillは後述するminmax()関数と合わせて使うと効果的です。 :::

第二引数(サイズ)

スペースを空けて複数のサイズを指定することも可能。

minmax()

2つの引数を取る、最小値と最大値が設定できる関数です。

<div class="container">
  <div>サイズ:50px.</div>
  <div>サイズ:1fr.</div>
  <div>サイズ:50px.</div>
  <div>サイズ:1fr.</div>
  <div>サイズ:100px.</div>
</div>
<div class="container minmax">
  <div>Item</div>
  <div>Item</div>
  <div>Item</div>
  <div>Item</div>
  <div>Item</div>
  <div>Item</div>
</div>
.container {
  display: grid;
  grid-template-columns: repeat(2, 50px 1fr) 100px;
  gap: 10px;
  /* 以下スタイリング用 */
  box-sizing: border-box;
  height: 200px;
  width: 100%;
  background-color: #eee;
  padding: 10px;
}
.container > div {
  background-color: #faa;
}
.container.minmax {
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}

grid-template-columns: repeat(2, 50px 1fr) 100px; の場合 image.png

grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); の場合 image.png

参考文献

https://developer.mozilla.org/ja/docs/Web/CSS/repeat
https://shu-naka-blog.com/css/repeat/#repeat
https://shu-naka-blog.com/css/auto-fit-fill/
https://webdesign-trends.net/entry/11086
https://ics.media/entry/15649/
https://zero-plus.io/media/grid-layout/