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


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: autooverflow: 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.