div (높이)가 부모 나머지 높이를 차지하도록합니다.


107

http://jsfiddle.net/S8g4E/

div두 아이 가있는 용기 가 있습니다. 첫 번째 아이는 주어진 키를 가지고 있습니다. 두 번째 아이가 div특정 높이를주지 않고 컨테이너의 "여유 공간"을 차지하게하려면 어떻게 해야합니까?

이 예에서 분홍색 div은 공백도 차지해야합니다.


이 질문과 비슷합니다. div가 나머지 높이를 차지하도록 만드는 방법은 무엇입니까?

하지만 절대 위치 를주고 싶지 않습니다 .


두 번째 아이의 키를 100 %로 설정했지만 작동하지 않습니다 : jsfiddle.net/S8g4E/1
Alvaro

답변:


156

#down남은 공간을 채우기 위해 자식을 확장하는 #container것은 달성하려는 브라우저 지원 및 #up정의 된 높이가 있는지 여부에 따라 다양한 방법으로 수행 될 수 있습니다 .

샘플

그리드

CSS의 grid레이아웃은 또 다른 옵션을 제공하지만 Flexbox 모델만큼 간단하지는 않습니다. 그러나 컨테이너 요소의 스타일링 만 필요합니다.

.container { display: grid; grid-template-rows: 100px }

grid-template-rows고정 된 높이 100 픽셀과 같은 첫 번째 행을 정의하고,이 열이 자동으로 나머지 공간을 채우기 위해 기지개 남아있다.

IE11에는 -ms-접두사 가 필요 하므로 지원하려는 브라우저에서 기능의 유효성을 검사해야합니다.

Flexbox

CSS3의 Flexible Box Layout Module ( flexbox) 은 이제 잘 지원되며 구현하기가 매우 쉽습니다. 유연하기 때문에 #up높이가 정의되지 않은 경우에도 작동합니다 .

#container { display: flex; flex-direction: column; }
#down { flex-grow: 1; }

일부 flexbox 속성에 대한 IE10 및 IE11 지원은 버그가있을 수 있으며 IE9 이하에서는 전혀 지원하지 않는다는 점에 유의해야합니다.

계산 된 높이

또 다른 쉬운 해결책은 Alvaro가 그의 대답에서 지적했듯이 CSS3calc 기능 단위 를 사용하는 것이지만 첫 번째 자식의 키가 알려진 값이어야합니다.

#up { height: 100px; }
#down { height: calc( 100% - 100px ); }

매우 광범위하게 지원되며 유일한 예외는 IE8 또는 Safari 5 (지원 안 함) 및 IE9 (부분 지원)입니다. 다른 문제로는 transform 또는 box-shadow 와 함께 calc 사용이 포함 되므로 우려되는 경우 여러 브라우저에서 테스트해야합니다.

기타 대안

이전의 지원이 필요한 경우, 당신은 추가 할 수 있습니다 height:100%;#down하나주의해야 할 점으로, 분홍색 사업부 전체 높이를 만들 것입니다. 컨테이너를 #up아래로 밀기 때문에 컨테이너가 넘칠 것 입니다.

따라서 overflow: hidden;컨테이너에 추가 하여 문제를 해결할 수 있습니다.

또는의 높이 #up가 고정되어있는 경우 컨테이너 내에 절대 위치를 지정하고 #down.

그리고 또 다른 옵션은 테이블 디스플레이를 사용하는 것입니다.

#container { width: 300px; height: 300px; border: 1px solid red; display: table;}
#up { background: green; display: table-row; height: 0; }
#down { background: pink; display: table-row;}​

4
#down이 #container height-#up height로하고 싶습니다. 그래서 숨겨진 오버플로는 내가 찾고있는 것이 아닙니다. 또한 절대 위치를 사용하고 싶지 않습니다. 감사!
Alvaro

@Alvaro, 테이블 디스플레이를 사용하여 다른 옵션을 추가했습니다. 여기서 단점은 호환성입니다. PS position: relative;창이 아닌 컨테이너를 기준으로 위치 를 지정 하여 컨테이너 내부에 절대 위치하는 요소 입니다. 따라서 그것은 실행 가능한 옵션이어야합니다.
사용자

2
테이블 행이 작동해야합니다 . 증명을 위해이 jsFiddle 을 참조 하세요 . 위치 절대 방법은이 바이올린과 동일한 결과를 산출 할 수 없으므로 목록에서 긁어 낼 수 있습니다 (#down 및 #container는 해당 시나리오에서 동일한 높이를 가짐).
사용자

3
당신은 많은 것을 요구하고 있습니다, @Alvaro. CSS는 스크립팅 언어가 아닙니다. 물건을 계산할 수 없습니다. 당신은 환상이나 js에 갇혀 있습니다.
Jezen Thomas

1
@Quantastical, 도움을 주셔서 감사합니다.하지만 최근 편집에서 제가 게시 한 답변을 복사했습니다. 그것에 대해 언급하는 사람들은 적어도 좋을 것입니다.
Alvaro 2014

24

이 질문을 한 지 거의 2 년이 지났습니다. 나는 방금 내가 가진이 문제를 해결하는 css calc ()를 생각해 냈고 누군가가 같은 문제를 가지고 있다면 그것을 추가하는 것이 좋을 것이라고 생각했습니다. (그런데 저는 절대 위치를 사용했습니다).

http://jsfiddle.net/S8g4E/955/

여기 CSS가 있습니다

#up { height:80px;}
#down {
    height: calc(100% - 80px);//The upper div needs to have a fixed height, 80px in this case.
}

여기에 대한 자세한 정보 : http://css-tricks.com/a-couple-of-use-cases-for-calc/

브라우저 지원 : http://caniuse.com/#feat=calc


1
나도 CSS3를 사용해 왔는데 calc, 와이드 브라우저 지원이 그다지 중요하지 않은 경우 (IE8 이하 및 Safari 5에서는 지원하지 않음).
사용자

3
동적 #up높이로 비슷한 작업을 수행 할 수있는 방법이 있습니까?
Adam Waite

@AdamWaite, 동적 #up 높이를 사용하면 다른 답변에 설명 된 오버플로 솔루션을 사용하고 싶을 것입니다.
사용자

5

내 대답은 CSS 만 사용하며 overflow : hidden 또는 display : table-row를 사용하지 않습니다. 첫 번째 아이가 실제로 주어진 키를 가지고 있어야하지만 귀하의 질문에서 두 번째 아이 만 키가 지정되어 있지 않다고 말하고 있으므로 이것이 수용 가능하다고 생각합니다.

HTML

<div id="container">
    <div id="up">Text<br />Text<br />Text<br /></div>
    <div id="down">Text<br />Text<br />Text<br /></div>
</div>

CSS

#container { width: 300px; height: 300px; border:1px solid red;}
#up { background: green; height: 63px; float:left; width: 100% }
#down { background:pink; padding-top: 63px; height: 100%; box-sizing: border-box; }

http://jsfiddle.net/S8g4E/288/


2

데모 확인-http: //jsfiddle.net/S8g4E/6/

CSS 사용-

#container { width: 300px; height: 300px; border:1px solid red; display: table;}
#up { background: green; display: table-row; }
#down { background:pink; display: table-row;}

당신은 추가해야 height: 1px#up것이 높이의 최소 금액을 소요 보장하기 위해. 다음에 대한 브라우저 지원 display: table: caniuse.com/css-table
thirtydot

이 "더 복잡한"예제에서이 솔루션을 어떻게 얻을 수 있는지 보여 주시겠습니까? jsfiddle.net/fyNX4 감사합니다
Alvaro

2

내가 오해하지 않는 한 height: 100%;overflow:hidden;에 추가 할 수 있습니다 #down.

#down { 
    background:pink; 
    height:100%; 
    overflow:hidden;
}​

라이브 데모

편집 :을 사용하지 않기 때문에이 시나리오에 overflow:hidden;사용할 수 있습니다 display: table;. 그러나 IE 8 이전에는 지원되지 않습니다. ( display: table;지원 )

#container { 
    width: 300px; 
    height: 300px; 
    border:1px solid red;
    display:table;
}

#up { 
    background: green;
    display:table-row;
    height:0; 
}

#down { 
    background:pink;
    display:table-row;
}​

라이브 데모

참고 : 당신은 당신이 원하는 말했다 #down높이로 #container높이 마이너스 #up높이입니다. display:table;솔루션은 정확히 않는 및 이 jsfiddle은 꽤 명확하게 묘사합니다.


1
나는 #container 높이를 초과하는 #down 싶지 않아
알바

방금 알아 챘어요. 에 추가 overflow:hidden하여 추가 콘텐츠를 숨길 수 있습니다 .
Josh Mein

1
MrSlayer에게 말한 내용을 복사 / 붙여 넣기하겠습니다. #down을 #container height-#up height로 지정하고 싶습니다. 그래서 숨겨진 오버플로는 내가 찾고있는 것이 아닙니다. 또한 절대 위치를 사용하고 싶지 않습니다. 감사!
Alvaro

이 문제는 예제에서 두 div를 되 돌리면 녹색 div가 외부에 있다는 것입니다.
Ced

이것은 질문에 전혀 대답하지 않습니다. "나머지 높이를 모두 차지하려면"이라고되어 ​​있는데,이 이벤트가 나머지 높이를 모두 차지하더라도 오버플로가 발생합니다.
Giridhar Karnik

1

콘텐츠를 아래로 밀기 위해 부동을 사용할 수 있습니다.

http://jsfiddle.net/S8g4E/5/

고정 크기 컨테이너가 있습니다.

#container {
    width: 300px; height: 300px;
}

콘텐츠는 플로트 옆에 흐를 수 있습니다. float를 전체 너비로 설정하지 않는 한 :

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

동안 #up#down상단 위치를 공유 #down의 내용 만 떠 하단 후에 시작할 수 있습니다 #up:

#down {
    height:100%;
}​

#up사실의 상단 부분 커버 #down: jsfiddle.net/thirtydot/S8g4E/9을
thirtydot

예, 그렇게 작동합니다. 그러나 OP에 둥근 테두리 또는 다른 공상이 필요하지 않다면 #up아마도 받아 들일 수 있습니다.
biziclop 2012-06-27

이 솔루션은 가깝지만 #down은 #container height-#up height로하고 싶습니다. (솔루션에서 #down height = #container height). 감사합니다 '
Alvaro

1
@Alvaro : 왜 그렇게해야합니까? 이 솔루션 환상 일지라도 대부분의 경우 올바르게 보입니다 .
thirtydot

음,이 질문은 좀 더 "복잡한"예제에서 단순화 된 예제입니다 : jsfiddle.net/fyNX4 작동하지 않을까요?
Alvaro

1

요약

완전히 만족스러운 답을 찾지 못해서 직접 찾아야했습니다.

내 요구 사항 :

  • 요소는 콘텐츠 크기나머지 공간 크기 보다 작거나 클 때 나머지 공간 을 정확히 차지해야 합니다 (두 번째 경우 스크롤바표시 되어야 ).
  • 솔루션은 부모 높이가 계산 되고 지정되지 않을 때 작동 합니다 .
  • calc()나머지 요소 다른 요소 크기에 대해 알 수 없으므로 사용 해서는 안됩니다 .
  • flexbox 와 같은 현대 적이고 친숙한 레이아웃 기술을 사용해야합니다.

해결책

  • flexboxes로 돌려 계산 높이 (있는 경우) 모든 직접 부모높이가 지정되어 다음 부모 ;
  • 계산 된 높이 (있는 경우)요소flex-grow: 1 가있는 모든 직계 부모에 지정 하여 요소 콘텐츠 크기가 더 작을 때 나머지 공간을 모두 차지하도록 지정합니다.
  • 요소 콘텐츠 크기가 나머지 공간 크기보다 클 때 더 작아지지 않도록 높이가 고정 된 모든 플렉스 항목에 지정 flex-shrink: 0합니다 .
  • 스크롤을 비활성화하고 오버플로 콘텐츠 표시를 금지하려면 계산 된 높이 (있는 경우)있는 모든 직계 부모에 지정 overflow: hidden합니다 .
  • 지정 overflow: auto요소 안에 스크롤을 가능하게 할 수 있습니다.

JSFiddle (요소에는 계산 된 높이가있는 직접 부모가 있음)

JSFiddle (단순한 경우 : 계산 된 높이가있는 직접 부모 없음)


-3

환상으로 속이는 것이 편하지 않다면 CSS로만 할 수 있을지 모르겠습니다. Josh Mein의 대답을 사용 #container하고 overflow:hidden.

그만한 가치를 위해 다음은 jQuery 솔루션입니다.

var contH = $('#container').height(),
upH = $('#up').height();
$('#down').css('height' , contH - upH);

감사합니다 순수한 CSS 솔루션을 찾고있었습니다.
Alvaro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.