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;
}