横幅が広がったときの挙動が変わる!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(フィット)するような形で伸びていきます。
画面サイズを広げたときの微妙な違いですが、こうした違いを理解しつつ使いこなせると、少ない記述で使い勝手の良いレスポンシブ対応のレイアウトが作れます。

SourceTreeのカスタムアクションを使って差分ファイルだけをまとめる方法
JavaScriptのforEach内で「continue」や「break」のような動作をさせる方法
Visual Studio Codeのファイル横に表示されるファイルアイコンのテーマまとめ
GUIコンパイラのPreprosを使ってSassのコンパイルを行う
Post Snippetsを使ってWordPressでショートコードをの登録と管理をもっと楽に!!
Movable TypeでAssetURLやEntryPermalink・ContentPermalinkで出力されるパスを絶対パスから相対パスに変える
Nuxt.jsでページを作成・追加する方法|Nuxt.jsの基本
Nuxt.jsで「Classic mode for store/ is deprecated and will be removed in Nuxt 3.」のエラーメッセージが表示される場合の対処法
CSSの読み込みで「its MIME type (‘text/html’) is not a supported stylesheet MIME type」エラーが表示されて読み込みができない場合の解決方法
Vue.jsのv-forで生成した要素をクリックするたびに、classをトグルで付け外しする方法
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
1つのノートアプリにすべて集約するのをやめた理由|2025年時点のノートアプリの使い分け
Notionログイン時の「マジックリンク」「ログインコード」をやめて普通のパスワードを使う
AlfredでNotion内の検索ができるようになるワークフロー「Notion Search」
Gitで1行しか変更していないはずのに全行変更した判定になってしまう
Macでアプリごとに音量を調節できるアプリ「Background Music」
Macのターミナルでパスワード付きのZIPファイルを作成する方法
MacBook Proでディスプレイのサイズ調整をして作業スペースを広げる
SteerMouseの「自動移動」機能で保存ダイアログが表示されたら自動でデフォルトボタンへカーソルを移動させる
iPhoneでタッチが一切効かなくなった場合に強制再起動する方法