2010-02-01 5 views
48

여백이있는 요소가 다른 요소 내에 포함되어 있으면 부모가 해당 여백을 일관되게 래핑하지 않습니다.부모 요소에 여백이 포함되지 않는 이유는 무엇입니까?

많은 일들이 아이의 마진을 래핑하는 부모의 원인이됩니다

  • 국경 : 고체;
  • 위치 : 절대;
  • 디스플레이 : 인라인 블록;
  • 오버 플로우 : 자동

(. 그리고 이것은 단지 작은 시험에서, 의심의 여지가 더 없다가)

나는이 가정 것은 붕괴 마진과 관련이있다, 그러나 :

  1. W3C 사양 페이지에는 이러한 동작에 대한 설명이 없습니다.
  2. 여기에는 겹치는 여백이 없습니다.
  3. 모든 브라우저의 동작이이 문제와 일치하는 것으로 보입니다. 자동 오버 플로우가 자동으로 설정되어있는 것보다는 다른 재료를 포함해야합니다 :
  4. 이 동작은하는 기본값 요소가 오버 플로우하는 논리는 무엇 여백

관련이없는 트리거에 의해 영향을 받는다 .

정규 div의 기본 동작을 제외한 모든 동작에서 마진이 부모에 포함되어 있다고 가정해야하는 이유는 무엇입니까? 또한 일반 기본 값에 여백이없는 이유는 무엇입니까?

편집 : 마지막 대답은 W3C가 정말이 동작을 지정 않는다는 것입니다,하지만

  • 사양은 정말 이해가되지 않습니다.
  • The specs mix, without any word of explanation :
    • '무료 마진'(부모의 상단 또는 하단을 터치 것이다 마진은 부모에 포함되지 않음) 및
    • 은 (인접한 여백이 겹쳐 허용) '마진 붕괴'.

데모 : CSS는 according to W3C 어떻게 작동하는지

<!doctype html> 
<html> 
<head> 
<title>Margins overextending themselves</title> 
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" > 
<style type="text/css"> 
    body{ 
     margin:0; 
    } 
    div.b{ 
     background-color:green; 
    } 
    div.ib{ 
     display:inline-block; 
     background-color:red; 
    } 
    div.pa{ 
     background-color:yellow; 
     position:absolute; 
     bottom:0; right:0; 
    } 
    div.oa{ 
     background-color:magenta; 
     overflow:auto; 
    } 
    div.brdr{ 
     background-color:pink; 
     border:solid; 
    } 

    h1{margin:100px; width:250px; border:solid;} 
</style> 
</head> 
<body> 
<div class="b"> 
    <h1>Is the margin contained?</h1> 
</div> 
<div class="ib"> 
    <h1>Is the margin contained?</h1> 
</div> 
<div class="pa"> 
    <h1>Is the margin contained?</h1> 
</div> 
<div class="oa"> 
    <h1>Is the margin contained?</h1> 
</div> 
<div class="brdr"> 
    <h1>Is the margin contained?</h1> 
</div> 
</body> 
</html>` 
+0

나는 당신이 무엇을 요구하고 있는지 이해하지 못한다. h1 요소가 컨테이너 요소 안에 표시되는 이유는 무엇입니까? 귀하의 질문에 더 분명히하십시오. –

답변

26

이것은이다 : 본 명세서에서

을, 여백을 붕괴 표현이 그 인접 마진 (더 비어 있지 않은 내용을 의미합니다, 패딩 또는 경계 영역을 분리하거나 간격을 두어) 둘 이상의 상자 (서로 옆에 있거나 중첩되어있을 수 있음)가 결합되어 단일 여백을 형성합니다.

보다 구체적인 상단 사업부의 사건에 : 마진이 그것을 통해 붕괴에 대한

상자의 상단과 하단 여백이 인접한 경우, 다음이 가능합니다. 이 경우 요소의 위치는 여백이 축소 된 다른 요소와의 관계에 따라 달라집니다.

  • 부모의 위쪽 여백과 함께 요소의 여백을 축소하면 상자의 위쪽 테두리 가장자리가 부모와 동일하게 정의됩니다.
  • 그렇지 않으면 요소의 부모가 여백 축소에 참여하지 않거나 부모의 아래쪽 여백 만 포함됩니다. 요소의 위쪽 테두리 가장자리의 위치는 요소의 아래쪽 테두리가 0이 아닌 경우와 동일합니다.

내가 할 수있는 가장 좋은 것은는 "Collapsing Margins" on sitepoint에 (토미 올슨와 폴 오브라이언에 의해)로 포인트입니다. 그들은 매우 상세한 설명과 예제를 사용하여 질문 예제 코드에서 데모 한 동작을 정확하게 보여줍니다.

+0

이 기사에 따르면 보이는 동작이 잘못되었습니다.
답변에 대한 답변 : "여백 축소는 인접한 여백 ... 결합"을 의미합니다. 여기에는 인접한 여백이 없기 때문에 붕괴 여백이 될 수 없습니다. 특히, "요소의 여백이 부모의 위쪽 여백과 함께 축소 된 경우"- 부모는 상위 여백이 없기 때문에 가능하지 않습니다. 질문에서 나는 붕괴 된 마진을 다룹니다. 두 경우 모두 표시가 인라인 블록이거나 오버플로가 auto (기본값과 동일)로 설정된 경우 동작이 변경되어야하는 이유는 설명하지 않습니다. – SamGoody

+0

수정 :이 기사에는 트리거의 일부와 다른 항목이 나열되어 있습니다. 이러한 트리거가 겹치는 마진을 붕괴하지 못하게하는 것처럼 규칙적인 마진도 붕괴되는 것을 방지합니다. 두 가지 질문 : 1) 어떻게이 행동이 의미가있을 수 있습니까? 2) 마진이 겹치는 이유는 무엇입니까? – SamGoody

+1

@samgoody - 1) 인쇄물 배경에서 나온 경우를 제외하고는 별 의미가 없다는 데 동의합니다. 사양이 작성되었을 때 주로 웹이었습니다. 해당보기는 여기를 참조하십시오 : http://complexspiral.com/publications/uncollapsing-margins/ 2) 부모/자녀의 경우 부모님/자녀의 붕괴로 인해 'div.b'에 100px가 부여됩니다. 세로 여백, 그래서 대신 배경 녹색 흰색. 문제는 스펙이 명확하지 않다는 것입니다. ** 마진은이 경우 붕괴에서 승리합니다. 현재 브라우저에서 보니 부모가 가져옵니다. –

관련 문제