반응형

CSS Flexbox는 일차원(1D) 정렬,
CSS Grid는 이차원(2D) 배치를 담당합니다.
✅ Grid → 페이지 전체 레이아웃
✅ Flex → 내부 구성 & 정렬
이 두 가지를 적절히 섞으면
“반응형 + 정렬 + 가독성 + 유지보수성”을 모두 잡을 수 있습니다 💪
📐 1. Grid로 전체 구조, Flex로 내부 정렬
<div class="layout">
<header class="header">
<div class="header-inner">
<h1>Logo</h1>
<nav>Menu</nav>
</div>
</header>
<main>Main Content</main>
<footer>Footer</footer>
</div>
.layout {
display: grid;
grid-template-rows: auto 1fr auto;
height: 100vh;
}
.header-inner {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px;
}
📌 Grid → 페이지 구조
📌 Flex → 헤더 내부 아이템 정렬
📊 2. 사이드바 + 메인 영역 패턴
<div class="wrapper">
<aside>Sidebar</aside>
<section class="content">
<div class="card-list">
<div>Card 1</div>
<div>Card 2</div>
<div>Card 3</div>
</div>
</section>
</div>
.wrapper {
display: grid;
grid-template-columns: 250px 1fr;
height: 100vh;
}
.card-list {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.card-list > div {
flex: 1 1 calc(33.333% - 20px);
background: #f4f4f4;
padding: 20px;
}
📌 Grid → 큰 틀(aside + section)
📌 Flex → 카드 내부의 유연한 배치
🧩 3. 반응형 카드 레이아웃 (Flex → Grid 전환)
.cards {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.cards > div {
flex: 1 1 100%;
}
@media (min-width: 768px) {
.cards {
display: grid;
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 1200px) {
.cards {
grid-template-columns: repeat(3, 1fr);
}
}
📌 작은 화면에서는 Flex로 유연하게 쌓기,
📌 큰 화면에서는 Grid로 정렬 정확도 높이기
→ 반응형 + 정렬 최적화의 베스트 조합 👏
🪄 4. Grid + Flex 카드 내부 정렬
<div class="product-card">
<img src="item.jpg" alt="상품" />
<div class="info">
<h3>상품명</h3>
<p>상품 설명</p>
<div class="price-area">
<span>₩29,000</span>
<button>구매하기</button>
</div>
</div>
</div>
.product-card {
display: grid;
grid-template-rows: auto 1fr;
border: 1px solid #ddd;
border-radius: 10px;
overflow: hidden;
}
.price-area {
display: flex;
justify-content: space-between;
align-items: center;
}
📌 Grid → 상하 구조 구분 (이미지/내용)
📌 Flex → 가격과 버튼 간격 정렬
⚙️ 5. 네비게이션 바 (Flex) + 콘텐츠 영역 (Grid)
<div class="dashboard">
<nav class="nav">
<ul>
<li>홈</li>
<li>통계</li>
<li>설정</li>
</ul>
</nav>
<main class="grid-content">
<section>위젯 1</section>
<section>위젯 2</section>
<section>위젯 3</section>
</main>
</div>
.dashboard {
display: grid;
grid-template-columns: 200px 1fr;
height: 100vh;
}
.nav ul {
display: flex;
flex-direction: column;
gap: 15px;
}
.grid-content {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
padding: 20px;
}
📌 Sidebar는 Flex로 세로 메뉴,
📌 Main은 Grid로 위젯형 카드 정렬
💡 실무 적용 포인트
| 역할 | 추천 방식 | 이유 |
| 전체 구조 | Grid | 레이아웃 명확성, 영역 지정 용이 |
| 내부 정렬 | Flex | 수평/수직 중앙 정렬 간편 |
| 카드 레이아웃 | Flex → Grid 혼합 | 반응형 + 가독성 |
| 버튼 / 가격 / 탭 | Flex | 공간 균형, 정렬 최적 |
| 대시보드 | Grid + Flex | 그리드 틀 + 유연한 위젯 구성 |
⚡ 실무 꿀팁
✅ Flex 안에 Grid, Grid 안에 Flex → 자유롭게 중첩 가능
✅ minmax() + flex-wrap 조합으로 반응형 자동화
✅ align-items: stretch 활용 → 카드 동일 높이
✅ **CSS 변수(var)**로 Grid gap, column 수를 유동 관리
📝 마무리 정리
- Grid는 “뼈대”, Flex는 “근육”
- 구조를 Grid로 잡고, 정렬을 Flex로 보정
- 반응형 환경에서는 둘의 혼합이 필수
💡 요약 공식
🧩 큰 틀 = Grid
🎯 내부 정렬 = Flex
⚙️ 반응형 = minmax() + wrap
반응형
'HTML, CSS' 카테고리의 다른 글
| 웹 접근성 ✅ 키보드 네비게이션 (Tab, Focus, Role, ARIA) (0) | 2025.12.01 |
|---|---|
| 반응형 웹디자인 ✅ 모바일 퍼스트 전략과 실무 설계법 (0) | 2025.11.25 |
| CSS Grid ✅ 실무에서 바로 쓰는 5가지 레이아웃 패턴 (0) | 2025.11.22 |
| CSS 컨테이너 쿼리 ✅ 컴포넌트 단위 반응형 디자인 구현법 (0) | 2025.11.04 |
| CSS 최신 선택자 ✅ :has() 활용법과 실무 예제 (0) | 2025.11.03 |