float
을 clear
하는 방법.CSS 속성 가운데 float 속성은 주변의 라인 박스를 플로팅 요소 주변에 흐르게 만듭니다. float
은 사전적 의미로 ‘뜨다, 띄우다, 뜨는 물건, 부유물’ 이라는 의미가 담겨져 있습니다. 플로팅 박스는 일반적인 흐름에서 벗어나는 특징이 있습니다. float
은 원래 속성의 의도와 다르게 컬럼 배치에 활용해 왔습니다. 배치 기법을 익힐 때 가장 이해하기 어려운 속성 중 하나 입니다. float
요소는 좌측이나 우측으로 배치되면서 주변 콘텐츠 흐름에 영향을 미친다는 사실은 어렵지 않게 학습할 수 있지만 ‘float
된 요소가 부모 요소의 높이에 영향을 주지 않는다는 사실’은 몇 번의 경험 또는 선배들의 조언으로 깨닫게 됩니다.
오늘은 float
속성을 이해하고 컬럼 배치를 시도할 때 주변 요소를 원하는 상태로 배치할 수 있도록 이것에 대응하거나 clear
하는 방법에 대하여 공유합니다. clear
속성은 float
이 더이상 주변 요소의 배치에 영향을 미치지 않도록 해제하는 속성입니다. 이 밖에도 다양한 방법이 있습니다.
float
에 아무런 대응도 하지 않은 상태#container
는 부모 엘리먼트이며 #lnb
와 #content
는 자식 엘리먼트로서 현재 float
된 상태 입니다. 아래 예제는 float
에 아무런 대응을 하지 않으면 자식 엘리먼트가 부모 엘리먼트의 높이에 영향을 주지 않는다는 사실을 보여주고 있습니다. #container
의 높이가 자식 엘리먼트의 높이를 반영하지 않고 있다는 사실에 주목해 주세요. float
에 아무런 대응도 하지 않은 상태의 예제.
float
에 float
으로 대응하는 방법자식 엘리먼트의 높이를 부모에게 반영하는 방법으로 부모에게도 float
속성을 부여하는 방법이 있습니다. 부모에게 float
속성을 부여하게 되면 부모엘리먼트는 자식 엘리먼트의 높이를 반영합니다. 하지만 부모 엘리먼트의 너비는 float
된 두 자식의 너비를 담을만큼만 작게 줄어든다는 사실에 주목해 주세요. 부모의 너비가 브라우저 크기에 따라 가변적이어야 하는 경우에 적용하기 어려운 단점이 있습니다. 또한 조상 엘리먼트들이 겹겹이 존재하는 경우 자식의 높이를 조상 엘리먼트에게 각각 전달하기 위하여 조상 엘리먼트들을 모두 float
시켜야 하므로 일반적으로 사용하는것을 권장하지 않습니다. float
에 float
으로 대응하는 방법 예제.
float
에 overflow
속성으로 대응하는 방법자식 엘리먼트의 높이를 부모에게 반영하는 방법으로 부모 엘리먼트에 overflow:auto
또는 overflow:hidden
속성을 부여하는 방법이 있습니다. overflow:auto
속성은 자식의 너비가 가변적이고 부모의 너비보다 커지는 상황이 발생할 때 가로 스크롤바를 유발하기 때문에 일반적으로 권장하는 방식이 아닙니다. overflow:hidden
속성은 그러한 상황에서 가로 스크롤바를 유발하지는 않지만 자식의 너비가 넘치는 경우 넘치는 부분이 잘리기 때문에 이 역시 완전하게 안전한 방법은 아닙니다. float
에 overflow
속성으로 대응하는 방법 예제.
float
을 빈 엘리먼트로 clear
하는 방법이 방법은 #container
영역이 끝나기 직전 빈 엘리먼트를 넣고 빈 엘리먼트에 clear:both
속성을 부여하여 부모가 자식의 높이를 인식하도록 하는 방법입니다. 하지만 의미 없는 빈 엘리먼트를 사용하기 때문에 이 역시 권장되는 방법은 아닙니다. float을 빈 엘리먼트로 clear 하는 방법
예제에서는 .clear
라는 빈 엘리먼트를 가시적으로 보이도록 하였지만 실무에서는 보통 .clear {clear:both; height:0; overflow:hidden;}
처리하여 .clear
라는 빈 엘리먼트가 스스로 높이를 갖지 않도록 하고 보이지 않도록 처리 합니다.
float
을 가상 선택자 :after
로 clear
하는 방법가장 탁월하다고 생각하는 방법 입니다. 우선 ‘가상 선택자‘라는 개념을 이해하셔야 하기 때문에 약간 상세히 설명드리겠습니다. 여러분들이 익히 알고 계시는 :link
, :visited
, :hover
, :active
, :focus
는 모두 가상 선택자 입니다. ‘가상 선택자’는 다시 ‘가상 클래스‘와 ‘가상 엘리먼트‘로 구분할 수 있는데요. ‘가상 클래스‘는 특정 엘리먼트에 대하여 아무런 class
를 부여하지 않았지만 마치 역동적으로 class
를 변경한것과 같은 효과를 낼 수 있는 것들로서 이미 존재하는 엘리먼트에 조합해서 사용할 수 있습니다. :link
, :visited
, :hover
, :active
, :focus
, :first-child
가 가상 클래스에 해당됩니다. 한편 ‘가상 엘리먼트‘란, 존재하지 않는 엘리먼트를 가상으로 생성해내는 선택자로서 :first-line
, :first-letter
, :before
, :after
가 있습니다. 심지어 :before
와 :after
는 HTML문서상에 존재하지 않는 콘텐츠를 출력시키기도 합니다. Hello World Collection이라는 웹 사이트에 신현석님이 Hello World
라는 메시지를 어떻게 출력했는지 살펴보시면 재미있고 이해하기도 쉽죠. 이렇게 가상의 엘리먼트를 생성 #container:after {content:""}
시킨 다음 display:block; clear:both
처리를 추가하게 되면 의미 없는 빈 엘리먼트를 사용하지 않으면서도 가상 엘리먼트를 이용하여 깔끔하게 float
이 clear
됩니다. float
을 가상 선택자 :after
로 clear
하는 방법 예제.
상기 예제로부터 가상 엘리먼트가 스스로 높이를 갖지 않고 화면에 보이지 않도록 처리 하려면 아래와 같이 처리 합니다.
#container:after {content:""; display:block; clear:both;}
하지만 Internet Explorer는 :before
, :after
가상 엘리먼트 선택자를 지원하지 않기 때문에 다음과 같은 Hack이 필요합니다.
#container {*zoom:1;} /* IE5.5~7 브라우저 대응 Hack */
#container:after {content:""; display:block; clear:both;} /* 표준계열 브라우저에 대응하는 float 해제용 가상 엘리먼트의 생성 */
IE 5~7 브라우저는 hasLayout
이라는 고유한 성질을 갖게 되면 float
을 해제하는 트리거로 작용하는 성질이 있고 zoom:1
속성이 hayLayout
이라는 성질을 갖도록 하기 때문에 IE 5~7 브라우저 고유의 특징을 이용한 해결방법 입니다.
float
을 display:inline-block 으로 clear 하는 방법float
된 자식요소들의 높이를 부모에게 전달하는 방법으로써 부모 요소에 display:inline-block 속성을 부여하는 방법도 있습니다. [코멘트 해주신 김영환님 감사합니다.] inline-block 속성이 부여된 요소는 float
된 자식의 높이만큼 늘어납니다. [CSS 2.1 관련 설명 코멘트 해주신 연홍석님 감사합니다.] 모든 브라우저가 동일하게 float
을 해제하는 방향으로 작용합니다. 단, 표준계열 브라우저들은 부모 요소의 너비가 자식의 너비만큼 알맞게 줄어들지만 IE 6~7 브라우저는 100%
의 너비를 갖게 되는 특징이 있습니다. 또한 inline-block
속성을 갖게 된 요소는 인라인 요소와 마찬가지로 박스가 끝나는 지점에 약 4px
정도의 공백을 갖게 되므로 이점 유념하시는게 좋겠습니다.