Computer >> 컴퓨터 >  >> 프로그래밍 >> CSS

CSS float로 인한 부모 컨테이너 높이 무너짐(Collapse) 해결 방법 4가지

CSS의 float 속성을 사용할 때 개발자들이 자주 마주치는 대표적인 문제 중 하나는, 자식 요소들이 모두 float 처리되면 부모 컨테이너의 높이가 무너져버린다(collapse)는 점입니다. 이는 float된 요소가 일반 문서 흐름에서 벗어나기 때문에 발생하며, 부모 입장에서는 내용물의 높이를 인식하지 못하게 됩니다.

이번 글에서는 부모 컨테이너가 무너지는 현상을 살펴보고, 이를 해결할 수 있는 4가지 방법을 예제와 함께 정리해 보겠습니다.

문제 상황

아래 예제처럼 콘텐츠가 모두 float되어 있으면 부모 컨테이너가 무너집니다. 결과적으로 CSS의 background-color 속성 때문에 컨테이너의 padding 영역만 얇게 보이고, 배경색이 자식 콘텐츠를 감싸지 못하는 현상이 나타납니다.

문제가 되는 코드

<!DOCTYPE html>
<html>
<head>
<title>Avoid Parent Container Collapse</title>
<style>
body{
    background-color: grey;
    border: 4px solid black;
}
#navbar, #content{
    padding: 12px;
    color: white;
}
#navbar{
    background-color: #C303C3;
}
li {
    list-style: none;
    border: 2px solid black;
    width:4em;
    background-color: grey;
    text-align: center;
    float: left;
}
#content {
    background-color: #4CAF50;
}
#leftContent, #rightContent {
    border: 3px solid black;
    margin:2px;
}
#leftContent {
    width: 45%;
    float: left;
}
#rightContent {
    width: 45%;
    float: right;
}
</style>
<body>
<div id="navbar">
<ul>
<li>Link 1</li>
<li>Link 2</li>
<li>Link 3</li>
<li>Link 4</li>
</ul>
</div>
<div id="content">
<div id="leftContent">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat.
</div>
<div id="rightContent">
Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>
</div>
</body>
</html>

출력 결과

위 코드를 실행하면 초록색(#4CAF50) 배경을 가진 #content 영역이 좌우 콘텐츠를 감싸지 못하고 얇은 줄처럼 무너져 있는 것을 확인할 수 있습니다.

해결 방법 1: 부모 컨테이너에도 float 적용하기

float된 자식 요소들의 부모 컨테이너에도 float: left;를 적용하는 방법입니다.

이 방법은 문제를 어느 정도 해결해 주지만 완벽하지 않습니다. float된 콘텐츠의 부모는 자식 요소들을 감싸게 되지만, 그 부모의 부모(조상 요소)가 다시 무너지는 새로운 문제가 발생합니다.

해결 방법 2: overflow 속성 활용하기

float된 요소들의 부모 컨테이너에 CSS overflow 속성(예: overflow: hidden;)을 적용하는 방법입니다.

이 방법은 실제로 잘 동작하지만, 시각적으로는 정상이어도 논리적인 근거가 명확하지 않아 실무에서는 권장되지 않는 편입니다.

해결 방법 3: 빈 div와 clearfix 클래스 사용하기

부모 컨테이너 내부 맨 아래에 비어 있는 <div>를 하나 추가하고, 여기에 다음과 같은 스타일을 가진 'clearfix' 클래스를 지정하는 방법입니다.

.clearfix {
    clear: both;
}

이 방법으로도 문제는 해결되지만, 부모 컨테이너 안쪽 하단에 아무 의미 없는 빈 div 요소가 남게 된다는 단점이 있습니다. 구조적으로 깔끔하지 않아 유지보수 관점에서 좋지 않습니다.

해결 방법 4: ::after 가상 요소 활용하기 (권장)

부모 컨테이너에 클래스를 추가하고, ::after 가상 요소(pseudo element)를 이용해 실제 DOM에는 존재하지 않는 정리(clear) 요소를 만드는 방법입니다. HTML을 수정할 필요가 없어 가장 널리 사용되는 표준적인 기법입니다.

.clearfix::after {
    content: '';
    display: table;
    clear: both;
}

이 방식은 추가 마크업 없이도 부모 컨테이너가 float된 자식 요소들을 온전히 감싸도록 만들어 주며, 위의 세 가지 방법이 가진 단점을 모두 보완합니다.

정리

float로 인한 부모 컨테이너 무너짐 현상은 다음 네 가지 방법으로 해결할 수 있습니다.

  • 방법 1: 부모에도 float 적용 → 조상 요소가 다시 무너지는 한계
  • 방법 2: overflow 속성 사용 → 동작은 하지만 논리적 근거가 약함
  • 방법 3: 빈 div + clear: both; → 불필요한 빈 요소가 남음
  • 방법 4: ::after 가상 요소 활용 → 가장 깔끔하고 권장되는 방식

실무에서는 별도의 마크업 변경 없이 적용할 수 있는 4번(::after 가상 요소) 방식을 clearfix 표준 패턴으로 사용하는 것이 가장 좋습니다. 참고로 최신 레이아웃 작업에서는 Flexbox나 Grid를 사용하면 float로 인한 무너짐 문제 자체를 원천적으로 피할 수 있다는 점도 함께 기억해 두면 좋습니다.