플렉스 부모의 100 % 높이를 채우지 않는 Chrome / Safari


235

특정 높이의 세로 메뉴를 갖고 싶습니다.

각 자녀는 부모의 키를 채우고 가운데 정렬 된 텍스트를 가져야합니다.

아이들의 수는 무작위이므로 동적 값으로 작업해야합니다.

Div .container.item항상 부모의 키를 채워야 하는 임의의 수의 자식 ( )을 포함합니다 . 이를 달성하기 위해 flexbox를 사용했습니다.

텍스트가 중간에 정렬 된 링크를 만들려면 display: table-cell기술을 사용하고 있습니다. 그러나 테이블 디스플레이를 사용하려면 높이 100 %를 사용해야합니다.

내 문제는 .item-inner { height: 100% }웹킷 (Chrome)에서 작동하지 않는다는 것입니다.

  1. 이 문제에 대한 해결책이 있습니까?
  2. 또는 .item텍스트를 중간에 정렬하여 부모의 높이를 모두 채우는 다른 기술이 있습니까?

jsFiddle의 예는 Firefox 및 Chrome에서 볼 수 있습니다.

.container {
  height: 20em;
  display: flex;
  flex-direction: column;
  border: 5px solid black
}
.item {
  flex: 1;
  border-bottom: 1px solid white;
}
.item-inner {
  height: 100%;
  width: 100%;
  display: table;
}
a {
  background: orange;
  display: table-cell;
  vertical-align: middle;
}
<div class="container">
  <div class="item">
    <div class="item-inner">
      <a>Button</a>
    </div>
  </div>

  <div class="item">
    <div class="item-inner">
      <a>Button</a>
    </div>
  </div>

  <div class="item">
    <div class="item-inner">
      <a>Button</a>
    </div>
  </div>
</div>



3
이는 OP와 관련이 없지만 "사파리 디스플레이 절대 높이 100 %가 작동하지 않음"또는 이와 유사한 것으로 여기에 방문하는 Google 직원에게는 관련이있을 수 있습니다. 플렉스 컨테이너 안에 이와 같은 요소 가 있으며 예상대로 지정 top:0하고 left:0표시해야했습니다.
AlexMA

1
@vsync 님은 아직 수정되지 않았습니다 : stackoverflow.com/questions/46226298/…
TylerH

답변:


408

해결책

중첩 된 플렉스 컨테이너를 사용하십시오.

백분율 높이를 제거하십시오. 테이블 속성을 제거하십시오. 를 제거하십시오 vertical-align. 절대 위치를 피하십시오. flexbox를 계속 사용하십시오.

display: flex플렉스 품목 ( .item)에 적용 하여 플렉스 용기로 만듭니다. 그러면 자동으로 설정 align-items: stretch되어 자식 ( .item-inner)에게 부모의 전체 높이를 확장하도록 지시합니다 .

중요 :이 방법이 작동하려면 플렉스 아이템에서 지정된 높이를 제거하십시오. 어린이의 키가 지정된 경우 (예 height: 100%:) align-items: stretch부모로부터 오는 것을 무시합니다 . 를 들어 stretch작업에 기본적으로 아이의 높이에 계산해야한다 auto (자세한 설명 ).

이것을 시도하십시오 (HTML을 변경하지 마십시오) :

jsFiddle 데모


설명

내 문제는 .item-inner { height: 100% }웹킷 (Chrome)에서 작동하지 않는다는 것입니다.

전통적인 스펙 구현과 맞지 않는 방식으로 백분율 높이를 사용하고 있기 때문에 작동하지 않습니다.

10.5 내용 높이 : height속성

백분율
백분율 높이를 지정합니다. 백분율은 생성 된 상자를 포함하는 블록의 높이를 기준으로 계산됩니다. 포함하는 블록의 높이가 명시 적으로 지정되지 않고이 요소가 절대적으로 배치되지 않으면 값은로 계산됩니다 auto.

auto
높이는 다른 속성의 값에 따라 다릅니다.

다시 말해, 유입 아이에 대한 백분율 높이가 작동하려면 부모의 높이가 설정되어 있어야합니다 .

코드에서 최상위 컨테이너의 높이는 다음과 같습니다. .container { height: 20em; }

세 번째 레벨 컨테이너의 높이는 다음과 같습니다. .item-inner { height: 100%; }

그러나 그들 사이에, 두 번째 수준의 컨테이너 - .item- 하지 않는 정의 된 높이를 가지고있다. 웹킷은 링크가 누락 된 것으로 간주합니다.

.item-inner크롬을 말하고있다 : height: 100% . Chrome은 참조를 위해 부모 ( .item)를 찾아 응답합니다. 무엇의 100 %? 나는flex: 1 거기에 있는 규칙을 무시하고 아무것도 보이지 않습니다 . 결과적으로 height: auto사양에 따라 (컨텐츠 높이)가 적용됩니다 .

반면에 Firefox는 이제 자녀의 백분율 높이에 대한 참조로 부모의 플렉스 높이를 허용합니다. IE11과 Edge는 플렉스 높이도 수용합니다.

또한 Chrome은 ( 을 포함하여 모든 숫자 값이 작동하거나 작동 하지 않음) 과 함께 사용되는 경우flex-grow 적절한 부모 참조로 허용 됩니다 . 그러나이 글을 쓰는 시점에서이 솔루션은 Safari에서 실패합니다.flex-basisautoflex-basis: 0


네 가지 솔루션

1. 모든 부모 요소의 높이를 지정하십시오

신뢰할 수있는 브라우저 간 솔루션은 모든 부모 요소의 높이를 지정하는 것입니다. 이는 웹킷 기반 브라우저가 스펙 위반을 고려하는 누락 된 링크를 방지합니다.

그 참고 min-height하고 max-height허용되지 않습니다. height속성 이어야합니다 .

자세한 내용은 여기 : CSS height속성 및 백분율 값 작업

2. CSS 상대 및 절대 위치

position: relative부모와 position: absolute자녀에게 적용하십시오 .

크기와 어린이 height: 100%width: 100%, 또는 사용 오프셋 특성 : top: 0, right: 0, bottom: 0, left: 0.

절대 위치 지정을 사용하면 백분율 높이는 부모에서 지정된 높이없이 작동합니다.

3. 불필요한 HTML 컨테이너를 제거합니다 (권장).

주위에 두 개의 컨테이너가 필요 button합니까? 왜 제거하지 .item거나 .item-inner, 또는 둘 다? button요소는 때때로 플렉스 컨테이너로 실패 하지만 플렉스 항목 일 수 있습니다. 또는 button의 자녀를 만들고 무료 마크 업을 제거 하는 것을 고려하십시오 ..container.item

예를 들면 다음과 같습니다.

4. 중첩 된 Flex 컨테이너 (권장)

백분율 높이를 제거하십시오. 테이블 속성을 제거하십시오. 를 제거하십시오 vertical-align. 절대 위치를 피하십시오. flexbox를 계속 사용하십시오.

display: flex플렉스 품목 ( .item)에 적용 하여 플렉스 용기로 만듭니다. 그러면 자동으로 설정 align-items: stretch되어 자식 ( .item-inner)에게 부모의 전체 높이를 확장하도록 지시합니다 .

중요 :이 방법이 작동하려면 플렉스 아이템에서 지정된 높이를 제거하십시오. 어린이의 키가 지정된 경우 (예 height: 100%:) align-items: stretch부모로부터 오는 것을 무시합니다 . 를 들어 stretch작업에 기본적으로 아이의 높이에 계산해야한다 auto (자세한 설명 ).

이것을 시도하십시오 (HTML을 변경하지 마십시오) :

jsFiddle



이 위대한 포스트의 설명 링크에서 가져온 몇 가지 언급- "정렬 항목 : 스트레치"는 플렉스 어린이가 컨테이너의 가로 축을 가로 질러 확장되도록합니다. 즉, 어린이를 높이로 늘리려면 플렉스 컨테이너에 플렉스 방향이 있어야합니다. 행으로.
littlewhywhat

3
중첩 된 플렉스 컨테이너를 사용하는 것이 가장 효과적이라는 것을 확인할 수 있습니다. 우리는 메뉴에서 flexbox를 일관되게 사용하지 않았습니다. 부모 컨테이너에서 flex : 1 및 display : flex를 사용하는 대신 일부 위치에서 높이 : 100 %를 사용했습니다. 해당 정의를 교체 한 후 모든 것이 예상대로 작동했습니다. 힌트를 주셔서 감사합니다 @Michael_B! :)
flocbit

1
@JamesHarrington, CSS는 시간이 지남에 따라 커지고 복잡합니다 ;-)
DerMike

각 솔루션은 다른 답변이어야합니다. 이런 식으로 특정 솔루션에 투표하려면 어떻게해야합니까?
Jp_

14

해결 방법 : 제거 height: 100%.item - 내부 및 추가 display: flex.item

데모 : https://codepen.io/tronghiep92/pen/NvzVoo


고마워, 이것은 나를 도왔다. 플렉스 어린이는 용기 높이까지 자동으로 늘어나나요? 이것이 작동하는 이유입니까?
Reece Kenney

예, 귀하의 질문에 @ReeceKenney. 이것은 내 대답에 설명되어 있습니다. 솔루션 # 4를 참조하십시오.
Michael Benjamin

10

컨테이너에 flex 속성을 지정하면 나를 위해 일했습니다.

.container {
    flex: 0 0 auto;
}

이렇게하면 높이가 설정되고 커지지 않습니다.


6

Mobile Safari의 경우 브라우저 수정 사항이 있습니다. iOS 기기의 경우 -webkit-box 를 추가해야 합니다.

전의.

display: flex;
display: -webkit-box;
flex-direction: column;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-webkit-flex-direction: column;
align-items: stretch;

align-items: stretch;부모 요소에 속성을 사용 height : 100%하는 경우 자식 요소에서를 제거하십시오 .


2

iOS 8, 9 및 10에서 비슷한 문제가 발생하여 위의 정보로 해결할 수는 없지만 하루 동안 작업 한 후에 해결책을 찾았습니다. 모든 사람에게 적용되지는 않지만 내 경우에는 항목이 열에 쌓여 있고 높이가 0이어야했습니다. CSS를 행 및 줄 바꿈으로 전환하면 문제가 해결되었습니다. 단일 항목이 있고 누적 된 경우에만 작동하지만이를 찾는 데 하루가 걸렸으므로 수정 사항을 공유해야한다고 생각했습니다!

.wrapper {
    flex-direction: column; // <-- Remove this line
    flex-direction: row; // <-- replace it with
    flex-wrap: wrap; // <-- Add wrapping
}

.item {
    width: 100%;
}

0

비슷한 버그가 있었지만 백분율이 아닌 높이에 고정 숫자를 사용하는 동안. 또한 본체 내부의 플렉스 컨테이너였습니다 (특정 높이가 없음). Safari에서 내 플렉스 컨테이너의 높이가 어떤 이유로 9px 인 것처럼 보였지만 다른 모든 브라우저에서는 스타일 시트에 지정된 올바른 100px 높이를 표시했습니다.

CSS 클래스에 heightmin-height속성을 모두 추가하여 작동하도록했습니다 .

다음은 Safari 13.0.4 및 Chrome 79.0.3945.130에서 모두 효과적입니다.

.flex-container {
  display: flex;
  flex-direction: column;
  min-height: 100px;
  height: 100px;
}

도움이 되었기를 바랍니다!

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