CSS Gridとは?レイアウトを効率よく作る方法
商品の一覧や、写真のギャラリーのように、縦と横にきれいにそろえて並べたいときに便利なのが、CSSの「Grid(グリッド)」です。
この記事では、CSS Gridの基本的な書き方と、Flexboxとの使い分けを解説します。
1.Gridは、縦と横のマス目で並べる仕組み
CSS Gridは、箱の中を縦と横のマス目(グリッド)に区切って、要素を配置するためのCSSの仕組みです。並べる側の箱(親)に display: grid を指定して使います。
.cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
}
この指定で、.cards の中の要素が、同じ幅の3列に並びます。
2.Gridが便利な理由
Flexboxは一列に並べるのが得意ですが、縦と横の両方をそろえるのは苦手です。Gridは、行と列を同時に決められるため、カードの一覧や、ページ全体のレイアウトを、少ない指定で作れます。
| Flexbox | Grid | |
|---|---|---|
| 得意なこと | 一列に並べる | 縦と横のマス目で並べる |
| 向いている例 | メニュー、ボタンの並び | 商品の一覧、ページ全体の枠組み |
Gridは、縦と横を同時にそろえたいときに使う仕組みです。
3.よく使う書き方
よく使うプロパティ
| プロパティ | 役割 |
|---|---|
| display: grid | Gridを使う(親に指定) |
| grid-template-columns | 列の数と幅 |
| grid-template-rows | 行の高さ |
| gap | マス目どうしの間隔 |
| grid-column / grid-row | 要素を、何列分・何行分にまたがらせるか |
fr は、残りの幅を分ける単位です。「1fr 2fr」と書くと、1:2の割合で幅を分けます。
例1:画面の幅に合わせて、列の数を自動で変える
.cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 24px;
}
1つのカードを240px以上にして、入る数だけ並べます。画面が狭くなると、自動で列が減ります。
例2:スマートフォンでは1列にする
.cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
}
@media (max-width: 600px) {
.cards {
grid-template-columns: 1fr;
}
}
よくあるつまずき
- display: grid を、並べたい要素(子)に書いてしまう(親に書く)
- 中の文字や画像が長くて、列の幅が崩れる(minmax(0, 1fr) を使うと防げることがある)
- スマートフォンで横にはみ出す(列の数を減らす)
4.よくある質問
FlexboxとGridは、一緒に使えますか?
使えます。ページ全体の枠組みはGrid、その中のボタンの並びはFlexbox、のように組み合わせるのが一般的です。
古いブラウザでも使えますか?
今の主なブラウザでは、問題なく使えます。
Gridは難しくないですか?
できることが多いぶん、プロパティも多いですが、まずは grid-template-columns と gap だけでも、多くのレイアウトを作れます。
要素の高さをそろえられますか?
同じ行の要素は、初めの設定で高さがそろいます。カードの一覧で高さをそろえたいときにも便利です。
5.まとめ
CSS Gridは、縦と横のマス目で要素を並べるための仕組みです。縦と横を同時にそろえたいレイアウトに向いています。
- 並べる側の箱(親)に display: grid を指定する
- grid-template-columns で列の数と幅を決める
- repeat(auto-fill, minmax(…)) で、列の数を自動で変えられる
- 一列の並びはFlexbox、マス目の並びはGridと使い分ける
一列に並べる方法は、CSSのFlexboxとは?で解説しています。
レイアウトの作り方や、崩れの直し方で困っている場合は、浅草Web屋にご相談ください。