Tan Kim

Layout (레이아웃)

Flexbox

1차원 레이아웃 (행 또는 열).

.container {
  display: flex;
  flex-direction: row;        /* row | row-reverse | column | column-reverse */
  justify-content: center;    /* 주축 정렬: flex-start | center | flex-end | space-between | space-around */
  align-items: center;        /* 교차축 정렬: stretch | flex-start | center | flex-end */
  flex-wrap: wrap;            /* nowrap | wrap */
  gap: 16px;
}
 
.item {
  flex: 1;                    /* flex-grow: 1, flex-shrink: 1, flex-basis: 0 */
  flex: 0 0 200px;            /* 고정 너비 */
  align-self: flex-start;     /* 개별 교차축 정렬 */
  order: 2;                   /* 순서 변경 */
}

자주 쓰는 패턴

/* 수직 수평 가운데 정렬 */
.center {
  display: flex;
  justify-content: center;
  align-items: center;
}
 
/* 양끝 정렬 */
.space-between {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
 
/* 나머지 공간 채우기 */
.fill {
  flex: 1;
}

CSS Grid

2차원 레이아웃 (행과 열).

.container {
  display: grid;
  grid-template-columns: 1fr 2fr 1fr;           /* 비율 */
  grid-template-columns: repeat(3, 1fr);         /* 반복 */
  grid-template-columns: 200px auto 1fr;         /* 혼합 */
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));  /* 반응형 */
  grid-template-rows: 60px 1fr 40px;
  gap: 16px;
  gap: 16px 24px;             /* row-gap column-gap */
}
 
.item {
  grid-column: 1 / 3;         /* 1열 ~ 3열 */
  grid-column: 1 / -1;        /* 전체 열 span */
  grid-row: 2 / 4;
  grid-area: header;          /* named area */
}
 
/* Named Area */
.container {
  grid-template-areas:
    "header header"
    "sidebar main"
    "footer footer";
}
.header  { grid-area: header; }
.sidebar { grid-area: sidebar; }

반응형 디자인

브레이크포인트 (Tailwind 기준)

이름 크기 대상
sm 640px 모바일 가로
md 768px 태블릿
lg 1024px 노트북
xl 1280px 데스크탑
2xl 1536px 와이드
/* Mobile First */
.container {
  padding: 16px;          /* 기본 (모바일) */
}
@media (min-width: 768px) {
  .container {
    padding: 24px;        /* 태블릿 이상 */
  }
}
@media (min-width: 1024px) {
  .container {
    max-width: 1200px;
    margin: 0 auto;       /* 데스크탑 이상 */
  }
}

스페이싱 시스템

4px 또는 8px 단위 기반 간격 체계.

4px   →  0.25rem  (xs)
8px   →  0.5rem   (sm)
12px  →  0.75rem
16px  →  1rem     (기본)
24px  →  1.5rem
32px  →  2rem
48px  →  3rem
64px  →  4rem     (xl)

레이아웃 패턴

Holy Grail

body {
  display: grid;
  grid-template-rows: auto 1fr auto;
  grid-template-areas:
    "header"
    "main"
    "footer";
  min-height: 100vh;
}
 
/* 사이드바 포함 */
.main {
  display: grid;
  grid-template-columns: 240px 1fr;
  grid-template-areas: "sidebar content";
}

Card Grid

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 24px;
}

Sticky Header + Scrollable Content

.app {
  display: flex;
  flex-direction: column;
  height: 100vh;
}
.header { flex: 0 0 auto; }
.content {
  flex: 1;
  overflow-y: auto;
}

z-index 관리

:root {
  --z-base:    0;
  --z-dropdown: 100;
  --z-sticky:   200;
  --z-overlay:  300;
  --z-modal:    400;
  --z-toast:    500;
  --z-tooltip:  600;
}

메모