프로그래밍/HTML, CSS, JavaScript

[CSS] margin 병합 현상과 해결법

싯타마 2022. 4. 6. 18:20

1. margin 병합 현상(margin collapsing)이란?

 

 

See the Pen margin by Hun-Se (@hun-se) on CodePen.

 다음 보기와 같이 겹치는 2개의 section값에 margin을 주었을 때 섹션 1의 하단에 20px, 섹션 2의 상단에 20px이 적용돼서 40px의 여백이 생기는 게 이론 상으로 맞다.

하지만 위 예시에서는 20px로 적용이 되었다. 이는 css에서 이를 병합해줘 보기가 좋게 만들어 줌으로써 사용자가 따로 css조작을 할 필요없게 만들어 준 것이다. (참고로 곂치는 block요소에서 더 큰 margin 값이 적용된다.)

 

- margin병합 현상의 조건

 

1) 인접해 있는 block요소 끼리만 일어난다.

2) 상하단에서만 마진 병합이 이루어진다. 

 

문제점 예시)

 

See the Pen Untitled by Hun-Se (@hun-se) on CodePen.

 

위의 예시는 부모요소의 margin값의 0이 상하단으로 적용돼서 원하던 모양이 나오지 않는 현상이 발생한다.

 

- 문제 해결 방법

 

1) 겹치는 마진 사이에 공간을 차지하는 요소들을 삽입 해준다. 

- table태그를 넣어준다.

- border값을 적용해준다.

- padding을 넣어준다.

- 글자를 삽입한다.

 

2) display: inline-block;을 적용해 준다.

- 마진 병합현상은 block 요소에만 적용되기 때문이다.

 

3) 부모 요소에 overflow: hidden;을 적용해준다.

- overflow:hidden을 사용하면 새롭게 block format context가 만들어지면서 병합되었던 마진 값을 출력해 준다. overflow를 사용한 요소는 내부에 마진을 포함하는 새로운 독립적인 요소가 되기 때문에 마진 병합을 해결할 수 있다.

 

코드 예시)

<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>test</title>
    <style>
        .parent {
            width: 100px;
            margin: 10px;
            background-color: pink;
        }

        .child {
            width: 50px;
            height: 60px;
            background-color: green;
            color: white;
            font-size: 30px;
            text-align: center;
            margin: 20px
        }
        .padding_box {
            padding: 1px;
        }
        .inline_block_box {
            display: inline-block;
        }
        .overflow_box {
            overflow: hidden;
        }

    </style>
</head>

<body>
    <div class="parent padding_box">
        <div class="child">1</div>
        <div class="child">2</div>
    </div>
    <div class="parent inline_block_box">
        <div class="child">3</div>
        <div class="child">4</div>
    </div>
    <div class="parent overflow_box">
        <div class="child">5</div>
        <div class="child">6</div>
    </div>
</body>
</html>