Grid와 Flex, 언제 어떤 걸 써야 할까? 실전 패턴별로 비교해보는 레이아웃 가이드
Header / Sidebar / Main / Footer 영역 분할
.page { display: grid; grid-template-areas: "header header" "sidebar main" "footer footer"; grid-template-columns: 240px 1fr; grid-template-rows: auto 1fr auto; }
Grid 승. 영역 이름으로 직관적 배치. Flex는 중첩 래퍼가 필요해 구조가 복잡해진다.
로고 + 메뉴 아이템 + 액션 버튼 수평 배치
.nav { display: flex; align-items: center; gap: 16px; } .nav-links { flex: 1; } /* 남은 공간 차지 */
Flex 승. 1차원 수평 배치의 교과서적 케이스. space-between이나 flex: 1로 자연스러운 공간 분배.
반응형 카드 그리드, 열 수 자동 조절
.gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 20px; } /* 미디어쿼리 없이 반응형 완성 */
Grid 승. auto-fill + minmax는 Grid에서만 가능한 킬러 패턴. Flex의 flex-wrap은 마지막 줄 정렬이 지저분해진다.
이미지 + 텍스트 + 버튼 수직 배치, 버튼은 항상 하단
.card { display: flex; flex-direction: column; gap: 12px; } .card-action { margin-top: auto; /* 항상 카드 하단에 고정 */ }
Flex 승. margin-top: auto로 버튼을 하단에 밀어내는 건 Flex 전용 트릭. 카드 높이가 달라도 버튼 위치가 정렬된다.
요소를 정중앙에 배치
/* Grid — 가장 짧은 센터링 */ .center-grid { display: grid; place-items: center; } /* Flex */ .center-flex { display: flex; justify-content: center; align-items: center; }
Grid이 살짝 우세. place-items: center 한 줄이면 끝. 다만 둘 다 잘 작동하므로 취향 차이.
고정 너비 사이드바 + 유동 메인 영역
.layout { display: grid; grid-template-columns: 240px 1fr; gap: 24px; } /* 반응형: 좁은 화면에서 1단 */ @media (max-width: 768px) { .layout { grid-template-columns: 1fr; } }
Grid 승. 열 크기를 명시적으로 선언. Flex에서도 가능하지만 flex-shrink: 0을 잊으면 사이드바가 찌그러진다.
라벨 + 인풋 2열 정렬, 복잡한 필드 배치
.form { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; } .full-width { grid-column: 1 / -1; /* 2열 모두 차지 */ }
Grid 승. grid-column: 1 / -1로 특정 필드만 전체 너비로 확장하는 게 핵심. Flex로는 이런 부분 확장이 어렵다.
실전에서 둘을 조합하는 패턴
/* 바깥 골격: Grid */ .dashboard { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; } .chart { grid-column: span 2; } /* 안쪽 메트릭 카드: Flex */ .metric-card { display: flex; flex-direction: column; gap: 4px; }
조합이 정답. Grid로 영역을 나누고, 각 카드 내부는 Flex로 정렬. 대시보드에서 이 패턴이 가장 자연스럽다.
grid-area)이 필요할 때space-between으로 간격 분배