Develop(개발)/HTML\CSS\JS

[CSS] float 사용시 clear: both 를 왜 적어야할까?

seongmik 2023. 1. 6. 17:32
728x90
반응형
어.. 왜 html 요소들이 내 마음대로 안 배치되고 뭔가 이상한 것 같지..? ㅠㅠ

라고 느낀 당신. 혹시 float 속성을 잘못 사용하지는 않았는가?

 

html에서 block 요소들은 기본적으로 요소마다 한 줄씩 띄워진다. 

개발자가 원하는대로 화면을 제어하고, 구성하기 위해서 css에서는 float와 flex 속성을 지원한다.

 우리는 이 중 float 속성을 살펴보자.

 

CSS에서는 float 속성을 요소에 적용해서 block 요소들을 상하가 아닌 좌우로 배치되게 만들 수 있다.

다음과 같이 float 를 사용할 수 있다.

        <div class="floatEx">
            <section>
                <article></article>
                <article></article>
                <article></article>
            </section>
        </div>

다음은 section 부모 요소 안에 3개의 article 자식 요소를 넣는 html 코드이다.

이에 css를 다음과 같이 적용해보자.

.floatEx section {
    border: 5px solid #000;
    background: border-box;
    background-color: lightsalmon;
}

.floatEx section article {
    width: 100px;
    height: 100px;
    border: 1px solid #000;
    background-color: lightskyblue;
}

위의 코드를 적용시켰을 때 html에서 요소들의 모습

그럼 위와 같은 결과가 나온다.

article은 block 요소이므로 자동으로 한 줄씩 띄워서 배치되는 것을 확인할 수 있다.

이 때 float 속성을 사용하면 blcok 요소를 가로로 배치할 수 있다.

.floatEx section {
    border: 5px solid #000;
    background: border-box;
    background-color: lightsalmon;
}

.floatEx section article {
    width: 100px;
    height: 100px;
    border: 1px solid #000;
    background-color: lightskyblue;
    float: left;
}

위 처럼 float 속성을 CSS에 추가해주자 아래와 같은 결과가 나온다.

float 속성을 article 요소에 적용한 결과

 

왜 section이 자식 요소를 안 감싸지?

라고 생각한 당신! 바로 황급히 구글링을 해본 결과

.floatEx section::after {
    content: '';
    display: block;
    clear: both;
}

위와 같은 코드를 적용해줘야 한다는 답을 얻게된다.

그랬더니 마법같이 적용되는 border 라인

 

왜 그럴까?

float 속성을 이용해서 블록 요소를 강제로 띄워서 좌우로 배치하면, 부모 요소는 float 속성이 적용된 요소의 높잇값을 인식할 수 없다.

 

해결 방법

 가상 선택자(가상의 요소) after를 생성(실제로는 없는 박스 하나를 만들어서 마지막에 붙인다.)하고, content는 빈 문자를 삽입한 뒤, block 속성으로 강제 변환시킨다. 그 뒤 마지막으로 clear: both를 적용하면 부모 요소에 float의 영향을 해제해서 높잇값을 제대로 인식할 수 있다.

clear: both는 float한 박스들의 바로 아래 박스에게 주변을 흐르지 않고 원래대로 배치하도록 하는 역할을한다.(float를 해제함으로써) 이 속성을 적용할 요소는 block 이어야한다.

따라서 가상 선택자 after를 block 속성으로 강제 변환시킨 것이다.

따라서 float 속성을 사용했다면, 부모는 float 속성의 값을 따로 해제해주지 않는다면 자식 요소의 높잇값를 인식할 수 없으므로 가상의 보이지않는 block을 부모의 자식 요소들의 마지막에 만들어서 float의 영향을 해제해서 부모가 자식 요소의 높잇값을 인식할 수 있게 만들어준다.

 

다음부터는 float를 사용했다면 잊지말고 clear: both를 통해 부모 요소가 자식 요소의 높이를 알 수 있게 만들어주자!

 

 

결론 - float 쓰지말고 flex를 사용하자.

 

 

728x90
반응형