Menu

CSS float와 clear: 이미지 둘레로 텍스트 감싸기

float는 요소를 한쪽으로 밀고, 잡지가 사진을 배치하듯 텍스트가 그 둘레를 감싸게 해요. float left, right, inline-start, clear, float 둘레에서 부모가 무너지는 이유와 display: flow-root로 고치는 법, float를 더 이상 페이지 레이아웃에 쓰지 않는 이유를 알아봐요.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

float가 하는 일

float는 요소를 컨테이너의 한쪽으로 밀고, 뒤에 오는 텍스트가 그 둘레를 감싸게 해요.

float된 상자의 margin이 텍스트가 상자에 닿지 않게 해 줘요. 그 간격은 margin으로 조절해요. 텍스트 자체에는 float 쪽으로 margin을 줄 수 없어요.

값

값결과
none (기본값)float 없음
left왼쪽 가장자리로 밀려요
right오른쪽 가장자리로 밀려요
inline-start줄의 시작 쪽으로 밀려요. 영어에서는 왼쪽, 아랍어나 히브리어에서는 오른쪽
inline-end줄의 끝 쪽으로 밀려요

inline-start와 inline-end는 글쓰기 방향을 따르기 때문에, 이걸로 만든 레이아웃은 오른쪽에서 왼쪽으로 쓰는 페이지에서 올바르게 뒤집혀요. float된 요소는 block이 되기도 해요. display: inline이 block으로 바뀌어서 span이나 img에서도 width와 height가 적용돼요.

텍스트 안의 이미지 float

고전적인 용도예요. 글 안에 이미지를 두고 텍스트가 그 둘레로 흐르게 해요. 양쪽에 하나씩 float해 볼게요.

clear: 감싸기 멈추기

clear는 "이쪽의 앞선 float 아래에서 시작해"라는 뜻이에요. 다음 섹션의 제목처럼 float 옆에 놓이면 안 되는 요소에 쓰세요.

첫 번째 제목은 float 옆으로 비집고 들어가요. 두 번째 제목은 그 아래에서 시작해요. clear는 left, right, both, inline-start, inline-end, none을 받아요.

무너지는 부모와 flow-root

float는 일반 흐름 밖에 있어서, 자식이 모두 float된 컨테이너는 흐름 안에 아무것도 없어서 높이 0으로 무너져요. 배경과 테두리가 float 위의 얇은 선으로 남아요.

display: flow-root는 새 블록 서식 맥락을 만들고, 이 맥락은 항상 float를 감싸요. 옛 코드는 같은 결과를 위해 "clearfix"를 써요.

.clearfix::after {
  content: "";
  display: block;
  clear: both;
}

overflow: hidden이나 auto도 float를 품지만, 잘라 내는 부작용이 있어요. overflow를 보세요.

float는 레이아웃용이 아니에요

flexbox와 grid가 생기기 전에는 페이지 레이아웃 전체를 float된 열로 만들었고, 곳곳에 clearfix와 너비 계산이 있었어요. 그 시절은 끝났어요. float는 가운데 정렬도, 열 높이 맞추기도 못 하고, 콘텐츠 크기가 바뀌면 깨져요. 행과 열에는 display: flex나 display: grid를 쓰고, float는 무언가의 둘레로 텍스트를 감쌀 때만 쓰세요. 텍스트를 감싸는 대신 이미지를 가운데 정렬하려면 이미지 가운데 정렬을 보세요.

모양을 따라 감싸기

shape-outside는 텍스트가 float의 직사각형 대신 모양을 따라가게 해요. float된 요소에서만 동작해요.

.avatar {
  float: left;
  width: 120px; height: 120px;
  border-radius: 50%;
  shape-outside: circle(50%);
  margin-inline-end: 16px;
}

자주 하는 실수

  • 높이가 0인 부모. 자식이 모두 float된 경우예요. display: flow-root를 추가하세요.
  • 열이나 내비게이션에 float 쓰기. flexbox나 grid를 쓰세요.
  • float: center를 기대하기. 없는 값이에요. flexbox, grid, margin: 0 auto로 가운데 정렬하세요.
  • float 뒤의 콘텐츠가 감싸지 않아야 하는데 감싸는 경우. clear: both를 주거나, float와 텍스트를 flow-root 컨테이너에 넣으세요.
  • 다국어 사이트에서 물리적인 left와 right 쓰기. inline-start와 inline-end를 쓰면 오른쪽에서 왼쪽으로 쓰는 언어에서 레이아웃이 뒤집혀요.

자주 묻는 질문

CSS에서 float는 무엇을 하나요?

요소를 일반 흐름에서 빼내고 컨테이너의 왼쪽이나 오른쪽 가장자리로 밀어요. 뒤에 오는 텍스트와 인라인 콘텐츠가 그 둘레를 감싸요.

clear는 무엇을 하나요?

clear는 요소를 지정한 쪽의 앞선 float 아래로 옮겨요. clear: left, clear: right, clear: both예요. 콘텐츠가 float 옆으로 감싸지 않게 막는 방법이에요.

float된 요소의 부모 높이가 0인 이유는 무엇인가요?

float는 일반 흐름 밖에 있어서, float된 자식만 있는 부모는 흐름 안의 콘텐츠가 없어서 무너져요. 부모에 display: flow-root를 추가하면 float를 품도록 커져요.

clearfix란 무엇인가요?

부모가 float를 품게 만드는 트릭으로, 전통적으로 clear: both를 가진 ::after 가상 요소를 써요. 지금은 부모에 display: flow-root 한 줄이면 같은 일을 해요.

레이아웃에 float를 써야 하나요?

아니요. float는 flexbox와 grid가 생기기 전에 열을 만드는 데 쓰였어요. 레이아웃에는 flexbox나 grid를 쓰고, float는 이미지나 인용구 둘레로 텍스트를 감싸는 원래 용도로 남겨 두세요.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기