여백 축소를 비활성화하는 방법은 무엇입니까?


202

마진 축소를 비활성화하는 방법이 있습니까? 내가 찾은 유일한 해결책 ( "unollapsing"이라는 이름으로)은 1px 테두리 또는 1px 패딩을 사용합니다. 나는 이것을 용납 할 수 없다는 것을 알았습니다. 외부 픽셀은 아무 이유없이 계산을 복잡하게 만듭니다. 이 마진 축소를 비활성화하는보다 합리적인 방법이 있습니까?


4
마진 축소가없는 Flex 또는 Grid 레이아웃을 사용하십시오. stackoverflow.com/a/46496701/3597276
— Michael Benjamin

요소에 값을 제공 margin-bottom하지만 margin-top0은 그대로 두십시오.
— Dan Bray

계산을 쉽게하기 위해 패키지를 만들었습니다. npmjs.com/package/collapsed-margin
— Owen M

답변:


254

여백 축소에는 두 가지 주요 유형이 있습니다.

  • 인접한 요소 사이의 축소 여백
  • 부모 요소와 자식 요소 사이의 축소 여백

안쪽 여백 또는 테두리를 사용하면 후자의 경우에만 축소되지 않습니다. 또한 부모에 적용된 overflow기본값 ( visible) 과 다른 값은 축소를 방지합니다. 따라서, 모두 overflow: auto와 overflow: hidden동일한 효과를 얻을 수 있습니다. hidden부모가 고정 된 높이를 가진 경우 내용을 숨기면 의도하지 않은 결과가 사용될 때 유일한 차이점 일 수 있습니다.

일단 부모에게 적용되면이 문제를 해결하는 데 도움이되는 다른 속성은 다음과 같습니다.

  • float: left / right
  • position: absolute
  • display: inline-block / flex

http://jsfiddle.net/XB9wX/1/ 에서 모든 것을 테스트 할 수 있습니다 .

평소처럼 Internet Explorer는 예외입니다. 보다 구체적으로, IE 7에서와 같이 부모 요소에 대해 어떤 종류의 레이아웃이 지정되면 여백이 축소되지 않습니다 width.

출처 : Sitepoint의 기사 무너지는 여백


1
제로 값이 아니라면 패딩이 영향을 미칠 수 있습니다
— 믈라덴 Janjetovic

3
참고 overflow: auto스크롤바가 아니라 당 오버 플로우 컨텐츠 오버 플로우를시키는 것보다, 부모 요소에 표시 될 수 있습니다 overflow: visible.
— 레오

Chrome v44에서는 '오버플로 : 자동'이 작동하지 않는 것 같습니다.
— tkane2000

3
표시 주셔서 감사합니다 : 인라인 블록, 그것은 나를 구했습니다 :)
— alexcasalboni

3
flex기본값 과 다른 값은 여백 축소를 비활성화합니다
— Oly

60

이를 위해 좋은 오래된 마이크로 클리어 픽스를 사용할 수도 있습니다.

#container:before, #container:after{
    content: ' ';
    display: table;
}

업데이트 된 바이올린 참조 : http://jsfiddle.net/XB9wX/97/


내 답변을 커뮤니티 위키로 바 꾸었습니다. 답과 함께 자유롭게 연장하십시오. 감사.
— hqcasanova

3
나는 그 예를 볼 때 여백이 무너지고 있습니다 (20px 대신 div 사이의 10px 세로 공간 만)
— Andy

1
이 클리어 픽스가 모두 적용된 형제 사이의 축소를 제거하는 데 도움이됩니다. 나는 이것을 보여주기 위해 예제를 포크했다 : jsfiddle.net/dpyuyg07 --- 그리고 그것은 전체 이야기가 아니다. 해당 수정 사항을 적용한 요소의 하위 요소에서 발생하는 여백의 축소 만 제거합니다. :이 포크에서 볼 수있는 여백이 여전히 붕괴 할 용기 자체에 여백을 추가 할 경우 jsfiddle.net/oew7qsjx
— NicBright

4
이것을 더 정확하게 넣을 수 있습니다. clearfix 방법은 부모와 자식 사이의 마진 붕괴 만 방지합니다. 인접한 형제 사이의 붕괴에는 영향을 미치지 않습니다.
— NicBright

나는 지금으로 DOM을 채우기 위해 부트 스트랩의 경향을 이해 생각 :before과 :after요소. 이제이 규칙을 스타일 시트에 추가했습니다 div:before, div:after{content: ' '; display: table;}. 환상적인. 갑자기 물건이 예상대로 작동하기 시작합니다.
— Stijn de Witt

59

내가 아는 한 시각적 영향을 미치지 않는 마진 축소를 비활성화하는 한 가지 간결한 트릭은 부모의 패딩을 다음과 같이 설정하는 것입니다 0.05px.

.parentClass {
    padding: 0.05px;
}

패딩이 더 이상 0이 아니므로 더 이상 축소가 발생하지 않지만 동시에 패딩이 작아서 시각적으로 0으로 반올림됩니다.

다른 패딩이 필요한 경우 예를 들어 여백 축소가 필요하지 않은 "방향"에만 패딩을 적용하십시오 padding-top: 0.05px;.

작업 예 :

.noCollapse {
  padding: 0.05px;
}

.parent {
  background-color: red;
  width: 150px;
}

.children {
  margin-top: 50px;

  background-color: lime;      
  width: 100px;
  height: 100px;
}
<h3>Border collapsing</h3>
<div class="parent">
  <div class="children">
  </div>
</div>

<h3>No border collapsing</h3>
<div class="parent noCollapse">
  <div class="children">
  </div>
</div>

편집 : 값을에서 (으) 0.1로 변경 했습니다 0.05. Chris Morgan 이 아래 주석에서 언급 했듯이이 작은 테스트 에서 Firefox는 실제로 0.1px패딩을 고려 하는 것으로 보입니다 . 그러나 0.05px트릭을 수행하는 것 같습니다.


2
이것이 내가 가장 좋아하는 솔루션입니다. 이것을 기본 스타일로 포함시킬 수도 있습니다. 왜 안돼? *{padding-top:0.1px}. 그래도 모든 브라우저에서 작동합니까?
— Nick Manning

지금까지 꽤 좋았지 만 대부분의 브라우저에서 철저하게 테스트했다고 주장하지는 않습니다.
— Nicu Surdu

2
아주 좋은 해결책은 대부분의 브라우저에서 예상대로 작동하는 것 같습니다. 공유해 주셔서 감사합니다!
— wiredolphin 2019

1
이것은 같은 사기 해결책 않기 때문에 높은 DPI 디스플레이와 서브 픽셀 계산에 다양한 상황에서 여분의 화소를 추가한다. (Firefox는 연령대에 따라 서브 픽셀 레이아웃을 해왔으며, 다른 브라우저가 비교적 최근에 적합하다고 생각합니다.)
— Chris Morgan

0.05px임의의 브라우저 속임수가 아닌 특정 선택처럼 보입니다 0.01px.
— Volker E.

22

overflow:hidden 접히는 여백을 방지하지만 부작용이 없습니다. 즉 오버플로를 숨 깁니다.

이것과 당신이 언급 한 것을 제외하고는 실제로 그것을 배우고 그들이 실제로 유용 할 때 (3 ~ 5 년마다) 오늘 배워야합니다.


내 답변을 커뮤니티 위키로 바 꾸었습니다. 두 번째 단락의 마지막 두 줄에서 언급 한 부작용을 다루었다고 생각합니다. 숨겨진 것을 사용할 때의 유일한 차이점은 부모가 고정 된 높이를 가진 경우 내용을 숨기면 의도하지 않은 결과 일 것입니다 . 그러나 추가 설명이 필요하다고 생각되면 자유롭게 기여하십시오. 감사.
— hqcasanova

7
overflow: auto숨겨진 오버플로를 방지하고 여전히 축소 마진을 방지하는 데 사용하는 것이 좋습니다.
— Gavin

@Gavin, overflow:auto;내 콘텐츠 영역에서 일부 페이지의 스크롤 막대를 얻었습니다.
— 리드

13

실제로, 완벽하게 작동하는 것이 있습니다.

디스플레이 : 플렉스; 플렉스 방향 : 열;

IE10 이상 만 지원하면서 살 수있는 한

.container {
  display: flex;
  flex-direction: column;
    background: #ddd;
    width: 15em;
}

.square {
    margin: 15px;
    height: 3em;
    background: yellow;
}
<div class="container">
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
</div>
<div class="container">
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
</div>


이것이 일반적인 솔루션으로 작동하려면에 추가를 추가해야 <div>합니다 .container. 그렇지 않으면 .container자식의 상자 모델을 제어합니다. 예를 들어 인라인 요소는 전각 블록 요소가됩니다. 마진이 있으면 마진 축소됩니다.
— zupa

9

모든 웹킷 기반 브라우저는 속성을 지원해야합니다 -webkit-margin-collapse . 상단 또는 하단 여백에 대해서만 설정하는 하위 속성도 있습니다. 값 축소 (기본값), 버리기 (인접 여백이있는 경우 여백을 0으로 설정) 및 분리 (여백 축소 방지)를 제공 할 수 있습니다.

이것이 2014 버전의 Chrome 및 Safari에서 작동하는지 테스트했습니다. 불행히도, 이것이 웹킷을 기반으로하지 않기 때문에 IE에서 지원되지 않을 것이라고 생각합니다.

자세한 설명은 Apple의 Safari CSS Reference 를 참조하십시오 .

Mozilla의 CSS 웹킷 확장 프로그램 페이지 를 확인하면 이러한 특성이 독점 특성으로 나열되며 사용하지 않는 것이 좋습니다. 빠른 시일 내에 표준 CSS에 들어 가지 않을 가능성이 높기 때문에 웹킷 기반 브라우저 만 지원할 수 있기 때문입니다.


Safari와 Chrome에서 여백을 처리하는 방식에서 불일치를 해결하는 데 도움이되므로 유용합니다.
— bjudson

8

나는 이것이 매우 오래된 게시물이라는 것을 알고 있지만 부모 요소에 flexbox를 사용하면 자식 요소에 대한 마진 축소가 비활성화된다고 말하고 싶었습니다.


자식 요소뿐만 아니라 부모와 첫 번째 자식과 마지막 자식 사이의 여백 붕괴를 방지합니다.
— Sven Marnach

2

부모가 있기 때문에 마진 붕괴와 비슷한 문제가있었습니다. position relative로 설정 . 여백 축소를 비활성화하는 데 사용할 수있는 명령 목록은 다음과 같습니다.

테스트 할 곳이 있습니다

그냥 어떤 할당하려고 parent-fix*하는 클래스 div.container요소 또는 모든 클래스 children-fix*에를 div.margin. 귀하의 필요에 가장 적합한 것을 선택하십시오.

언제

  • 마진 붕괴는 이다 장애인 , div.absolute빨간색 배경이 페이지의 맨 위에 배치됩니다 함께.
  • 마진은 접히는 div.absolute 것과 같은 Y 좌표에 위치합니다div.margin

html, body { margin: 0; padding: 0; }

.container {
  width: 100%;
  position: relative;
}

.absolute {
  position: absolute;
  top: 0;
  left: 50px;
  right: 50px;
  height: 100px;
  border: 5px solid #F00;
  background-color: rgba(255, 0, 0, 0.5);
}

.margin {
  width: 100%;
  height: 20px;
  background-color: #444;
  margin-top: 50px;
  color: #FFF;
}

/* Here are some examples on how to disable margin 
   collapsing from within parent (.container) */
.parent-fix1 { padding-top: 1px; }
.parent-fix2 { border: 1px solid rgba(0,0,0, 0);}
.parent-fix3 { overflow: auto;}
.parent-fix4 { float: left;}
.parent-fix5 { display: inline-block; }
.parent-fix6 { position: absolute; }
.parent-fix7 { display: flex; }
.parent-fix8 { -webkit-margin-collapse: separate; }
.parent-fix9:before {  content: ' '; display: table; }

/* Here are some examples on how to disable margin 
   collapsing from within children (.margin) */
.children-fix1 { float: left; }
.children-fix2 { display: inline-block; }
<div class="container parent-fix1">
  <div class="margin children-fix">margin</div>
  <div class="absolute"></div>
</div>

여기 당신이 편집 할 수있는 예제 가있는 jsFiddle 이 있습니다.


1

최신 브라우저 (IE11 제외)에서는 부모-자식 여백 붕괴를 방지하는 간단한 솔루션을 사용하는 것 display: flow-root입니다. 그러나 인접한 요소 붕괴를 방지하려면 다른 기술이 필요합니다.

데모 (이전)

.parent {
  background-color: grey;
}

.child {
  height: 16px;
  margin-top: 16px;
  margin-bottom: 16px;
  background-color: blue;
}
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>

데모 (후)

.parent {
  display: flow-root;
  background-color: grey;
}

.child {
  height: 16px;
  margin-top: 16px;
  margin-bottom: 16px;
  background-color: blue;
}
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>


0

귀하의 정보를 위해 그리드를 사용할 수 있지만 부작용이 있습니다 :)

.parent {
  display: grid
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.