"열 패턴이 layout 작업의 90% 커버. 외우고 재발명 그만."
1. Sticky Footer
페이지에 header, main content, footer 가짐. Content 짧으면 footer 가 viewport 바닥에, content 길면 content 아래.
body { display: flex; flex-direction: column; min-height: 100vh; } + main { flex: 1; }. 세 줄.
2. 가운데 정렬 Modal (또는 Hero)
컨테이너 안에서 수직, 수평 둘 다 가운데 정렬된 박스.
.container { display: flex; align-items: center; justify-content: center; min-height: 100vh; }. 또는 Grid place-items: center.
3. 로고 + 메뉴 + Action 가진 Navbar
왼쪽 로고, navigation 메뉴, 오른쪽 사용자 action.
두 접근:
- 로고, 메뉴, action 을 세 직접 자식으로 가지는
justify-content: space-between. - Sibling 들을 떨어뜨려야 할 어떤 중간 그룹의
margin-left: auto(자식 5+ 일 때 더 유연).
4. 동등 너비 버튼 행
Label 길이 무관 행을 동등하게 공유하는 버튼 둘 또는 셋.
.btn-row { display: flex; gap: 0.5rem; } + .btn-row > button { flex: 1; }.
5. Truncating 채팅 row
아바타, 이름 + 메시지, timestamp — 단일 row 에, row 가 좁을 때 메시지가 우아하게 truncate.
6. 바닥에 Pinned 된 Footer 가진 카드
Title, body, 바닥의 CTA 가진 카드. Body 짧을 때도 CTA 가 바닥에 앉아야 함.
카드를 고정 높이 flex column 으로, body 에 자연 크기, CTA 에 margin-top: auto.
7. 다양한 너비 input 가진 폼 행
이름 + 성 + 이메일 행 — 이름과 성이 동등 공유, 이메일은 두 배 공간.
8. Aside + Main Layout
고정 너비 사이드바 + 유연 main. Lesson 3 에서 봤어. 사이드바의 flex: 0 0 240px, main 의 flex: 1; min-width: 0 가진 display: flex.
9. Tag/Chip Wrap
Fit 안 될 때 여러 줄로 wrap 하는 태그 행.
.tags { display: flex; flex-wrap: wrap; gap: 0.5rem; }. 각 태그 auto 크기; 행이 자연스럽게 wrap.
10. 모바일에서 재정렬
좁은 화면에서 (텍스트 먼저, 이미지 아래) 로 전환되는 두 column layout (이미지 왼쪽, 텍스트 오른쪽).
Media query 에서 order 사용 — 하지만 가능하면 grid template areas 로 재구성 선호.
마주칠 anti-pattern
- Layout 달성에 flex 컨테이너 4 레벨 깊이 중첩 — 거의 항상 Grid 가 맞는 답이었음을 뜻함.
- Sticky footer 에
position: absolute사용 — 작동하지만 content 가 스크롤 필요할 만큼 길면 깨짐. Flexbox 가 맞는 도구. - Flex 자식에
vertical-align: middle사용 — 아무것도 안 함. 부모에align-items써. flex가 할 일에 자식 너비 설정 —flex: 1이width: 33.333%보다 유연.- Spacing 위해 마지막 빼고 모든 자식에
margin-right추가 —gap써.