CSS-부동 자식 DIV 높이를 부모 높이로 확장


451

페이지 구조는 다음과 같습니다.

<div class="parent">
    <div class="child-left floatLeft">
    </div>

    <div class="child-right floatLeft">
    </div>
</div>

이제 child-leftDIV에 더 많은 내용이 포함되므로 parentDIV의 높이는 자식 DIV에 따라 증가합니다.

그러나 문제는 child-right키가 증가하지 않는다는 것입니다. 부모와 같은 높이를 어떻게 만들 수 있습니까?


답변:


459

위해 parent요소, 다음과 같은 속성을 추가 :

.parent {
    overflow: hidden;
    position: relative;
    width: 100%;
}

다음에 .child-right이 :

.child-right {
    background:green;
    height: 100%;
    width: 50%;
    position: absolute;
    right: 0;
    top: 0;
}

여기 에서 CSS 예제 와 동일한 높이 열에 대한 자세한 정보를 통해 더 자세한 결과를 찾을 수 있습니다 .


14
CSS에서 정의되지 않은 동작이 발생합니다. 부모의 키는 자녀의 키에 따라 다르지만 자녀는 부모의 관점에서 백분율 높이가 정의되어 있습니다. 이는 유효하지 않으며 브라우저 간 방식으로 작동하지 않을 수 있습니다.
Eamon Nerbonne

1
나는 당신이 모든 것을 떠 다니는 것이 아니라는 것을 알았습니다. 그래서 오른쪽 열이 왼쪽보다 길어지면 실제로 확장되지 않는 비용으로 정의됩니다 (실제로 OP의 질문에서는 그렇지 않습니다).
Eamon Nerbonne

4
예, 다음을 추가해야합니다. padding-bottom : 32768px; 여백-하단 : -32768px; 아이들에게.
Michael

3
이것은 오른쪽 열이 왼쪽보다 내용이 적거나 그렇지 않으면 잘립니다. 또한 쓸모없는 선언을 생략하기 위해 답을 편집했습니다.
Christoph

3
@MatthewBlackford : 여백이 무너지는 것을 막는 "해킹"입니다. 1px 투명 테두리를 사용하는 것과 같은 다른 방법으로 여백이 접히는 것을 막을 수는 있지만 본질적으로 여백 붕괴를 피하는 것이 중요합니다. 가정에 결함이있는 것으로 판명 될 때 이상한 레이아웃 오류와 예기치 않은 자르기 (또는 중첩 된 내용)가 발생하기 때문에 마지막 해결책을 제외 하고는이 솔루션을 사용하지 않을 것입니다. 한마디로 : 실제로 필요한 경우가 아니면이 작업을 원하지 않습니다 .
Eamon Nerbonne

206

이 문제에 대한 일반적인 솔루션은 절대 위치 또는 자르기 부동을 사용하지만 열의 수 + 크기가 변경되면 광범위한 조정이 필요하고 "주"열이 항상 가장 길어야한다는 점에서 까다 롭습니다. 대신 세 가지 강력한 솔루션 중 하나를 사용하는 것이 좋습니다.

  1. display: flex: 가장 단순하고 최상의 솔루션 이며 매우 유연하지만 IE9 및 이전 버전에서는 지원되지 않습니다.
  2. table또는 display: table: 매우 간단하고, 매우 호환 가능하며 (대부분의 모든 브라우저에서) 매우 유연합니다.
  3. display: inline-block; width:50% 마이너스 마진 핵 : 매우 간단하지만 열 아래쪽 테두리는 약간 까다 롭습니다.

1. display:flex

이것은 매우 간단하고 더 복잡하거나 더 자세한 레이아웃에 쉽게 적용 할 수 있지만 flexbox는 IE10 이상에서만 지원됩니다 (다른 최신 브라우저 포함).

예 : http://output.jsbin.com/hetunujuma/1

관련 HTML :

<div class="parent"><div>column 1</div><div>column 2</div></div>

관련 CSS :

.parent { display: -ms-flex; display: -webkit-flex; display: flex; }
.parent>div { flex:1; }

Flexbox는 훨씬 더 많은 옵션을 지원하지만, 위의 열만으로도 충분합니다!

2. <table>또는display: table

간단한 &이 작업을 수행하는 매우 호환 방법은 사용하는 것입니다 table- 당신이 오래된 IE의 지원이 필요한 경우 첫 번째 시도 권하고 싶습니다 . 열을 다루고 있습니다. divs + floats는 단순히 그렇게하는 가장 좋은 방법은 아닙니다 (CSS 제한을 해킹하기 위해 여러 수준의 중첩 된 div가 단순한 테이블을 사용하는 것보다 거의 "의미 적"이라는 사실은 말할 것도 없습니다). table요소 를 사용하지 않으려면 cssdisplay: table (IE7 및 이전 버전에서는 지원되지 않음)를 고려하십시오.

예 : http://jsfiddle.net/emn13/7FFp3/

관련 HTML : (그러나<table>대신일반 사용을 고려하십시오)

<div class="parent"><div>column 1</div><div>column 2</div></div>

관련 CSS :

.parent { display: table; }
.parent > div {display: table-cell; width:50%; }
/*omit width:50% for auto-scaled column widths*/

이 접근 방식은 overflow:hidden플로트를 사용 하는 것보다 훨씬 강력 합니다. 거의 모든 열을 추가 할 수 있습니다. 원하는 경우 자동 크기 조정 을 수행 할 수 있습니다 . 고대 브라우저와의 호환성을 유지합니다. float 솔루션의 요구 사항과 달리 어떤 열이 가장 긴지 미리 알 필요가 없습니다 . 높이가 잘 맞습니다.

KISS : 특별히 필요하지 않은 경우 플로트 핵을 사용하지 마십시오. IE7이 문제가 되더라도 유지 관리가 어렵고 유연성이 떨어지는 트릭 CSS 솔루션에서 의미 열이있는 일반 테이블을 계속 선택합니다.

그건 그렇고, 당신은 당신의 레이아웃을 필요로하는 경우 당신은 사용할 수 있습니다 응답 (작은 휴대 전화에 대한 예에는 열) 수 없습니다 @media사용 여부를이 작품 - 작은 화면 폭에 대한 일반 블록 레이아웃에 다시 가을에 질의를 <table>하거나 다른 display: table요소입니다.

3. display:inline block부정적인 마진 해킹.

또 다른 대안은을 사용하는 것 display:inline block입니다.

예 : http://jsbin.com/ovuqes/2/edit

관련 HTML : (div태그사이에 공백이 없으면중요합니다!)

<div class="parent"><div><div>column 1</div></div><div><div>column 2</div></div></div>

관련 CSS :

.parent { 
    position: relative; width: 100%; white-space: nowrap; overflow: hidden; 
}

.parent>div { 
    display:inline-block; width:50%; white-space:normal; vertical-align:top; 
}

.parent>div>div {
    padding-bottom: 32768px; margin-bottom: -32768px; 
}

이것은 약간 까다 롭고 음수 여백은 열의 "진정한"하단이 가려져 있음을 의미합니다. 이것은 결국 열이 잘려서 열의 맨 아래를 기준으로 아무것도 배치 할 수 없음을 의미합니다 overflow: hidden. 인라인 블록 외에도 플로트와 비슷한 효과를 얻을 수 있습니다.


TL; DR : IE9 이상을 무시할 수 있으면 flexbox를 사용 하십시오 . 그렇지 않으면 (css) 테이블을 시도하십시오. 이러한 옵션 중 어느 것도 효과가 없다면 부정적인 마진 해킹이 있지만 개발 중에 놓치기 쉬운 이상한 디스플레이 문제가 발생할 수 있으며 알아야 할 레이아웃 제한이 있습니다.


1
좋은 방법이지만 이러한 셀 사이에 여백을 사용할 수 없습니다 (패딩은 스타일을 원하는 경우 도움이되지 않습니다).
Wordpressor

3
border-spacing:10px;테이블 요소에 여백과 같은 간격이 생깁니다. 또는 공간을 추가 할 빈 공간을 추가 할 수 있습니다. 또한 테이블 셀 안에 패딩을 추가 할 수도 있습니다. 패딩은 배경에 포함되므로 원하는 것이 아닐 수도 있습니다. 그러나 일반적인 마진만큼 유연하지는 않다는 것이 맞습니다. 그리고 열과 관련하여 아무것도 배치 할 수 없으므로 문제가 될 수 있습니다.
Eamon Nerbonne

1
그래서 테이블리스 레이아웃이 더 좋습니까?
동적

3
나는 말해야한다 : 나는이 경우 간단한 테이블이면 충분하다는 것에 동의한다. 문제는 테이블마다 레이아웃을 무시하는 일반적인 뷰 있다는 것입니다
동적

3
테이블의 문제는 화면의 너비를 더 작은 크기로 조정하면 (반응 형 디자인) 테이블 셀이 다음 셀의 맨 위에 바둑판 식으로 배열되는 대신 테이블 셀이 뭉개진다는 것입니다. 안쪽 여백이있는 두 번째 방법 : 32768px; 여백-하단 : -32768px; 아주 놀랍고 거의 정확히 내가 필요한 것을 ... 그것에 대한 감사합니다 ... 테두리 바닥은 문제입니다 ...
Serj Sagan

23

부모의 경우 :

display: flex;

어린이들을위한:

align-items: stretch;

접두사를 추가하고 캐니 우스를 확인하십시오.


2
추천하지 않습니다. IE9는 여전히 문제입니다.

답변 주셔서 감사합니다; 잘 작동한다! "접두사를 추가하고 캐니 우스를 점검해야합니다." 그 라인은 무엇을 의미합니까? 초보자를위한 정보를 조금 더 추가 할 수 있습니까?
Md Sifatul Islam

@MdSifatulIslam 여기로 이동하십시오 : caniuse.com/#feat=flexbox 지원해야하는 일부 브라우저에 기능 접두사가 필요한지 확인할 수 있습니다.
Aiphee

18

나는 많은 답변을 찾았지만 아마도 나에게 가장 좋은 해결책은

.parent { 
  overflow: hidden; 
}
.parent .floatLeft {
  # your other styles
  float: left;
  margin-bottom: -99999px;
  padding-bottom: 99999px;
}

여기에서 다른 솔루션을 확인할 수 있습니다 http://css-tricks.com/fluid-width-equal-height-columns/


왜 이것이 작동하는지 모르겠지만 그것은 매력처럼 내 문제를 해결합니다. 감사합니다
결합

나에게도 효과가 있습니다. 깨끗한 방법은 아니지만. 감사!
Mark Anthony Uy

18
지옥처럼 해키. 프로덕션 응용 프로그램에는 권장하지 않습니다
FedericoCapaldo

굉장합니다. 나는이 사실 일 것이라고 생각하지 않았다
톰 맥도 너에게

11

부모 div를 overflow: hidden
다음으로 설정하십시오. 자식 div에서 padding-bottom에 대해 많은 양을 설정할 수 있습니다. 예를 들어
padding-bottom: 5000px
다음 margin-bottom: -5000px
과 모든 자식 div의 부모의 높이가 될 것입니다.
물론 부모 div에 내용을 넣으려고하면 작동하지 않습니다 (다른 div 외부)

.parent{
    border: 1px solid black;
    overflow: hidden;
    height: auto;
}
.child{
    float: left;
    padding-bottom: 1500px;
    margin-bottom: -1500px;
}
.child1{
    background: red;
    padding-right: 10px;    
}
.child2{
    background: green;
    padding-left: 10px;
}
<div class="parent">
    <div class="child1 child">
        One line text in child1
    </div>
    <div class="child2 child">
        Three line text in child2<br />
        Three line text in child2<br />
        Three line text in child2
    </div>
</div>

예 : http://jsfiddle.net/Tareqdhk/DAFEC/


조금 더러워 보이지만 나를 위해 일했습니다.이 질문에 대한 유일한 해결책입니다. 트위터 부트 스트랩을 사용하여 시도했습니다.
cukabeka

8

부모님의 키가 있습니까? 부모님의 키를 이렇게 설정하면

div.parent { height: 300px };

그런 다음 아이를 이렇게 전체 높이로 늘릴 수 있습니다.

div.child-right { height: 100% };

편집하다

다음은 JavaScript를 사용하여 수행하는 방법입니다.


부모의 키는 고정되어 있지 않습니다. 자식 왼쪽 높이에 따라 확장됩니다.
Veera

아, 많이 생각했다면 JavaScript가 필요합니다. 잠시 후에 추가하겠습니다.
Olical

@Olical JSFiddle 링크가 끊어졌습니다. 그것을 제거하거나 답변을 업데이트하십시오. 감사!
itsmysterybox

1
지금 JS에 대한 링크는 404 제공
Chanoch

5

CSS 테이블 표시는 다음에 이상적입니다.

.parent {
  display: table;
  width: 100%;
}
.parent > div {
  display: table-cell;
}
.child-left {
  background: powderblue;
}
.child-right {
  background: papayawhip;
}
<div class="parent">
  <div class="child-left">Short</div>
  <div class="child-right">Tall<br>Tall</div>
</div>

원래 답변 (열이 더 크다고 가정) :

부모의 키를 어린이의 키에 따라, 어린이의 키를 부모의 키에 따라 만들려고합니다. 계산하지 않습니다. CSS Faux 열이 ​​가장 좋은 솔루션입니다. 이를 수행하는 방법은 여러 가지가 있습니다. 차라리 JavaScript를 사용하고 싶지 않습니다.


좋은 지적. 자녀의 키가 부모가 아닌 가장 높은 형제의 키 (부모의 키에 의해 결정되는지 여부에 따라)에 의존한다면 어떨까요? CSS로는 할 수 없다고 생각합니다.
mikato

아니요, 형제는 서로의 키에 영향을 줄 수 없습니다. 그러나 display: table+ display: table-cell레이아웃은 원하는 결과를 생성합니다.
Salman A

대단한 업데이트! 그러나, 나는 이것을 시도하고 div / 셀 사이에 공백을 나누고 싶었고 테이블 셀 div 내에서 내부 div를 만들어서 전체 높이를 사용할 수있는 능력을 잃어 버렸습니다. 내부 div가 테이블 셀 div가 아니기 때문에 정확히 같은 문제입니다. 그것에 대한 아이디어가 있습니까? 이제 셀 간격이 누락되었습니다.
mikato

아, CSS에는 테두리 간격이 있습니다! stackoverflow.com/questions/339923/… 테두리 간격을 사용하여 테이블과 같은 div가 공백 분리와 잘 작동하도록 할 수있었습니다. 이제 테이블 셀 div를 영리하게 사용하여 테이블 셀 (컬러 배경 블록)을 사용하여 부모의 전체 높이를 사용할 수 있습니다.
mikato


4

최근 jQuery를 사용하여 웹 사이트 에서이 작업을 수행했습니다. 이 코드는 가장 높은 div의 높이를 계산하고 다른 div를 동일한 높이로 설정합니다. 기술은 다음과 같습니다.

http://www.broken-links.com/2009/01/20/very-quick-equal-height-columns-in-jquery/

나는 height:100%작동 하지 않을 것이라고 생각 하므로 div 높이를 명시 적으로 모른다면 순수한 CSS 솔루션이 있다고 생각하지 않습니다.


1
최소한 준비, 크기 조정, 방향 변경, 글꼴 크기 조정시이를 트리거해야합니다.
netAction

4

나는 이것을 코멘트 섹션에 사용했다 :

.parent {
    display: flex;
    float: left;
    border-top:2px solid black;
    width:635px;
    margin:10px 0px 0px 0px;
    padding:0px 20px 0px 20px;
    background-color: rgba(255,255,255,0.5);
}
    
.child-left {
	align-items: stretch;
	float: left;
	width:135px;
	padding:10px 10px 10px 0px;
	height:inherit;
	border-right:2px solid black;
}

.child-right {
	align-items: stretch;
	float: left;
	width:468px;
	padding:10px;
}
<div class="parent">
  <div class="child-left">Short</div>
  <div class="child-right">Tall<br>Tall</div>
</div>

자식 오른쪽을 오른쪽으로 띄울 수 있지만이 경우 각 div의 너비를 정확하게 계산했습니다.


1
내 마음에 온 첫 번째 것은 키였다 : 왜 아무도 공감하지 않았는지 잘 모르겠다
Andreas

3

부트 스트랩을 알고 있다면 'flex'속성을 사용하여 쉽게 할 수 있습니다 .CSS 속성 아래에서 부모 div로 전달하면됩니다.

.homepageSection {
  overflow: hidden;
  height: auto;
  display: flex;
  flex-flow: row;
}

.homepageSection부모 div는 어디에 있습니까 ? 이제 HTML에 하위 div를 다음과 같이 추가하십시오.

<div class="abc col-md-6">
<div class="abc col-md-6">

여기서 abc는 내 자식 div입니다. 자식 div에 테두리를 지정하여 테두리에 관계없이 두 자식 div의 높이가 동일한 지 확인할 수 있습니다.


0
<div class="parent" style="height:500px;">
<div class="child-left floatLeft" style="height:100%">
</div>

<div class="child-right floatLeft" style="height:100%">
</div>
</div>

아이디어를주기 위해 인라인 스타일을 사용했습니다.


-2

인턴쉽 인터뷰에서이 깔끔한 트릭에 대해 배웠습니다. 원래 질문은 세 개의 열에서 각 상단 구성 요소의 높이가 사용 가능한 모든 내용을 표시하는 동일한 높이를 유지하는 방법입니다. 기본적으로 가능한 최대 높이를 렌더링하는 보이지 않는 자식 구성 요소를 만듭니다.

<div class="parent">
    <div class="assert-height invisible">
        <!-- content -->
    </div>
    <div class="shown">
        <!-- content -->
    </div>
</div>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.