C.W.K.
Stream
Lesson 01 of 04 · published

Box Model: Content, Padding, Border, Margin

~11 min · box-model, box-sizing, margin-collapse, width

Level 0Markup Novice
0 XP0/34 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"모든 element 가 박스. Content 주변의 네 링이 모든 layout 논쟁의 실제 주제."

네 링

모든 CSS 박스가 네 동심원 영역 가짐, 안쪽에서 바깥쪽으로:

  1. Content — 텍스트, 이미지, 또는 자식 element.
  2. Padding — border 안쪽 공간. 배경색이 padding 까지 확장.
  3. Border — 보이는 경계. 자기 색, 너비, 스타일 가짐.
  4. Margin — border 바깥쪽 공간. 투명; 이웃을 밀어내.

DevTools (아무 브라우저) 가 Computed 창에서 시각으로 보여 줘: content (파랑), padding (초록), border (노랑), margin (주황) 색칠된 영역 가진 정사각형 다이어그램. 순서 외워; 이 레슨 모든 게 이걸로 돌아와.

width/height 질문

함정 여기 있어: .box { width: 200px; padding: 20px; border: 1px solid; } 적으면, 렌더된 element 가 얼마나 넓어?

기본 (box-sizing: content-box — 옛 기본) 으로: 242px. 200px 가 content 너비; padding 과 border 가 더해져.

box-sizing: border-box 로: 200px. 200px 가 바깥 너비; padding 과 border 가 안에 살아.

어느 게 너의 mental model 과 매치해? 거의 모두가 "200px" — border-box 가정. 기본은 content-box, 그래서 모든 모던 reset 이 이걸로 시작:

Universal Reset (이거 외워)

이 세 줄 reset 이 모든 모던 CSS 파일에 있어. 너가 쓰는 모든 페이지에 적용하고, 기본이 존재했었다는 걸 잊어:

Margin Collapse: 수학이 거짓말하는 한 자리

두 수직 margin 이 만나면, 더해지지 않아. 둘 중 큰 거로 무너져. <h2 style="margin-bottom: 30px"> 뒤에 <p style="margin-top: 20px"> 가 둘 사이 30px 만들어, 50px 가 아니라.

규칙:

  • 수직만. 수평 margin 은 절대 collapse 안 함.
  • 인접 sibling 이 collapse. 두 block element 사이 공간은 첫 번째의 bottom margin 과 두 번째의 top margin 중 큰 쪽.
  • 부모와 첫/마지막 자식이 collapse — 둘 사이에 아무것도 없으면 (padding 없음, border 없음, 인라인 콘텐츠 없음). "내 자식 margin-top 이 부모 밀어내림" 이 일어나는 이유.
  • 음수 margin 이 양수와 collapse. Sibling 의 margin-bottom: 30pxmargin-top: -10px 가 둘 사이 20px.

Collapse 는 block flow 에서만 발생. Flexbox 자식은 collapse 안 함. Grid 항목도 안 함. 모던 CSS 가 layout 에 Flexbox 와 Grid 쓰는 큰 이유: margin collapse 가 너를 놀라게 그만함.

Flexbox 와 Grid 의 spacing 에는 gap 써, margin 말고. gap 이 컨테이너 안에서 어느 자식이 첫이든 마지막이든 무관하게 작동, collapse 이상함 없이, content 삽입/제거에도 일관. Margin 은 개별 element offset 에 여전히 유용, 하지만 grid/flex spacing 에는 gap 이 모던 답.

min-width, max-width, min-height, max-height

값이 아니라 제약. 트리거되면 width/height override:

  • Content 가 그 밑으로 줄어들면 min-widthwidth 이김.
  • Content 가 그 너머로 자라면 max-widthwidth 이김.
  • 가장 유용한 패턴: img, video { max-width: 100%; height: auto; } — 이미지가 fit 으로 줄어들지만 컨테이너 over flow 절대 안 함.
  • 가장 유용한 페이지 패턴: main { max-width: 70ch; margin: 0 auto; } — 가독성 좋은 줄 길이, 가운데 정렬.

Aspect Ratio: 모던 property

aspect-ratio: 16 / 9 가 박스 height 를 width 의 비율로 설정. 옛날엔 padding-bottom hack 필요; 이제 native. 반응형 이미지와 embed 와 완벽하게 페어.

피파의 노트

피파의 WebUI 의 모든 CSS 파일이 *, *::before, *::after { box-sizing: border-box; } 로 시작. 모든 페이지의 메인 콘텐츠 영역이 main { max-width: 65ch; margin-inline: auto; }. 모든 비디오 미리보기가 aspect-ratio: 16 / 9. 이 세 패턴만으로 디버깅에 다이어그램 필요했던 layout 버그 세 카테고리가 제거됐어.

Code

모든 프로젝트에 복사할 세 줄·css
/* UNIVERSAL RESET — 모든 파일이 여기서 시작 */
*, *::before, *::after {
  box-sizing: border-box;
}

/* 이제 width 와 height 가 바깥 차원을 뜻해.
   200px 너비 박스가 padding 과 border 와 무관하게
   200px 너비 유지. 수학이 마침내 너의
   mental model 과 매치. */
content-box vs border-box, 수학·css
/* 박스 모델 실제 */

.demo {
  width: 300px;
  padding: 20px;          /* border 안쪽 20px */
  border: 2px solid #5BA3D8;
  margin: 16px;           /* 박스 주위 16px 공간 */
}

/* border-box 없이 (기본 content-box):
   - Content 영역 = 300px
   - 총 렌더 너비 = 300 + 20*2 + 2*2 = 344px

   border-box 로:
   - 바깥 너비 = 300px (항상)
   - Content 영역 = 300 - 20*2 - 2*2 = 256px
   - Padding 과 border 가 선언된 너비 안으로 먹어 들어옴
*/

/* Margin 은 어느 모델에서도 안 셈 — 항상 바깥 */
/* margin: 16px 가 박스 주위 32px 빈 공간 더함 */
min/max 제약 + aspect-ratio·css
/* 제약: min, max, aspect-ratio */

.responsive-img {
  max-width: 100%;        /* 컨테이너에 fit */
  height: auto;            /* aspect ratio 유지 */
  display: block;          /* 인라인 공백 갭 제거 */
}

.readable-page main {
  max-width: 70ch;         /* 줄당 본문 텍스트 ~70 자 */
  margin-inline: auto;     /* 가운데, logical property 명명 */
  padding-inline: 1rem;    /* 좁은 화면에서 숨 공간 */
}

.video-thumbnail {
  aspect-ratio: 16 / 9;
  width: 100%;
  background: #222;
  border-radius: 8px;
  overflow: hidden;
}

.square-avatar {
  aspect-ratio: 1;         /* 1 / 1 의 약자 */
  width: 48px;
  border-radius: 50%;
}

External links

Exercise

width: 300px, padding: 20px, border: 2px solid 가진 카드 하나가 있는 단일 페이지 만들기. 두 번 렌더: 한 번은 reset 없이 (content-box 효과), 한 번은 * { box-sizing: border-box } 로. DevTools 의 computed 창으로 둘 다 측정해서 렌더된 너비가 위 수학과 매치하는지 확인. 그러고 나서 수직 margin 가진 sibling 둘 추가하고 큰 거로 collapse 하는지 확인.
Hint
DevTools → Elements → 박스 선택 → Computed 탭 → 아래쪽 박스 다이어그램으로 스크롤. Content, padding, border, margin 픽셀 크기 측정값 보여 줘. 카드 둘을 side by side 비교.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.