내재적 크기

Intrinsic sizing

컨테이너가 아니라 내용물 자체가 "얼마나 넓어야 하는지"를 정하는 크기 키워드 3종 — `min-content`·`max-content`·`fit-content()`.

다른 이름: min-contentmax-contentfit-content
···
html
<div class="board" id="board">
  <div class="track"><div class="box w1">Bright orange kangaroo</div><span class="tag">width: 100%</span></div>
  <div class="track"><div class="box w2">Bright orange kangaroo</div><span class="tag">width: min-content</span></div>
  <div class="track"><div class="box w3">Bright orange kangaroo</div><span class="tag">width: max-content</span></div>
  <div class="track"><div class="box w4">Bright orange kangaroo</div><span class="tag">width: fit-content(120px)</span></div>
</div>
css
.board{width:min(92%,420px);display:flex;flex-direction:column;gap:14px}
.track{position:relative;border:2px dashed var(--muted);border-radius:8px;padding:8px 6px 6px;overflow:visible;
  width:62%;transition:width 2.8s cubic-bezier(.4,0,.2,1)}
.board.narrow .track{width:26%}
.box{background:var(--accent);color:#fff;border-radius:6px;padding:6px 8px;font-size:clamp(9px,1.8vmin,11px);
  font-weight:700;line-height:1.3;box-shadow:0 2px 8px rgba(0,0,0,.12)}
.w1{width:100%}
.w2{width:min-content}
.w3{width:max-content;background:var(--accent-3)}
.w4{width:fit-content(120px);background:var(--accent-3)}
.tag{position:absolute;left:6px;top:-9px;font:700 8px/1 ui-monospace,monospace;background:var(--bg);
  padding:0 4px;color:var(--accent-2)}
.track.spill .box{outline:2px solid var(--accent-2);outline-offset:1px}
js
const board = document.getElementById('board');
const tracks = board.querySelectorAll('.track');
setInterval(() => board.classList.toggle('narrow'), 2800);
function check() {
  tracks.forEach((t) => {
    const box = t.querySelector('.box');
    const over = box.scrollWidth > t.clientWidth - 12;
    t.classList.toggle('spill', over);
  });
  requestAnimationFrame(check);
}
requestAnimationFrame(check);

`width: 100%`나 `auto`는 컨테이너를 기준으로 크기가 정해지는 "외재적(extrinsic)" 크기입니다. 반대로 `min-content`·`max-content`·`fit-content()`는 안의 내용물만 보고 크기를 정하는 "내재적(intrinsic)" 크기입니다 — 그래서 컨테이너가 좁아져도 그 값 자체는 바뀌지 않고, 대신 컨테이너보다 넓으면 그냥 넘칩니다(overflow).

`min-content`는 줄바꿈이 허용되는 한 가장 좁게 줄어든 너비로, 실질적으로 "가장 긴 단어 하나가 줄바꿈 없이 들어가는 너비"입니다. `max-content`는 그 반대로 아예 줄바꿈을 하지 않았을 때의 너비, 즉 한 줄로 쭉 펼쳤을 때의 폭입니다. `fit-content(L)`은 그 둘 사이를 `L`이라는 상한으로 자르는 값으로, `clamp(min-content, L, max-content)`와 같은 동작을 합니다.

아래 데모에서 같은 문장을 4가지 폭 규칙으로 나란히 두면, `width: 100%`짜리 파란 박스만 컨테이너를 따라 계속 줄어들고 나머지 셋은 자기 크기를 고집하다가 컨테이너가 그보다 좁아지는 순간 테두리를 뚫고 나갑니다(주황 테두리로 표시). 이게 "내재적 크기는 컨테이너 사정을 봐주지 않는다"는 뜻입니다.

언제 쓰나

버튼처럼 "내용보다 넓어지면 안 되는" 요소에는 `width: fit-content`가 유용합니다. `max-content`는 표의 열 너비처럼 절대 줄바꿈되면 안 되는 텍스트에, `min-content`는 카드가 줄어들 수 있는 최소 한계를 잴 때 씁니다.