A function that sizes to fit the content but never grows beyond a limit you set—handy for buttons, labels, or grid columns to stay neatly contained.
fit-content()
は「中身に合わせてサイズを決めるけど、この上限は越えないでね」とお願いする関数です。自動でちょうどいい幅(または高さ)にしつつ、上限のフタを付けるイメージです。
ボタンやタグのように文字数に合わせて程よく伸び縮みさせたいとき、あるいは Grid の列幅を“中身優先だけど最大○○まで”にしたいときに便利です。
fit-content(X)
は、要素やグリッドトラックのサイズを「内容に必要なサイズ」と「指定した上限 X
」のうち小さい方に決めます。式で表すなら、実際のサイズ = min(内容に必要なサイズ, X)
(レイアウト上の最小サイズなども併せて考慮されます)。
width
/ height
などのサイズ指定、grid-template-columns
/ grid-template-rows
のトラックサイズ。px
/ rem
/ ch
/ %
/ vh
などの長さ・割合。width: fit-content(20rem);
のように指定すると、中身に合わせて広がるが最大 20rem で止まります。grid-template-columns: fit-content(16ch) 1fr;
のようにすると、1 列目は内容に合わせるが最大 16 文字分まで、2 列目は残りを使います。height: fit-content(60vh);
で中身に合わせつつ、画面の 60% を上限にできます。CSS
.chip {
padding: 0.25rem 0.5rem;
border: 1px solid #ccc;
width: fit-content(20rem); /* 中身に合わせるが最大 20rem */
overflow-wrap: anywhere; /* 長い単語のはみ出し対策 */
}
CSS
.grid {
display: grid;
grid-template-columns: fit-content(12ch) 1fr; /* 1 列目は中身優先 + 上限 12ch */
gap: 0.75rem;
}
HTML
<div class="grid demo">
<div class="label">User name</div>
<input class="field" type="text" placeholder="your-id">
<div class="label">VeryLongLabelWithoutBreaks</div>
<input class="field" type="text" placeholder="auto-fit with cap">
</div>
CSS
.grid.demo {
display: grid;
gap: 0.5rem 1rem;
grid-template-columns: fit-content(16ch) 1fr;
align-items: center;
}
.grid.demo .label { overflow-wrap: anywhere; }
.grid.demo .field { inline-size: 100%; }
ラベル列は内容に合わせて広がりますが、最大 16 文字分で止まり、残りのスペースは入力欄が受け持ちます。長い英単語も overflow-wrap: anywhere;
で折り返せます。
width: auto; max-width: X;
でも似た結果になりますが、Grid の列幅などでは fit-content(X)
の方が読みやすく一箇所で完結します。overflow-wrap: anywhere;
や word-break
を併用。