부모의 부동 소수점 100 % 높이를 만드는 방법은 무엇입니까?


256

HTML은 다음과 같습니다.

<div id="outer">
    <div id="inner"></div>
    Test
</div>

그리고 여기 CSS가 있습니다 :

#inner {
  float: left;
  height: 100%;
}

Chrome 개발자 도구로 검사하면 내부 div의 높이가 0px입니다.

상위 div 높이의 100 %가되도록하려면 어떻게해야합니까?


1
따라서 외부 div (내부 div가 아닌)의 텍스트를 원하지만 플로팅 된 내부 div는 외부 div의 높이가됩니까?
edl

달성하려는 최종 결과는 무엇입니까? 내부 혼란이 외부만큼 높고 외부가 텍스트만큼 높으면 내부 div에 텍스트를 갖는 것과 동일하지 않은 것이 혼란 스럽습니다.
edl

2
@edl : 예, 그렇습니다 :) 내가 이것을 원하는 이유는 내부 div에 배경 이미지가 있기 때문입니다. 텍스트는 옆에 있어야합니다. 둘 다 배경 이미지가 있기 때문에 외부 div 안에 있어야합니다.
Nathan Osman 2016 년


2
이 질문에 대한 답을보고 시도하는 것은 매우 우울했습니다.
EternalHour

답변:


125

들면 #outer높이가 그 내용에 기초하고있는 것으로 #inner기재 그런의 높이를 절대 위치 두 요소를 만든다.

자세한 내용은 대한 사양에서 찾을 수 있습니다 CSS를 높이 속성 하지만, 본질적으로 #inner무시합니다 #outer경우 높이 #outer의 높이가 auto, 하지 않는 한 #outer 절대 위치한다. 그 자체가 절대 위치에 있지 않으면#inner 높이는 0이됩니다 . #inner

<style>
    #outer {
        position:absolute; 
        height:auto; width:200px; 
        border: 1px solid red; 
    }
    #inner {
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer'>
    <div id='inner'>
    </div>
    text
</div>

그러나 ... #inner절대적으로 배치 하면 float설정이 무시되므로 #inner명시 적으로 너비를 선택하고 #outer원하는 텍스트 줄 바꿈을 가짜로 채우기 위해 패딩을 추가 해야합니다. 예를 들어 아래에서 패딩은 #outer너비 #inner+3입니다. 편리하게 (전체 요점이 #inner100 % 에 도달 하기 #inner때문에) 아래 에 텍스트를 줄 바꿈 할 필요가 없으므로 #inner플로팅 된 것처럼 보입니다 .

<style>
    #outer2{
        padding-left: 23px;
        position:absolute; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2{
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
   }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
    text
</div>

목표에 대한 잘못된 가정이 너무 많기 때문에 이전 답변을 삭제했습니다.


118
흠 .. 문제는 Floated div에 관한 것이었다. 절대 위치 div에 대해 답변했습니다
Mihkel L.

57
이 글은 굉장히 간단한 일을 달성하는 것이 얼마나 복잡한 내가 놀랄 멈추지 않을 HTML/CSS:)
YURIY Nakonechnyy

15
너비를 하드 코딩하지 않고이를 수행 할 수있는 방법이 있습니까? 반응 형 컨테이너에는 적합하지 않습니다.
Jake Wilson

23
왜 이것이 받아 들여지고 많이 찬성되었는지 모르겠습니다. 문제는 float div에 관한 것입니다.이 검색에서 나를 여기로 데려온 것입니다. 대신이 위치는 절대적으로 위치한 div입니다.
Matt K

2
부유 식 컨테이너를 컨테이너에 수직으로 만드는 방법은 무엇입니까? 더 이상 떠 다니지 않음으로써! ㅋ. 시도해 보았고 실제로 유용하다고 생각 될 정도로 충분히 가까워졌습니다.
Rolf

124

부모의 경우 :

display: flex;

접두사를 추가해야합니다. http://css-tricks.com/using-flexbox/

편집 : 단점은 평소와 같이 IE 뿐이며 IE9는 flex를 지원하지 않습니다. http://caniuse.com/flexbox

편집 2 : @toddsby가 지적했듯이 정렬 항목은 부모를위한 것이며 기본값은 stretch 입니다. child에 다른 값을 원하면 자체 정렬 속성이 있습니다.

편집 3 : jsFiddle : https://jsfiddle.net/bv71tms5/2/


3
이것은 최신 브라우저에서만 작동하며 공급 업체 접두사가 필요하다는 점을 지적해야합니다.
kontur

12
원래 질문에 자식 div가 부동되고 모든 위치가 필요하다는 점을 감안할 때이 솔루션이 더 많은 관심을받지 못한 것에 놀랐습니다. 절대 솔루션은 실제로 부동을 사용하는 대부분의 상황에서 작업에 스패너를 던집니다. 이 솔루션은 position : absolute의 부작용이 문제가되지 않는 훌륭한 솔루션을 제공하며 조금 더 파고 싶을 경우 브라우저 간 호환성이 매우 뛰어납니다.
Luke

이것이 바로 여기에 대한 대답입니다. IE9는 곧 출시 될 예정입니다. 좋은 킥을 제공하면 도움이 될 것입니다. 이 솔루션은 매우 훌륭하고 간단하며 쉽습니다 ... 대체 솔루션을 함께 해킹했습니다. ;)
jrista

2
인 flexbox에 대한 가장 최근의 사양에 따르면 참조 w3.org/TR/css-flexbox-1/#align-items-property를 . align-items: stretch;기본값이므로 필요하지 않습니다. 또한 자식이 아닌 부모에 정의되어야합니다.
toddsby

1
답변에 바이올린을 추가했습니다. @Tigran
Aiphee

77

실제로 부모 요소가있는 한 자녀의 키를 100 %로 설정할 수 있습니다. 즉, 부모가 절대적으로 배치되기를 원하지 않는 경우. 더 설명하겠습니다 :

<style>
    #outer2 {
        padding-left: 23px;
        position: relative; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2 {
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
</div>

14
쿨, 이것은 채드윅의 요구 사항 position:absolute(사이트의 스타일을 방해 할 수 있음) 보다 덜 제한적입니다.
henry

3
그것은 단지 나일 수 있지만 사이드 바가 내용보다 크면 문제가 있습니다. 배경색은 부모 컨테이너에서 중지되지만 사이드 바 내용은 부모 외부에서 오버플로됩니다.
Howdy_McGee

이것은 훨씬 유연한 솔루션이며 여러 개의 부동 자식 요소가 있어도 오프셋 위치를 절대적으로 지정하는 데 허용되는 단점이 있습니다. +1
kontur

감사합니다 아주 많이. SO에 대한 다른 질문에 대한 답변으로 내 특정 솔루션을 게시했습니다 : stackoverflow.com/a/31749164/84661 .
Brian Haak

24

IE8 이전의 Internet Explorer 버전을 지원할 필요가없는 display: table-cell한이를 사용 하여 다음을 수행 할 수 있습니다 .

HTML :

<div class="outer">
    <div class="inner">
        <p>Menu or Whatever</p>
    </div>
    <div class="inner">
        <p>Page contents...</p>
    </div>
</div>

CSS :

.inner {
    display: table-cell;
}

이렇게하면 .inner클래스 가있는 각 요소가 부모 요소의 전체 높이를 차지하게됩니다.


이것이 효과가 있지만, 하나를 지정하더라도 여백이 표시되지 않습니다. 따라서 여백을 할당하려는 경우이 솔루션이 실패합니다. 패딩을 해결 방법으로 지정할 수 있지만 여백이 필요하고 패딩이 아닌 경우 어떻게 해결할 수 있습니까?
Devner

13
여기에 뭔가 빠졌습니까? 귀하의 질문에 플로팅 요소의 높이가 100 %가되도록 요청합니다. 떠 다니면 display: table-cell;요소가 컨테이너의 높이를 더 이상 채우지 않습니까? 나는 당신의 질문이기 때문에 뭔가를 놓치고 있어야합니다 ...?
user56reinstatemonica8

16

나는 당신의 문제 해결 하는 예를 만들었습니다 .

래퍼를 만들고 플로팅 한 다음 div의 절대 위치를 지정하고 높이를 100 % 부여해야합니다.

HTML

<div class="container">
    <div class="left">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." </div>
  <div class="right-wrapper">
    <div class="right">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." </div>
  </div>
  <div class="clear">&nbsp;</div>
</div>

CSS :

.container {
    width: 100%;
    position:relative;
}
.left {
    width: 50%;
    background-color: rgba(0, 0, 255, 0.6);
    float: left;
}
.right-wrapper {
    width: 48%;
    float: left;
}
.right {
    height: 100%;
    position: absolute;
}

설명 : .right div는 절대 위치에 있습니다. 즉, 너비 또는 높이 속성이 CSS에서 명시 적으로 선언 된 경우에만 너비 또는 높이와 상단 및 왼쪽 위치가 첫 번째 상위 div를 기준으로 절대 또는 상대 위치를 기준으로 계산됩니다. 명시 적으로 선언되지 않은 경우 해당 속성은 부모 컨테이너 (.right-wrapper)를 기준으로 계산됩니다.

따라서 DIV의 100 % 높이는 컨테이너 최종 높이를 기준으로 계산되며 오른쪽 위치의 최종 위치는 상위 컨테이너를 기준으로 계산됩니다.


1
이는 열의 내용이 열의 내용보다 짧다는 것을 보장 할 수있는 상황에 대한 확실한 솔루션입니다 . 예를 들어, 열에 가변 크기의 컨텐츠가 있고 오른쪽 열에 세부 사항 페이지에 대한 화살표 만 표시되는 구성 요소에서이를 사용하는 경우이 솔루션이 제대로 작동합니다. +1.right.left.left
Zachary Kniebel

15

이를 달성하는 가장 간단한 방법은 다음과 같습니다.

  1. 세 요소의 컨테이너 (#outer) 표시를 설정하십시오. table
  2. 그리고 요소 자체 (#inner) 표시를 설정하십시오 : table-cell
  3. 플로팅을 제거하십시오.
  4. 성공.
#outer{
    display: table;
}
#inner {
    display: table-cell;
    float: none;
}

Floated div의 @Itay 덕분에 높이 100 %


8

약간의 jQuery를 사용할 준비가 되었다면 대답은 간단합니다!

$(function() {
    $('.parent').find('.child').css('height', $('.parent').innerHeight());
});

이것은 일반적으로 단일 요소를 부모의 높이가 100 % 인면에 플로팅하는 데 효과적이며 일반적으로 감싸는 다른 플로팅 요소는 한쪽에 유지됩니다.

이것이 jQuery 팬들에게 도움이되기를 바랍니다.


18
이 레이아웃 문제에서 자바 스크립트를 던지는 것은 과도한 것으로 보입니다.
kontur

1
IE에서 개발해야하는 사람으로서 : 감사합니다!
Rook

1
약간 과잉 일 수도 있지만 이것은 아름다운 답변입니다. 감사합니다!
Martin

1
JS없이 모든 포지셔닝 문제를 해결해야한다는 데 동의합니다.
michaeluskov

1
JS AND jQuery 를 사용하는 것은 과잉입니다
ViliusL

3

높이가 동일한 그리드 시스템의 코드 샘플입니다.

#outer{
width: 100%;
margin-top: 1rem;
display: flex;
height:auto;
}

위의 외부 div에 대한 CSS는

#inner{
width: 20%;
float: left;
border: 1px solid;
}

위는 내부 사업부입니다

희망이 당신을 도울


1

이것은 나를 도왔다.

#outer {
    position:relative;
}
#inner {
    position:absolute;
    top:0;
    left:0px;
    right:0px;
    height:100%;
}

오른쪽 : 및 왼쪽 :을 변경하여 원하는 #inner width를 설정하십시오.


1

flexbox를 사용하여 동일한 높이를 가진 여러 하위 요소가 필요한 경우와 비슷한 경우가 있습니다.

https://css-tricks.com/using-flexbox/

display: flex;부모 및 flex: 1;자식 요소에 대해 설정 하면 모두 같은 높이를 갖습니다.


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