margin collapsing (마진 겹침)

YEJI·2022년 4월 6일
6

멋쟁이사자처럼📕

목록 보기
8/13

마진 겹침

1. 마진 겹침이란?

요소와 요소의 사이에 상하 margin의 공간이 있을 경우 더 높은 값이 적용되는 현상

2. 마진 겹침 현상의 조건

  • 인접 형제 요소간의 마진은 겹침
  • 부모 요소와 형제 요소가 block일 때 분리하는 콘텐츠가 없을 때
  • height , min-height, max-height, border, padding, inline 콘텐츠가 없을 때
  • 모두 block 이어야 함

인접 형제 요소간의 마진 겹침

<!DOCTYPE html>
<html lang="en">
<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>Document</title>
</head>
    <style>
        h1 {
            border:1px solid red;
            margin: 100px;
        }

    </style>
<body>
    <h1>Hellow world</h1>
    <h1>Hellow world</h1>
</body>
</html>

위와 같이 h1에 모두 공통적으로 margin을 줘서 예상대로라면 두 요소 사이에는 위의 h1margin-bottom과 아래의 h1margin-top이 있어야 하지만 두개가 겹쳐있는 모습이 보인다.
첫번째 h1margin-bottom을 늘리자 두 요소 사이 margin이 커진다.
반대로 100px보다 작아지니 두번째 h2 요소의 margin이 적용되는 것을 볼 수 있다.
(더 큰 margin값을 채택하는 것을 알 수 있음.)

3. 부모와 자식간의 마진 겹침 현상

<!DOCTYPE html>
<html lang="en">
<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>Document</title>
</head>
    <style>
        .parent{
            /* border: 1px solid coral; */
            margin-top: 100px;
        }
        .child{
            background-color: yellowgreen;
            margin-top: 50px;
        }
    </style>
<body>
    <div class="parent">
        <div class="child">
            마진 상쇄 정복해보자!
        </div>
    </div>
</body>
</html>

border를 주석처리하자 margin이 사라지는 것을 볼 수 있음.

  • childmargin-top을 값을 늘려주면 100px까지는 child 콘텐츠의 위치가 바뀌지 않지만 100px이 넘어가면 움직이기 시작함
  • 또한 50px 이하로 줄여도 child 컨텐츠의 위치는 변하지 않는다.

결론 : parent에 시각적인 요소가 없을 때 parent의 margin값과 child의 margin 값 중에 큰 쪽의 margin 값이 child의 margin값으로 사용됨

4. 빈 요소의 상하 마진 겹침

<!DOCTYPE html>
<html lang="en">
<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>Document</title>
</head>
  <style>
      .empty {
          margin-top: 50px;
          margin-bottom: 100px;
          /* border: 1px solid salmon; */
      }
      .normal{
          background-color: burlywood;
          margin-top: 100px;
      }
  </style>
<body>
  <div class="empty"></div>
  <div class="normal">채움</div>
</body>
</html>

아까와 마찬가지로 border 값 (시각적 요소)를 없애자 margin 겹침 현상이 일어나는 것을 볼 수 있음.


위 아래 각각 margin 값을 증가시키자 위 아래 margin 중 더 큰 margin을 채택한다는 사실을 알 수 있음

5. margin 겹침현상이 일어나지 않는 경우

  • float: right/left;
  • position: absolute;
  • display: flex;
    등...

6. margin 겹침 해결 방법

  • 부모 요소에 overflow: hidden; 속성 값을 적용
  • 부모 요소에 display: inline-block 값을 적용
  • 부모 요소에 border 값을 적용

참고👀
생활코딩 유튜브
MDN 문서
교안

profile
안녕하세요. FE 공부 중 입니다.💕 멋쟁이사자🦁처럼 프론트엔드스쿨 2기 ~

8개의 댓글

comment-user-thumbnail
2022년 4월 6일

오왕 움직이는 화면 짱 신기해요 ㅋㅋㅋ 정리 잘하셨네요!

답글 달기
comment-user-thumbnail
2022년 4월 6일

마진 잘 배우고 갑니다~~

답글 달기
comment-user-thumbnail
2022년 4월 6일

오!! 동적인 이미지!!! 이해가 쏙쏙 되네요!!!!👍👍
빠른 정리!!! 최고의 내용!!!💯💯
오늘도 덕분에 복습 잘 했습니다!!!!

답글 달기
comment-user-thumbnail
2022년 4월 6일

우와 이해가 쏙쏙 되네요! 예지님은 진짜 정리 천재인듯 ㅎㅎ

답글 달기
comment-user-thumbnail
2022년 4월 6일

정성이 엿보이는 글이네요 잘 보고 갑니다 ^^

답글 달기

너무 깔끔하게 잘 정리되어 있네요! :)

답글 달기
comment-user-thumbnail
2022년 4월 7일

정리 깔끔하게 잘하셨네용!!
저두 예지님처럼 깔끔하게 정리해봐야겠어융😆
오늘까지 열심히 달려봅시당 ㅎㅎㅎㅎ

답글 달기
comment-user-thumbnail
2022년 4월 9일

우왕 역시 정리 천재 인정합니다👍
예시 움직이는 것 덕분에 더 집중돼요.....😊

답글 달기