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

grid-template-areas: ASCII 아트로서의 layout

~11 min · grid-template-areas, named-areas, grid-area

Level 0Markup Novice
0 XP0/34 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"CSS 가 layout 의 스케치처럼 읽혀. 비유가 아니야 — 문법이 문자 그대로 그래."

아이디어

대부분 layout 이 명명된 영역으로 묘사 가능: header, 사이드바, main, footer. grid-template-areas 가 string 으로 그 지도를 CSS 에 직접 그리게 해 줘 — 각 string 이 row 고 각 단어가 셀 이름. 항목이 그 다음 grid-area 로 이름으로 영역 참조.

결과는 CSS 가 가진 가장 가독성 좋은 layout 문법 — CSS 가 문자 그대로 스케치처럼 보임.

문법

Grid 컨테이너에:

.layout {
  display: grid;
  grid-template-columns: 240px 1fr;
  grid-template-rows: auto 1fr auto;
  grid-template-areas:
    "header  header"
    "sidebar main"
    "footer  footer";
}

각 string 이 row 하나. String 안에서 이름이 공백으로 구분, 각 이름이 column 하나에 해당. 위 string 이 row 셋 정의:

  • Row 1: header 가 양 column span.
  • Row 2: sidebar 가 column 1, main 이 column 2.
  • Row 3: footer 가 양 column span.

셀 span 하려면 이름 반복. 셀 비우려면 단일 마침표 . (또는 점 시퀀스).

이름으로 항목 배치

이제 항목이 grid-area: 으로 영역에 land:

header  { grid-area: header; }
aside   { grid-area: sidebar; }
main    { grid-area: main; }
footer  { grid-area: footer; }

참고: grid-area: header (단일 이름) 가 영역 이름으로 해석. grid-area: 1 / 1 / 2 / 3 (숫자 넷) 가 라인 번호 약자. 파서가 구분.

. 으로 빈 셀

셀 비우길 원하면 (gap 또는 padding 영역), 마침표 사용:

grid-template-areas:
  "header header header"
  ".      main   ."
  "footer footer footer";

이게 main 영역이 가운데 row 의 가운데 column 에 있고 양 옆에 빈 셀 가진 layout 만듦.

Template Swap 으로 반응형 reflow

킬러 feature: media query 에서 template 재정의 — 단일 선언으로 layout 완전 재배열, 항목 안 건드리고.

시각 스케치 읽기

String 을 조심스럽게 정렬하면, template 가 문자 그대로 너가 묘사하는 layout 처럼 보여:

페이지 레벨 layout 에 grid-template-areas 써. 무슨 일 일어나는지 설명하려 ASCII-art 코멘트 잡고 싶은 자리 어디든, template 가 곧 그 코멘트 — 그리고 layout 빌드. 문서로서의 코드.

제약

  • 영역은 직사각형이어야 함. L 모양 영역 정의 불가. 시도하면 ("a a b" / "a b b"), CSS 가 template 를 invalid 로 거부.
  • 이름은 단순 string. camelCase 강제 없음; 파서가 관대. kebab-case 또는 단일 단어 써.
  • 컨테이너당 template 하나. 중첩 grid 가 각자 template; 상속 안 함.

라인 번호 대신 쓸 때

  • 매우 동적 배치 — JS 에서 계산된 항목이 데이터 기반으로 특정 셀에 land. 라인 번호가 계산 쉬움.
  • auto-placement 가진 사진 갤러리 — auto-placement 가 처리; 일부 항목 크게 만들려 span 사용.
  • Breakpoint 마다 항목 수 바뀌는 layout — 라인 번호가 media query 와 더 잘 compose.

페이지 레벨 모든 거 — 앱 셸, 대시보드 frame, 고정 영역 구조 가진 마케팅 페이지 — 에 template-areas 가 가독성에서 매번 이김.

피파의 노트

cwk-quests 상세 페이지가 template-areas 사용: 왼쪽 nav, 가운데 main, 오른쪽 meta, 위에 header. CSS template 가 문자 그대로 페이지처럼 보임. 아빠와 내가 quest-evolution-log 사이드바 추가했을 때, 모든 항목 배치 재구성 대신 evolution row 추가하게 template 재정의. Template-areas 의 시각 가독성이 리팩토링 한 시간 절약.

Code

세 영역, 하나의 template·css
/* 클래식 페이지 셸: header, 사이드바, main, footer */
.layout {
  display: grid;
  grid-template-columns: 240px 1fr;
  grid-template-rows: auto 1fr auto;
  grid-template-areas:
    "header  header"
    "sidebar main"
    "footer  footer";
  min-height: 100vh;
  gap: 1rem;
}

.site-header { grid-area: header; }
.site-nav    { grid-area: sidebar; }
.site-main   { grid-area: main; }
.site-footer { grid-area: footer; }

/* Template 이 문자 그대로 시각 layout 에 매핑 */
반응형: media query template swap 통한 재배열·css
/* 반응형: media query 에서 template 재정의로 재배열 */
@media (max-width: 768px) {
  .layout {
    grid-template-columns: 1fr;        /* 좁은 화면에서 단일 column */
    grid-template-areas:
      "header"
      "main"        /* 모바일에서 사이드바 전에 main */
      "sidebar"
      "footer";
  }
}

/* .site-* 선언이 안 바뀜. 컨테이너의 template 가 그것들을
   재배열. 이게 킬러 feature: 항목 배치 안 건드리고
   layout 변형. */
Holy Grail + 빈 셀 가진 가운데 정렬 modal·css
/* Holy Grail layout — header, 3 column, footer */
.holy-grail {
  display: grid;
  grid-template-columns: 200px 1fr 240px;
  grid-template-rows: auto 1fr auto;
  grid-template-areas:
    "header   header  header"
    "nav      main    aside"
    "footer   footer  footer";
  min-height: 100vh;
  gap: 1rem;
}

header { grid-area: header; }
nav    { grid-area: nav; }
main   { grid-area: main; }
aside  { grid-area: aside; }
footer { grid-area: footer; }

/* 좁은 화면에서 stack 하고 재정렬 */
@media (max-width: 768px) {
  .holy-grail {
    grid-template-columns: 1fr;
    grid-template-areas:
      "header"
      "main"        /* main 이 시각적으로 먼저 */
      "nav"
      "aside"
      "footer";
  }
}

/* 빈 셀 가진 layout */
.centered-modal {
  display: grid;
  grid-template-columns: 1fr 600px 1fr;
  grid-template-rows: 1fr auto 1fr;
  grid-template-areas:
    ". .       ."
    ". content ."
    ". .       .";
  min-height: 100vh;
}
.modal-content { grid-area: content; }

External links

Exercise

grid-template-areas 써서 Holy Grail layout (header, 왼쪽 nav, main, 오른쪽 aside, footer) 짓기. 그러고 768px 에 main 이 먼저인 단일 column stack 으로 전환하는 media query 추가. DevTools 에서 source HTML 순서 안 바뀌어야 하는 거 확인 — template 가 시각 재정렬 처리. 그러고 실험: L 모양 영역 추가 시도하고 layout 이 auto-placement 로 fall back 하는 거 관찰.
Hint
L 모양 영역이 조용히 실패 — CSS 가 에러 안 내고 template 무시. DevTools grid overlay 로 검사해서 실제 렌더 보기. 시각 다이어그램이 template 가 받아들여졌는지 즉시 알려 줘.

Progress

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

댓글 0

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

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