div 내에 떠있는 요소는 div 외부에 떠 있습니다. 왜?


274

당신이이 말 div그것을 명확한주고, width내 경우에, 그 안에 넣어 요소를 img다른 div.

콘테이너의 내용물은 div콘테이너 div가 늘어나고 내용의 배경이 될 것이라는 아이디어입니다 . 그러나이 작업을 수행 div하면 비 부동 객체에 맞게 포함이 축소되고 부동 객체가 완전히 또는 절반으로 절반으로 줄어들어 큰 크기와 관련이 없습니다 div.

왜 이런거야? 내가 부족 뭔가가, 그리고 내가 어떻게 스트레칭 할 항목 떠 얻을 수있는 height포함하는의를 div?

답변:


397

가장 쉬운 방법은 overflow:hidden부모 div 를 놓고 높이를 지정하지 않는 것입니다.

#parent { overflow: hidden }

또 다른 방법은 부모 div를 플로팅하는 것입니다.

#parent { float: left; width: 100% }

다른 방법은 명확한 요소를 사용합니다.

<div class="parent">
   <img class="floated_child" src="..." />
   <span class="clear"></span>
</div>

CSS

span.clear { clear: left; display: block; }

17
그것은 효과가 있지만 지금은 두 배 혼란 스럽습니다 : 이것에 대한 설명이 있습니까? 아니면 어떻게됩니까?
DavidR

8
네, 설명하지만 난 이후 잊어 버린 그것을 :( 그것의 단지 어떻게입니다. overflow:hidden힘이 할 수있는 최선은 부모의 자식 요소를 포함 할 수있는 브라우저 그게 전부는 그것을 수정하는 이유..
더그 Neiner

5
나는 설명을 overflow: hidden여기에 있다고 생각한다 : link . 그리고 고마워요, 그것은 나를 위해 일했다
Vikas Arora

6
@DavidR 가장 쉬운 설명은 html / css가 구식이며, 잘 모르고, 제대로 구현되지 않은 기술이라는 것입니다. 실제로,이 추론은 실제로이 게시물을 만든 이후로 의심 할 여지없이 많은 html / css 단점을 설명합니다.
약간

1
명심 overflow: hidden바로 부모 컨테이너의 흘러 요소의 어떤 부분을 숨 깁니다. 나에게 이것은 특정 비트의 텍스트를 읽을 수 없게 만들었습니다.
톱 고양이

160

이유

문제는 플로팅 요소가 유출되는 것입니다 .

플로팅, 절대 위치 또는 루트 요소 인 경우 요소가 플로우에서 호출 됩니다 .

따라서 유입 요소와 마찬가지로 주변 요소에 영향을 미치지 않습니다 .

이것은 9.5 수레에 설명되어 있습니다 :

플로트가 흐름에 없기 때문에 플로트 상자 전후에 생성 된 배치되지 않은 블록 상자는 플로트가없는 것처럼 수직으로 흐릅니다. 그러나 플로트 옆에 생성 된 현재 및 후속 라인 상자는 플로트의 여백 상자를위한 공간을 만들기 위해 필요한만큼 줄어 듭니다.

여기에 이미지 설명을 입력하십시오

10.6 높이 및 여백 계산 에도 지정되어 있습니다. 들어 "정상"블록 ,

정상적인 흐름의 어린이 만 고려됩니다 (즉, 부동 상자 및 절대 위치 상자는 무시됩니다 […]).

여기에 이미지 설명을 입력하십시오

해키 솔루션 : 정리

문제를 해결하는 방법은 일부 유입 요소를 모든 플로트 아래에 배치하는 것입니다. 그런 다음 부모의 높이가 커져 해당 요소를 래핑합니다 (따라서 수레도).

이것은 속성을 사용 하여clear 얻을 수 있습니다 :

이 속성은 요소 상자의 어느 쪽이 이전의 부동 상자에 인접 하지 않을 수 있는지 나타냅니다 .

여기에 이미지 설명을 입력하십시오

따라서 솔루션은 clear: both플로트의 마지막 형제로 빈 요소를 추가합니다.

<div style="clear: both"></div>

그러나 이는 의미론이 아닙니다. 따라서 부모의 끝에 의사 요소 를 더 잘 생성하십시오 .

.clearfix::after {
  clear: both;
  display: block;
}

이 방법에는 여러 가지 변형이 있습니다 (예 : 더 이상 사용되지 않는 단일 콜론 구문 :after을 사용하여 이전 브라우저 지원 또는 과 같은 다른 블록 수준 디스플레이 사용) display: table.

솔루션 : BFC 루트

처음에 정의 된 문제가있는 동작에는 예외가 있습니다. 블록 요소가 블록 서식 컨텍스트를 설정하면 (BFC 루트) 플로팅 내용도 래핑됩니다.

블록 서식 컨텍스트 루트에 대한 10.6.7 '자동'높이에 따르면 ,

요소에 아래쪽 여백 가장자리가 요소의 아래쪽 내용 가장자리 아래에있는 부동 자손이있는 경우 해당 가장자리를 포함하도록 높이가 증가합니다.

여기에 이미지 설명을 입력하십시오

또한 9.5 Floats에 설명 된 것처럼 BFC 루트는 다음 때문에 유용합니다.

테이블의 경계 상자, 블록 레벨 대체 요소 또는 새 블록 형식화 컨텍스트를 설정하는 일반 플로우의 요소 […]는 요소 자체와 동일한 블록 형식화 컨텍스트에서 부동 소수점 여백 상자와 겹치지 않아야합니다. .

여기에 이미지 설명을 입력하십시오

블록 서식 컨텍스트는

  • overflow이외의 블록 박스 visible, 예.hidden

    .bfc-root {
      overflow: hidden;
      /* display: block; */
    }
    
  • 때 상자를 차단하지 않는 블록 컨테이너 display로 설정 inline-block, table-cell또는 table-caption.

    .bfc-root {
      display: inline-block;
    }
    
  • 요소 부동 다음과 같은 경우 float로 설정 left하거나 right.

    .bfc-root {
      float: left;
    }
    
  • 절대로 배치 된 요소 : when 또는 position로 설정되어 있습니다.absolutefixed

    .bfc-root {
      position: absolute;
    }
    

오버플로 내용 내용 클리핑, 맞춤 알고리즘으로 자동 너비 계산 또는 흐름에서 벗어나는 등 원하지 않는 부수 효과가있을 수 있습니다 . 따라서 문제는 BFC를 설정하는 오버플로가 보이는 인플 로우 블록 레벨 요소를 가질 수 없다는 것입니다.

디스플레이 L3 은 다음과 같은 문제를 해결합니다.

생성 flow내부 디스플레이 유형을 잘 표현 흐름 레이아웃에 표시 유형 및 요소 메이킹에 대한 명시적인 스위치를 만들 BFC의 루트를. (이 같은 해킹에 대한 필요성 제거해야 및 [...])flow-root ::after { clear: both; }overflow: hidden

안타깝게도 아직 브라우저 지원이 없습니다. 결국 우리는 사용할 수 있습니다

.bfc-root {
  display: flow-root;
}

1
따라서 부유 상자는 부모 컨테이너에 의해 인식되지 않으므로 높이가 붕괴되지만 형제에 의해 인식되므로 명확한 것입니까?
symlink

@symlink 예, 부모 컨테이너는 BFC 루트가 아니라면 플로트를 둘러싸 기 위해 자라지 않습니다. BFC 루트가 아닌 형제는 블록의 직접적인 영향을받지 않습니다 (그러나 라인 박스는 영향을받습니다). 그러나 클리어런스는 이전 플로트 아래로 이동합니다.
Oriol

"BFC 루트가 아닌 형제는 블록의 직접적인 영향을받지 않습니다 (그러나 라인 박스는 영향을받습니다)." -이것을 명확히 해줄 수 있습니까? 이 jsFiddle : jsfiddle.net/aggL3Lk7/2 에서 플로팅 인라인 이미지는 스팬에 영향을 미치지 않지만 스팬의 테두리가 스팬에 영향을 미치지 않지만 이미지는 표시된 것처럼 텍스트 (라인 상자)에 영향을 미칩니다. 텍스트가 이미지에 겹치지 않는다는 사실에 의해?
symlink

1
@symlink 그렇습니다. 글쎄, 당신의 바이올린에서 테두리는 부모에 속하지만, 기본적으로 형제 에게는
Oriol

1
동의합니다. 이것은 정답입니다. W3가 우리가 "해킹"을 코딩하도록 강요하는 방식을 부르고 있다는 것이 흥미 롭습니다. 누군가가 망 쳤어
DR01D



11

빠진 것이 없습니다. Float는 이미지 (예 :)가 텍스트의 여러 단락 옆에 놓 이도록하려는 경우를 위해 설계되었으므로 텍스트가 이미지 주위로 흐릅니다. 텍스트가 컨테이너를 "스트레치"한 경우에는 발생하지 않습니다. 첫 번째 단락이 끝나면 다음 단락이 이미지 아래에서 시작됩니다 (아마도 수백 픽셀 아래).

이것이 바로 결과를 얻는 이유입니다.


3
부동 요소가 부모의 높이를 올바르게 늘리는 것과 어떻게 관련이 있습니까?
약간

11

경우에 따라 (예 를 들어, 동일한 "라인"에 요소가 흐르기 위해 사용 하는 경우)float

display: inline-block;

대신에

float: left;

그렇지 않으면 clearCSS 작업을 수행하기 위해 요소를 필요로하는 요소가 필요하기 때문에 최종 요소를 사용하면 효과가 있습니다.


11

보다 현대적인 접근 방식은 다음과 같습니다.

.parent {display: flow-root;} 

더 이상 명확한 수정 사항이 없습니다.

오버플로 사용 : 숨겨진; 상자 그림자를 숨 깁니다.


Safari 11에서도 작동
pendingfox

7

LSerni 당신이 나를 위해 그것을 해결 감사합니다 .

이것을 달성하려면 :

+-----------------------------------------+
| +-------+                     +-------+ |
| | Text1 |                     | Text1 | |
| +-------+                     +-------+ |
|+----------------------------------------+

이 작업을 수행해야합니다.

<div style="overflow:auto">
    <div style="display:inline-block;float:left"> Text1 </div>
    <div style="display:inline-block;float:right"> Text2 </div>
</div>

4

Lucas가 말했듯이 설명하는 것은 float 속성의 의도 된 동작입니다. 많은 사람들이 혼란스럽게 생각하는 것은 float가 CSS 레이아웃 모델의 단점을 보완하기 위해 원래 의도 된 사용법을 훨씬 뛰어 넘었다는 것입니다.

이 속성이 어떻게 작동하는지 더 잘 이해하려면 Floatutorial을 살펴보십시오 .


0

먼저 쉽게 할 수 있습니다 .div를 유연하게 만들고 내용을 오른쪽 또는 왼쪽으로 정당화하면 문제가 해결됩니다.

<div style="display: flex;padding-bottom: 8px;justify-content: flex-end;">
					<button style="font-weight: bold;outline: none;background-color: #2764ff;border-radius: 3px;margin-left: 12px;border: none;padding: 3px 6px;color: white;text-align: center;font-family: 'Open Sans', sans-serif;text-decoration: none;margin-right: 14px;">Sense</button>
				</div>

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