横幅が広がったときの挙動が変わる!CSS Gridの「auto-fill」と「auto-fit」の違い

CSS Gridを使うとグリッドレイアウトの実装が非常にラクにできますが、その中でもrepeat()とminmax()を使うと、カードの繰り返しのようなレスポンシブレイアウトがメディアクエリを使わずに実装できます。
今回はrepeat()の中で使えるauto-fillとauto-fitの違いやそれぞれの動きについてまとめておきます。
CSS Gridの基本
CSS GridはFlexboxと同じように親要素に対して、その子要素がどんなレイアウトになるか指定します。
「grid-template-columns」で横方向のレイアウトを指定し、「grid-template-rows」で縦方向のレイアウトを指定します。
下記のように、どのサイズでレイアウトを分割するのか指定します。
.grid {
grid-template-columns: 280px 1fr 1fr;
}1frというのはCSS Grid特有の単位で「残りの幅いっぱい」という意味になります。
ちなみにfrは「fraction」で「割合」の意味です。
.gridの横幅が980pxだった場合、1番左カラムで280px使用して、残りは700pxになります。
1frの指定が2つあるので、この場合は均等に分けて350pxが2つのレイアウトになります。
要素の幅が変変わってもpx指定した部分は固定で、fr指定の部分は残ったサイズを分けて調整してくれるので、レスポンシブ対応が非常にラクになります。
repeat()の使い方
例えば、同じサイズのカラムを複数回繰り返すレイアウトの場合、repeat()を使うとシンプルに書けます。
最初に繰り返し回数を指定して、そのあとにカラム幅を指定して使います。
grid-template-columns: repeat(3, 280px);同じ数字を複数回繰り返すよりもスッキリします。
また、下記のようにカラム幅を複数指定すると、280pxと380pxの指定を3回繰り返すようになります。
grid-template-columns: repeat(3, 280px 380px);minmax()の使い方
カラム幅が固定だと、柔軟なレスポンシブ対応はできません。そこで便利なのがminmax()です。
カラム幅を指定するときに、minmax(最小値, 最大値)を指定すると、要素の幅が変わっても最小値と最大値の間でいい感じに切り替わってくれます。
grid-template-columns: repeat(3, minmax(280px, 1fr));こうなってくると、今度は繰り返し回数部分も画面サイズに応じて変化したくなってきます。
そこで登場するのがauto-fillやauto-fitです。
auto-fillとauto-fitの違い
下記のコードを用意して動きの違いを確認します。
See the Pen Grid: auto-fill / auto-fit by Masakazu Saito (@31mskz10) on CodePen.
<h2>auto-fill</h2>
<div class="grid grid-auto-fill">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
<div>Item 4</div>
</div>
<h2>auto-fit</h2>
<div class="grid grid-auto-fit">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
<div>Item 4</div>
</div>.grid {
display: grid;
grid-auto-rows: 80px;
grid-gap: 10px;
background: #fff;
box-shadow: 0 3px 8px rgba(0,0,0,0.15);
margin: 10px 0 48px;
padding: 10px;
}
.grid > div {
display: flex;
justify-content: center;
align-items: center;
background: #ccc;
}
.grid-auto-fill {
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
}
.grid-auto-fit {
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
}横幅を狭めたときの動きに変化はありませんが、横幅が広がったときに挙動が変わってきます。
auto-fill
auto-fillを使うと、画面サイズを広げていったときに新たに最小値の180px分のスペースが生まれると、そこに新たな空のグリッドを生成します。

fill(塗り)なので、グリッドを追加できるようなスペースがあるとどんどん追加していきます。
auto-fit
auto-fitを使うと、画面サイズを広げていっても新たなグリッドは生成されません。

空のグリッドは生成せずに、fit(フィット)するような形で伸びていきます。
画面サイズを広げたときの微妙な違いですが、こうした違いを理解しつつ使いこなせると、少ない記述で使い勝手の良いレスポンシブ対応のレイアウトが作れます。

Apacheのテストページを非表示にする方法
Visual Studio Codeで簡易的なローカルサーバーを起動して、コード保存時に自動でブラウザをリロードする拡張機能「Live Server」
Movable TypeでAssetURLやEntryPermalink・ContentPermalinkで出力されるパスを絶対パスから相対パスに変える
WordPressで「予約投稿の失敗」となってしまう場合の対処方法
goenvを使って、MacにGo言語をインストールする
Macで.pemを使ってAmazon EC2インスタンスへSSH接続する方法
SourceTreeのカスタムアクションを使って差分ファイルだけをまとめる方法
iOSシミュレーターを使ってWebサイトを開発者ツールを見ながら実機表示で開発する方法
常時SSL化の設定をしたのに「保護された通信」が表示されない時はパスにHTTPが残っているのかも?
Backlogで2段階認証を設定後、SourceTreeでアカウントエラーが発生する場合の対処法
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
操作に没頭できる!Firefox版 Arcのようなブラウザ「Zen Browser」
chezmoi(シェモア)で始めるdotfiles管理
GitHubの通知を見逃さない!通知に特化したアプリ「Gitify」
Keyboard Maestroの変数基礎
Neovimを使い始める最初の一歩として便利な「LazyVim」
ウェブサイトをmacOSアプリとしてラッピングする「Unite Pro」
Keyboard Maestroの「Macro Debugger」で複雑なマクロのデバッグを行う方法
無料版でも高機能なランチャーアプリ「Raycast」の基本機能と環境設定
OnyXでターミナルを使わずにmacOSの詳細設定を行う
軽量で高速なターミナルエミュレーター「Ghostty」の設定方法