flex-wrap은 flex 항목을 한 줄에 욱여넣을지 다음 줄로 넘길지 정하고, flex-direction은 항목이 행으로 흐를지 열로 흐를지 정해요. 두 속성, flex-flow 단축 속성, align-content, 미디어 쿼리 없는 반응형 카드 행을 실시간 예제로 알아봐요.
▶이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.
각 항목은 100px을 원하고, 340px 상자에 다섯 개가 있어요. 항목 다섯 개와 8px 간격 네 개에는 532px이 필요해서, 줄바꿈이 없으면 flex 항목이 기본적으로 줄어들기 때문에 각 항목이 약 62px로 짓눌려요. wrap을 주면 100px을 유지해요. 첫 줄에 세 개가 들어가고 나머지 두 개는 둘째 줄로 넘어가요.
flex-wrap 값
값
일어나는 일
nowrap (기본값)
한 줄. 항목이 줄어들고, 더 줄어들 수 없으면 컨테이너를 넘쳐요
wrap
들어가지 않는 항목이 아래에 새 줄을 시작해요
wrap-reverse
같지만 새 줄이 위로 쌓여요. 첫 줄이 맨 아래에 있어요
항목이 줄바꿈되는 모습 보기
슬라이더를 끌어서 컨테이너 너비를 바꿔 보세요. 표시 창이 줄 수와 줄마다 항목이 몇 개인지 알려 줘요.
두 row 상자에서는 align-items: stretch가 행을 가로질러 동작해서 항목이 상자 높이 전체로 늘어나요. column 상자에서는 같은 이유로 대신 너비 전체로 늘어나요. 축이 돌았고, 모든 정렬 속성도 함께 돌았어요(justify-content 페이지에서 자세히 보여 줘요).
flex-flow: 둘을 한 줄로
flex-flow는 flex-direction 다음에 flex-wrap을 쓰는 단축 속성이에요.
너비 약 800px인 미리보기에서는 첫 줄에 카드 세 개(각 약 253px)가 들어가고, 마지막 두 개는 둘째 줄을 나눠 쓰면서 각각 약 386px로 커져요. flexbox는 이렇게 동작해요. 줄마다 자기 공간을 나누기 때문에, 짧은 마지막 줄의 카드는 위의 카드보다 넓어져요. 마지막 카드도 다른 카드와 같은 너비를 유지하게 하려면 대신 repeat(auto-fill, minmax(180px, 1fr))를 쓴 grid를 쓰세요(grid 페이지를 보세요).
align-content: 줄 간격 정하기
컨테이너가 줄바꿈되고 줄들보다 높으면 align-content가 줄의 위치를 정해요. justify-content와 같은 값에 stretch를 더해 받아요.
첫 번째 상자에서는 두 줄 모두 위에 붙어 있어요. 두 번째 상자에서는 첫 줄이 위에, 둘째 줄이 아래에 있고 남는 높이가 모두 그 사이에 있어요.
뒤집힌 순서와 접근성
row-reverse, column-reverse, wrap-reverse는 항목이 그려지는 위치만 바꿔요. 스크린 리더와 Tab 키는 여전히 HTML 순서를 따라서, 키보드 사용자는 보이는 것과 반대 방향으로 항목을 이동하게 돼요. 뒤집기는 시각 효과로만 쓰고, 순서에 의미가 있다면 HTML에서 바꾸세요.
자주 하는 실수
줄바꿈되지 않고 줄어드는 항목.flex: 1 항목은 flex-basis 0에서 시작해서 한 줄에 욱여넣어져요. flex: 1 1 200px처럼 실제 basis를 주세요.
항목에 flex-wrap 주기. flex 컨테이너에 줘야 해요.
줄바꿈된 줄 간격에 align-items 쓰기. 그건 각 줄 안의 항목을 정렬해요. 줄 자체는 align-content로 움직여요.
행 전체로 늘어난 외로운 마지막 항목. 항목이 하나뿐인 줄에서 flex-grow가 동작한 거예요. 모든 카드가 같은 너비여야 한다면 grid를 쓰세요.
flex-direction: column이 높이를 채울 거라고 기대하기. 열 컨테이너는 height를 주지 않으면 콘텐츠만큼만 높아서 justify-content가 동작할 공간이 없어요.
자주 묻는 질문
flex-wrap: wrap은 무엇을 하나요?
flex 항목이 한 행에 들어가지 않을 때 새 줄로 넘어가게 해요. 기본값 nowrap에서는 항목이 한 줄에 머물면서 줄어들고, 더 줄어들 수 없으면 컨테이너를 넘쳐요.
flex-wrap이 동작하지 않는 이유는 무엇인가요?
줄바꿈은 항목들의 시작 크기 합이 컨테이너보다 클 때만 일어나요. flex: 1 항목은 flex-basis 0에서 시작해서 절대 줄바꿈되지 않으니, 실제 시작 크기(flex: 1 1 200px나 width: 200px)를 주세요. flex-wrap이 항목이 아니라 flex 컨테이너에 있는지도 확인하세요.
flex-direction row와 column은 무엇이 다른가요?
row(기본값)는 항목을 글쓰기 방향으로 나란히 놓고, column은 위에서 아래로 쌓아요. 주축도 함께 돌아서 열에서는 justify-content가 세로로, align-items가 가로로 동작해요.
flex-flow는 무엇인가요?
flex-direction과 flex-wrap을 선언 하나로 쓰는 단축 속성이에요. flex-flow: row wrap;은 flex-direction: row; flex-wrap: wrap;과 같아요.
align-items와 align-content는 무엇이 다른가요?
align-items는 줄 안에서 항목을 배치해요. align-content는 컨테이너 안에서 줄 자체를 배치해서, 컨테이너에 flex-wrap: wrap이 있고 줄들보다 높을 때만 의미가 있어요.