노트

CSS 박스 모델

CSS Box Model

프런트엔드#css · 연결된 개념 6개

쉽게 말하면

CSS 박스 모델은 모든 요소를 액자처럼 보는 거예요. 그림인 콘텐츠, 둘레 여백인 padding, 액자 틀인 border, 벽에 걸 때 띄우는 간격인 margin, 이 네 겹으로 크기와 간격을 계산하죠.

비유가 깨지는 곳 기본값에선 width가 그림 크기만 가리켜서 여백과 틀을 더하면 액자가 커져요. 그래서 리셋에서 border-box로 바꾸고, 위아래로 맞닿은 margin은 더해지지 않고 큰 값 하나만 남는다는 것도 기억해요.

브라우저는 모든 요소를 사각형 상자로 보고, 그 상자를 안쪽부터 콘텐츠(content) → 안쪽 여백(padding) → 테두리(border) → 바깥 여백(margin) 네 겹으로 계산한다. 레이아웃에서 요소가 차지하는 크기와 요소 사이 간격이 모두 이 네 겹에서 나온다.

margin
  border
    padding
      content (width × height)

box-sizing: width가 어디까지인가

값width가 가리키는 것실제 차지 너비(margin 제외)
content-box(기본값)콘텐츠만width + padding + border
border-box콘텐츠 + padding + borderwidth 그대로
.card { width: 300px; padding: 20px; border: 1px solid; }
/* content-box: 342px, border-box: 300px */

기본값으로는 padding을 늘리면 상자도 함께 커져서 계산이 번거롭다. 그래서 대부분의 CSS 리셋은 *, *::before, *::after { box-sizing: border-box; }로 시작한다.

알아 둘 동작

  • 마진 상쇄(Margin Collapsing): 일반 흐름(normal flow)에서 위아래로 맞닿은 블록의 세로 margin은 더해지지 않고 큰 값 하나만 남는다. 부모와 첫·마지막 자식의 margin이 맞닿을 때, 내용 없는 빈 블록의 위아래 margin끼리도 상쇄된다. Flexbox·그리드(Grid) 아이템이거나 padding·border로 떨어져 있으면 생기지 않는다
  • 인라인 상자: display: inline이면 width·height가 적용되지 않는다. 세로 margin은 효과가 없고, 세로 padding은 그려지기는 하지만 위아래 줄을 밀어내지 않는다. inline-block은 줄 안에 있으면서 블록처럼 크기를 받는다
  • outline은 박스 밖: outline과 box-shadow는 크기 계산에 들어가지 않아 레이아웃을 흔들지 않는다
  • 상자 크기가 바뀌면 리플로우(레이아웃 재계산)가 일어난다. DevTools Elements 패널의 Computed 탭에서 네 겹 수치를 그림으로 볼 수 있다 → 크롬 개발자 도구 팁

여러 규칙이 같은 박스 속성을 지정할 때 무엇이 이기는지는 CSS 캐스케이드와 CSS 명시도가 정한다.

명세: W3C — CSS Box Model Module Level 3 · W3C — CSS 2.2 §8.3.1 Collapsing margins · W3C — CSS 2.2 §10.6.1 Inline, non-replaced elements · W3C — CSS Box Sizing Module Level 3: box-sizing 출처: MDN — The box model · MDN — box-sizing · MDN — Mastering margin collapsing

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 비율을 유지하는 박스

    너비가 바뀌어도 가로세로 비율(예: 16:9)을 지키는 상자. 지금은 aspect-ratio 속성 한 줄이면 되고, 그 전에는 퍼센트 padding을 이용한 트릭을 썼다. 임베드 동영상(iframe)을 반응형으로 만들 때 주로 쓴다.

  • Tailwind CSS

    flex, px-4, text-sm처럼 속성 하나를 담은 유틸리티 클래스(Utility Class)를 마크업에 조합해 스타일을 입히는 CSS 프레임워크. 빌드할 때 소스를 훑어 실제로 쓰인 클래스의 CSS만 만들어 내는 빌드 도구이고, 런타임에 돌아가는 JS(JavaScript)는 없다.

  • 반응형 웹 디자인

    하나의 페이지가 화면 크기와 기기에 맞춰 레이아웃·이미지·글자 크기를 바꾸도록 만드는 접근. 미디어 쿼리(Media Query), 유연한 레이아웃(Flexible Layout), 반응형 미디어(Responsive Media)가 세 축이다.

  • inset 속성

    top·right·bottom·left를 한 번에 지정하는 단축 속성. inset: 0은 네 방향을 모두 0으로 둔다. Tailwind의 inset-0·inset-auto 클래스가 이 속성이다.

  • CSS Grid

    행과 열을 동시에 정의해 아이템을 배치하는 2차원 레이아웃 방식. 컨테이너가 트랙(Track, 행·열)의 크기를 정하고 아이템은 그 칸에 들어간다.

보기 옵션