노트

Flexbox

CSS Flexible Box Layout

프런트엔드#css · 연결된 개념 8개

쉽게 말하면

Flexbox는 선반 한 줄에 물건을 늘어놓고 남는 자리를 정해진 비율대로 나눠 주는 레이아웃이에요. 가로든 세로든 한 방향으로 줄 세우고, 누가 얼마나 늘고 줄지를 아이템마다 정해요.

비유가 깨지는 곳 선반과 달리 아이템의 최소 너비가 기본으로 콘텐츠 크기라서 말줄임이 안 될 때가 있어요. 그땐 min-width: 0을 줘요. 또 flex: 1은 콘텐츠를 무시하고, flex: auto는 콘텐츠 크기에서 출발해 나눠요.

한 방향(행 또는 열)으로 아이템을 배치하고 남는 공간을 나눠 주는 1차원 레이아웃 방식. 부모에 display: flex를 주면 부모는 flex 컨테이너(Flex Container), 자식은 flex 아이템(Flex Item)이 된다. 아이템이 늘어서는 방향이 주축(Main Axis), 그에 수직인 방향이 교차축(Cross Axis)이다.

  • 컨테이너 속성: flex-direction(주축 방향, 기본 row), flex-wrap, justify-content(주축 정렬), align-items(교차축 정렬), align-content(여러 줄의 정렬), gap
  • 아이템 속성: flex-grow, flex-shrink, flex-basis, order, align-self
  • flex-direction: column으로 바꾸면 주축이 세로가 되고, justify-content와 align-items가 맡는 방향도 서로 바뀐다

flex 단축 속성

값뜻쓰임
기본값0 1 auto늘지 않고, 공간이 모자라면 줄어든다
flex: 11 1 0콘텐츠와 무관하게 남은 공간을 똑같이 나눈다
flex: auto1 1 auto콘텐츠 크기에서 출발해 늘고 준다
flex: none0 0 auto크기 고정

flex-basis: 0이면 콘텐츠 크기를 무시하고 공간 전체를 flex-grow 비율대로 나누고, auto면 콘텐츠 크기를 뺀 남는 공간만 나눈다.

자주 쓰는 패턴

  • margin auto 밀어내기: 아이템에 margin-left: auto를 주면 남은 공간을 왼쪽 여백이 다 가져가서 오른쪽으로 붙는다. 내비게이션에서 메뉴 하나만 오른쪽에 붙일 때 쓴다. margin: auto면 가운데 → CSS 가운데 정렬
  • 바닥에 붙는 푸터: 세로 flex 컨테이너에서 푸터에 margin-top: auto
  • 스크롤 없는 100% 레이아웃: flex-direction: column; height: 100% 컨테이너 안에서 본문에 flex: 1; overflow: auto
  • 말줄임 + 아이콘: 텍스트 아이템에 overflow: hidden; text-overflow: ellipsis; white-space: nowrap. 줄어들지 않으면 아이템에 min-width: 0을 준다(flex 아이템의 최소 너비 기본값이 콘텐츠 크기라서)

2차원 배치가 필요하면 CSS Grid가 낫다. 둘의 차이는 Flexbox와 Grid 비교 참고.

출처: NAVER D2 — Flexbox로 만들 수 있는 10가지 레이아웃

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • inset 속성

    top·right·bottom·left를 한 번에 지정하는 단축 속성. inset: 0은 네 방향을 모두 0으로 둔다. Tailwind의 inset-0·inset-auto 클래스가 이 속성이다.

  • 비율을 유지하는 박스

    너비가 바뀌어도 가로세로 비율(예: 16:9)을 지키는 상자. 지금은 aspect-ratio 속성 한 줄이면 되고, 그 전에는 퍼센트 padding을 이용한 트릭을 썼다. 임베드 동영상(iframe)을 반응형으로 만들 때 주로 쓴다.

  • Tailwind CSS

    flex, px-4, text-sm처럼 속성 하나를 담은 유틸리티 클래스(Utility Class)를 마크업에 조합해 스타일을 입히는 CSS 프레임워크. 빌드할 때 소스를 훑어 실제로 쓰인 클래스의 CSS만 만들어 내는 빌드 도구이고, 런타임에 돌아가는 JS(JavaScript)는 없다.

  • 레이아웃 스래싱

    DOM을 바꾸고 곧바로 레이아웃 값을 읽기를 반복해서, 브라우저가 매번 리플로우를 강제로 실행하게 되는 현상. 쓰기 → 읽기 → 쓰기 → 읽기가 반복문 안에서 일어나면 요소 수만큼 레이아웃을 계산한다.

  • 쌓임 순서와 z-index

    요소가 겹칠 때 무엇이 위에 보일지 정하는 규칙. z-index가 없을 때도 정해진 기본 순서가 있고, z-index는 같은 쌓임 맥락(Stacking Context) 안에서만 비교된다.

보기 옵션