Flexbox 어린이를 부모의 100 % 키로 만들려면 어떻게해야합니까?


458

Flexbox 내부의 Flex 항목의 수직 공간을 채우려 고합니다.

.container {
  height: 200px;
  width: 500px;
  display: flex;
  flex-direction: row;
}
.flex-1 {
  width: 100px;
  background-color: blue;
}
.flex-2 {
  position: relative;
  flex: 1;
  background-color: red;
}
.flex-2-child {
  height: 100%;
  width: 100%;
  background-color: green;
}
<div class="container">
  <div class="flex-1"></div>
  <div class="flex-2">
    <div class="flex-2-child"></div>
  </div>
</div>

그리고 여기 JSFiddle이 있습니다

flex-2-child 다음 두 경우를 제외하고 필요한 높이를 채우지 않습니다.

  1. flex-2 높이가 100 %입니다 (플렉스 항목에 기본적으로 100 %가 + Chrome에서 버그가 있기 때문에 이상합니다)
  2. flex-2-child 불편한 위치 절대 값을 가짐

현재 Chrome 또는 Firefox에서는 작동하지 않습니다.


높이를 사용할 때의 문제점은 무엇입니까 : 100 %; .flex-2의 경우?
rmagnum2002

그것은 내용 자체를 채우는 플렉스 아이템의 목적을 무시하고 창 크기를 조정할 때마다 높이가 0으로 돌아가는 크롬에서 가장 이상한 버그를줍니다.
Raz

3
실제로 최신 버전의 Firefox 만 제대로 작동합니다.
Raz

1
현재 flexbox에서 백분율 높이를 렌더링 할 때 브라우저마다 동작에 큰 차이가 있습니다. stackoverflow.com/a/35537510/3597276
Michael Benjamin

2
그러나 Chrome에는 특히 중첩 된 flexbox와 관련하여 몇 가지 문제가 있습니다. 예를 들어 자식이있는 중첩 된 플렉스 박스가 height:100%있지만 대신 자연 높이로 렌더링됩니다. 그리고 이상한 점은 높이를로 변경하면 내가 하려는 것처럼 auto렌더링 height:100%합니다. 그것이 작동하는 방식이라면 분명히 직관적이지 않습니다.
trusktr

답변:


236

사용하다 align-items: stretch

David Storey의 답변과 유사하게 내 해결 방법은 다음과 같습니다.

.flex-2 {
    display: flex;
    align-items: stretch;
}

또는 원하는 항목 에만 align-items사용할 수 있습니다 .align-self.flex-2-child


7
stretch: 이것은 정답입니다.
Dave Everitt

1
확실히 이것은 질문에 대한 최고의 답변입니다. 완벽하게 작동합니다.
marcias

그렇습니다. 이것은 실제로이 질문에 대한 최상의 답변입니다.
Øyvind Bråthen

20
height: 100%부모와 같은 높이를 원하는 어린이 구성 요소에서 제거하는 것을 잊지 마십시오
Ilham Wahabi GX

height: 100%대답을 제거하십시오 -거의 포기하고 되돌릴 때까지 마지막 순간에만 이것을 보았습니다 absolute-이것은 모든 종류의 문제와 함께 제공됩니다.
피터

274

나는 여기 비슷한 질문에 대답 했다 .

나는 당신이 이미 position: absolute;불편 하다고 말 했지만 작동합니다. 크기 조정 문제 해결에 대한 자세한 내용은 아래를 참조하십시오.

Chrome에서 열린 웹킷 접두사 만 추가했지만 데모는 이 jsFiddle 을 참조하십시오 .

기본적으로 두 가지 문제가 있으며 별도로 처리해야합니다.

  1. flex-item의 자식이 높이 100 %를 채우도록하기
    • position: relative;자녀의 부모에 설정하십시오 .
    • position: absolute;아이에게 설정하십시오 .
    • 그런 다음 필요에 따라 너비 / 높이를 설정할 수 있습니다 (샘플에서 100 %).
  2. Chrome에서 크기 조정 스크롤 "쿼크"수정
    • 넣어 overflow-y: auto;스크롤 DIV에.
    • 스크롤 가능한 div에는 명시적인 높이가 지정되어 있어야합니다. 내 샘플의 높이는 이미 100 %이지만 아직 적용되지 않은 경우 지정할 수 있습니다height: 0;

스크롤 문제에 대한 자세한 내용 은이 답변 을 참조하십시오 .


10
포인트 1)은 Chrome에서 완벽하게 작동하므로 Firefox는 절대 위치가 필요하지 않습니다.
yuri

223

올바르게 이해하면 빨간색 영역이 녹색으로 완전히 덮 이도록 flex-2-child가 부모의 높이와 너비를 채우도록 하시겠습니까?

그렇다면 flexbox를 사용하도록 flex-2를 설정하면됩니다.

.flex-2 {
    display: flex;  
}

그런 다음 flex-2-child에게 유연성을 갖도록 지시하십시오.

.flex-2-child {    
    flex: 1;
}

http://jsfiddle.net/2ZDuE/10/ 참조

그 이유는 flex-2-child는 flexbox 항목이 아니지만 그 상위 항목이기 때문입니다.


높이가 100 %이고 모든 어린이가 50/50 인 경우 어떻게합니까?
리키 레비

7
"align-items : center"를 사용하면 아이템의 높이가 동일 해 지므로이 픽스를 사용할 수 없습니다.
Neil Monroe

10
@NeilMonroe 한 아이에게만 사용 align-items: center하면 여전히 사용할 수 있습니다 align-self: stretch.
BT

1
안녕하세요 @David, 솔루션을 시도해 보았습니다. flex-direction : 행 레이아웃에 적합합니다. flex-direction : 열 레이아웃과 작동하지 않는 것 같습니다. 또는 코드에 잘못된 위치가 있습니다. 이 바이올린 jsfiddle.net/78o54Lmv 에서 내부 상자가 부모의 전체 높이를 차지하지 않는 이유를 확인하는 데 도움이 될 수 있습니까?
huan feng

작동 min-height: 100vh;하려면 .flex-2요소 에 추가 해야합니다. 도와 주셔서 감사합니다!
Tenaciousd9319

24

Chrome의 동작이 CSS 사양과보다 일관성이 있다고 가정합니다 (직관적이지는 않지만). 인 flexbox 사양에 따르면, 기본 stretchalign-self속성 변경 사항 만 사용되는 (요소의 "크로스 크기 속성"의를 height이 경우). 그리고 CSS2.1 spec을 이해함 에 따라 백분율 높이는 사용 된 값이 아닌 부모의 지정된 값 에서 계산됩니다 height. 부모의 지정된 값은 height플렉스 속성의 영향을받지 않으며 여전히 auto.

명시 적으로 설정을 height: 100%만드는 것은 그것을 공식적으로 가능한 단지 설정처럼, 아이의 비율 높이를 계산하기 height: 100%html가능의 비율을 높이 계산 할 수 bodyCSS2.1에 있습니다.


2
바로 그거죠! 이것을 실제로 적용하려면 단지 추가 height:100%.flex-2. 다음은 jsfiddle 입니다.
CourtDemone

7
Chrome의 동작은 Chrome 팀의 CSS 사양 해석 과 더 일치 합니다. 그것이 그렇게 해석 될 수는 있지만, 그것을 해석하는 훨씬 더 좋은 방법이 있습니다. 그들은 더 많은 것을 통해 생각했을 것입니다.
WraithKenny

1
@RickDoesburg, 이것은 1 년 전이지만 고정 높이 요소에 의지해야한다고 생각합니다. 이 브라우저가 함께 작동하기를 바랍니다. 나는 정말로 모바일 공간을 싫어하기 시작했다.
Jordan

1
세로 flexbox 컨테이너의 자식을 설정하면 height: 100%Chrome에서 매우 이상한 결과를 얻습니다 . 이로 인해 "지정된 높이"가 요소 자체의 높이가 아니라 컨테이너전체 높이 로 설정되어 다른 요소의 크기가 계산 될 때 원치 않는 스크롤 이 발생하는 것으로 보입니다 .
Jules

13

나는 스스로 해결책을 찾았다. 아래 CSS가 있다고 가정 해보십시오.

.parent {
  align-items: center;
  display: flex;
  justify-content: center;
}

.child {
  height: 100%; <- didn't work
}

이 경우 높이를 100 %로 설정하면 작동하지 않으므로 다음과 같이 margin-bottom규칙을 설정하십시오 auto.

.child {
  margin-bottom: auto;
}

자녀가 부모의 가장 위에 정렬되며 align-self원하는 경우 규칙 을 사용할 수도 있습니다 .

.child {
  align-self: flex-start;
}

좋은 해킹이지만 문제는 아이가 사이드 바이고 배경색이 있으면 여백 공간이 여전히 흰색입니다.
Boris Burkov

이 솔루션의 가장 큰 장점은 부모의 키가 동적 일 수 있다는 것입니다! 이전 솔루션에서는 부모의 높이가 설정되어 있어야합니다. 고마워
Bribbons

4

아이디어는 것 display:flex;과는 flex-direction: row;충전되어 container함께 DIV를 .flex-1하고 .flex-2있지만, 그 의미하지 않는 .flex-2기본을 가지고 height:100%;그것이 전체 높이로 확장되고 하위 요소 (가지고 있더라도 .flex-2-child으로) height:100%;당신이 부모를 설정해야합니다 height:100%;또는 사용 display:flex;flex-direction: row;상의 .flex-2DIV 너무.

내가 아는 display:flex것으로 모든 하위 요소 높이를 100 %로 확장하지는 않습니다.

작은 데모로 높이가 제거되어 http://jsfiddle.net/2ZDuE/3/ 에서 .flex-2-child사용 display:flex;되었습니다 .flex-2.


3

html

<div class="container">
    <div class="flex-1"></div>
    <div class="flex-2">
        <div class="flex-2-child"></div>
    </div>
</div>

CSS

.container {
    height: 200px;
    width: 500px;
    display: -moz-box;
    display: -webkit-flexbox;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: -moz-flex;
    display: flex;
    -webkit-flex-direction: row;
    -moz-flex-direction: row;
    -ms-flex-direction: row;
    flex-direction: row;
}
.flex-1 {
   flex:1 0 100px;
    background-color: blue;
}
.flex-2 {
    -moz-box-flex: 1;
    -webkit-flex: 1;
    -moz-flex: 1;
    -ms-flex: 1;
    flex: 1 0 100%;
    background-color: red;
}
.flex-2-child {
    flex: 1 0 100%;
    height:100%;
    background-color: green;
}

http://jsfiddle.net/2ZDuE/750/


0

이것은 align-self: stretch;우리가 스트레칭하고자하는 요소 로 해결할 수도 있습니다 .

때로는 flexbox 설정에서 하나의 항목 만 늘리는 것이 좋습니다.

.container {
  height: 200px;
  width: 500px;
  display: flex;
  flex-direction: row;
}
.flex-1 {
  width: 100px;
  background-color: blue;
}
.flex-2 {
  position: relative;
  flex: 1;
  align-self: stretch;
  background-color: red;
}
.flex-2-child {
  background-color: green;
}
<div class="container">
  <div class="flex-1"></div>
  <div class="flex-2">
    <div class="flex-2-child"></div>
  </div>
</div>


-7

.container {. . . . 아이템 정렬 : 스트레치; . . . . }


5
stackoverflow에 오신 것을 환영합니다. 답변과 기존 답변과 다른 답변에 대해 충분히 설명해야합니다.
Simon.SA

1
귀하의 답변은 BT와 같지만 (3 년 이상 일찍 작성 됨) 훨씬 더 나쁘게 표현되었습니다.
Quentin

-12

이것은 CSS를 사용하는 솔루션입니다.

우선 첫 번째 자식 (flex-1)이 100px 여야하면 flex가되어서는 안됩니다. 실제로 CSS + 에서는 유연하고 정적 인 요소 (열 또는 행)를 설정할 수 있으며 예제는 다음과 같이 쉽습니다.

<div class="container">
  <div class="EXTENDER">
    <div class="COLS">
      <div class="CELL _100px" style="background-color:blue">100px</div>
      <div class="CELL _FLEX" style="background-color:red">flex</div>
    </div>
  </div>
</div>

컨테이너 CSS :

.container {
    height: 200px;
    width: 500px;
    position:relative;
}

그리고 분명히 포함 CSS + 0.2 코어를 포함

바이올린 소리

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