IE에서 Flexbox가 세로로 가운데에 있지 않음


116

페이지 중앙에 일부 Lipsum 콘텐츠가있는 간단한 웹 페이지가 있습니다. 이 페이지는 Chrome 및 Firefox에서 제대로 작동합니다. 창 크기를 줄이면 콘텐츠가 창을 채울 수 없을 때까지 창을 채운 다음 스크롤 막대를 추가하고 화면에서 아래쪽으로 콘텐츠를 채 웁니다.

그러나 페이지는 IE11에서 중앙에 있지 않습니다. 본문을 구부리면 페이지가 IE의 중앙에 오도록 할 수 있지만 그렇게하면 콘텐츠가 화면에서 위쪽으로 이동하기 시작하고 콘텐츠의 위쪽이 잘립니다.

다음은 두 가지 시나리오입니다. 관련 Fiddles를 참조하십시오. 문제가 즉시 분명하지 않으면 결과 창의 크기를 줄여서 강제로 스크롤 막대를 생성하도록합니다.

참고 :이 애플리케이션은 최신 버전의 Firefox, Chrome 및 IE (IE11)만을 대상으로하며, 모두 Flexbox후보 권장 사항을 지원 하므로 기능 호환성이 문제가되지 않아야합니다 (이론상).

편집 : 전체 화면 API를 사용하여 외부 div를 전체 화면으로 표시하면 모든 브라우저가 원본 CSS를 사용하여 올바르게 가운데에 배치됩니다. 그러나 전체 화면 모드를 종료하면 IE는 다시 가로로 가운데 정렬되고 세로로 위쪽으로 정렬됩니다.

편집 : IE11은 공급 업체가 아닌 Flexbox 구현을 사용합니다. 유연한 상자 ( "Flexbox") 레이아웃 업데이트


Chrome / FF에서 중심 및 크기가 올바르게 조정되고, 중심이 아닌 IE11에서 올바르게 크기 조정 됨

바이올린 : http://jsfiddle.net/Dragonseer/3D6vw/

html, body
{
    height: 100%;
    width: 100%;
}

body
{
    margin: 0;
}

.outer
{
    min-width: 100%;
    min-height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
}

.inner
{
    width: 80%;
}

모든 위치에 올바르게 중앙, 크기가 작을 때 상단이 잘림

바이올린 : http://jsfiddle.net/Dragonseer/5CxAy/

html, body
{
    height: 100%;
    width: 100%;
}

body
{
    margin: 0;
    display: flex;
}

.outer
{
    min-width: 100%;
    min-height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
}

.inner
{
    width: 80%;
}

현재 IE11에 액세스 할 수 없습니다.이 솔루션을 사용해 보셨습니까 ? stackoverflow.com/questions/16122341/… ?
cimmanon

margin : auto는 차이가없는 것 같습니다.
Dragonseer

항상 IE가 처리 할 무언가 (많은 고유 한 버그)를 가지고 있기 때문에 Microsoft는 공식적으로 릴리스 할 때 버그가 하나 적어 질 것입니다.
MarmiK

당신은 사용할 필요가 -ms-flexbox... IE를 위해
avrahamcool

IE11은 display : flex의 현재 Flexbox 표준을 사용합니다. msdn.microsoft.com/en-us/library/ie/dn265027(v=vs.85).aspx . 어쨌든 나는 그것을 시도했지만 차이를 만들지 않았습니다. 콘텐츠는 여전히 상단 정렬입니다. 또한 전체 화면 일 때 외부 div가 올바르게 가운데에 있지만 전체 화면을 벗어날 때 상단 정렬된다는 원래 질문의 수정 사항에 유의하십시오.
Dragonseer

답변:


225

즉, 최소 높이 스타일 만 설정되었거나 높이 스타일이 전혀없는 경우 브라우저가 내부 컨테이너를 세로로 정렬하는 데 문제가 있음을 발견했습니다. 내가 한 일은 약간의 가치를 지닌 높이 스타일을 추가하고 문제를 해결하는 것이 었습니다.

예 :

.outer
    {
       display: -ms-flexbox;
       display: -webkit-flex;
       display: flex;

       /* Center vertically */
       align-items: center;

       /*Center horizontaly */
       justify-content: center;

       /*Center horizontaly ie */
       -ms-flex-pack: center;

        min-height: 220px; 
        height:100px;
    }

이제 높이 스타일이 있지만 최소 높이가이를 덮어 씁니다. 그렇게하면 행복하고 우리는 여전히 min-height를 사용할 수 있습니다.

이것이 누군가에게 도움이되기를 바랍니다.


9
-ms-flex-align:center;IE10을 잊지 마세요 . 에 대한 지원 align-items은 IE11에서만 추가되었습니다 .
Boaz

아! 몇 달 후 이것은 저를 구했습니다. min-height 대신 높이를 설정하는 것이 효과적이었습니다.
피트

확인 @KaloyanStamatov autoprefixer 도움이 성가신 크로스 브라우저 문제의 면하게.
hitautodestruct 2015

29
이 솔루션은 콘텐츠가 최소 높이보다 크면 작동하지 않습니다. 은 min-height참으로 무시 않는 height규칙을하지만, 내용이을 초과하는 경우 min-height단순히 경계의 외측에 확장됩니다. @ericodes답변은 이 문제를 해결하며 솔루션은 flex를 지원하는 모든 브라우저에서 작동합니다.
lachie_h

2
2019 년 이후에 여기에 오는 모든 사람을위한 최고의 솔루션은 @ sergey-fedirko가 추가 HTML 요소와 하드 높이를 필요로하지 않는 것입니다.) This one : stackoverflow.com/a/54796082/134120
AsGoodAsItGets

71

flexboxed flex-direction: column컨테이너에 flexboxed div를 래핑하십시오 .

방금 IE11에서 테스트했으며 작동합니다. 이상한 수정이지만 Microsoft가 내부 버그 수정을 외부로 만들기 전까지는해야합니다!

HTML :

<div class="FlexContainerWrapper">
    <div class="FlexContainer">
        <div class="FlexItem">
            <p>I should be centered.</p>
        </div>
    </div>
</div>

CSS :

html, body {
  height: 100%;
}

.FlexContainerWrapper {
  display: flex;
  flex-direction: column;
  height: 100%;
}

.FlexContainer {
  align-items: center;
  background: hsla(0,0%,0%,.1);
  display: flex;
  flex-direction: column;
  justify-content: center;
  min-height: 100%;
  width: 600px;
}

.FlexItem {
  background: hsla(0,0%,0%,.1);
  box-sizing: border-box;
  max-width: 100%;
}

IE11에서 테스트 할 수있는 2 가지 예 : http://codepen.io/philipwalton/pen/JdvdJE http://codepen.io/chriswrightdesign/pen/emQNGZ/


1
문제를 해결하는 데 사용한 코드를 외부 URL에 연결하는 대신 실제 답변에 게시해야합니다. 그러면 링크가 끊어진 후에도 귀하의 답변이 계속 도움이 될 것입니다.
Kelly Keller-Heikkila

11
이것이 바로이 버그에 대한 최상의 솔루션입니다. 다른 모든 답변은 컨테이너의 고정 높이를 제안하며 콘텐츠가 가변 높이이면 작동하지 않습니다. 이 솔루션을 사용하면 min-height엄격한 height규칙 대신를 사용할 수 있으며 display: flex.
lachie_h

1
그냥 display:flex어쩌면 래퍼에 필요하고, 둘 중 하나 자식이 중 : width: 100% flex-basis:100% flex-grow:1콘텐츠 / 스타일에 따라.
fregante

이 해결 방법은 FlexContainerWrapper 속성 align-items이 설정된 경우 작동하지 않습니다 . 이 속성이없는 플렉스 박스로 원래 플렉스 박스를 래핑해야합니다.
Marcus Krahl

안녕 @MarcusKrahl! 원래 flexbox (FlexContainer)를 align-items속성이 없는 flexbox (FlexContainerWrapper)로 감싸라는 말입니까?
ericodes

10

내 작업 솔루션 (SCSS)은 다음과 같습니다.

.item{
  display: flex;
  justify-content: space-between;
  align-items: center;
  min-height: 120px;
  &:after{
    content:'';
    min-height:inherit;
    font-size:0;
  }
}

6

누군가가 내가 가진 것과 동일한 문제로 여기에 올 경우를 대비하여 이전 의견에서 구체적으로 다루지 않았습니다.

나는 margin: auto그것이 부모 (또는 외부 요소)의 바닥에 달라 붙도록 내부 요소를 가졌 습니다. 나를 위해 그것을 고친 것은 여백을 margin: 0 auto;.


5

이것은 Microsoft에서 내부적으로 수정 된 것으로 보이는 알려진 버그입니다.

https://connect.microsoft.com/IE/feedback/details/802625/min-height-and-flexbox-flex-direction-column-dont-work-together-in-ie-10-11-preview


43
하지만 외부에서 수정되지 않은 것 같습니다.
Blazemonger 2015 년

4
"이 문제는 Microsoft Edge에서 수정 된 것으로 보입니다. 현재 보안 관련 문제 외에 Internet Explorer의 기능 버그에 대해 작업하고 있지 않습니다." 그들은 IE pre-Edge 버전에 대한 문제를 종결했습니다
David Zulaica

1
해결책은 가능한 경우 최소 높이 대신 높이를 사용하는 것 같습니다.
frodo2975


3

두 바이올린을 모두 업데이트했습니다. 나는 그것이 당신의 일을 끝내기를 바랍니다.

센터링

    html, body
{
    height: 100%;
    width: 100%;
}

body
{
    margin: 0;
}

.outer
{
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
}

.inner
{
    width: 80%;
    margin: 0 auto;
}

중앙 및 스크롤

html, body
    {
        height: 100%;
        width: 100%;
    }

    body
    {
        margin: 0;
        display:flex;
    }

    .outer
    {
        min-width: 100%;  
        display: flex;
        align-items: center;
        justify-content: center;
    }

    .inner
    {
        width: 80%;
    margin-top:40px;
    margin: 0 auto;
    }

입력 해 주셔서 감사합니다. 불행히도 귀하의 Fiddles는 Chrome 또는 IE11에서 작동하지 않는 것 같습니다. 센터링 예제는 더 이상 Chrome에서 중앙에 위치하지 않으며 중앙 및 스크롤 예제는 IE11에서 중앙에 있지 않고 여전히 콘텐츠를 잘립니다.
Dragonseer

1

나는 경험이 많지 Flexbox않지만 강제 높이 htmlbody 태그 인해 크기를 조정할 때 텍스트가 맨 위에 사라지는 것 같습니다 .IE에서 테스트 할 수 없었지만 Chrome에서 동일한 효과를 발견했습니다.

나는 당신의 바이올린을 포크하고 heightwidth선언을 제거했습니다 .

body
{
    margin: 0;
}

그것은 또한처럼 보였다 flex다른 flex요소 에도 설정을 적용해야하는 . 그러나 적용 display: flex받는 .inner인해 발생하는 문제 나 명시 적으로 설정할 수 있도록 .innerdisplay: block하고, 설정 .outerflex 위치합니다.

.outer뷰포트를 채우기 위한 최소 높이 display: flex,를 설정하고 수평 및 수직 정렬을 설정합니다.

.outer
{
    display:flex;
    min-height: 100%;
    min-height: 100vh;
    align-items: center;
    justify-content: center;
}

명시 적으로 설정 .inner했습니다 display: block. 이 상속처럼 크롬, 그것은 모습 flex에서 .outer. 너비도 설정했습니다.

.inner
{
    display:block;
    width: 80%;
}

이것은 Chrome의 문제를 해결했으며 IE11에서도 동일하게 수행되기를 바랍니다. 내 버전의 바이올린은 다음과 같습니다. http://jsfiddle.net/ToddT/5CxAy/21/


답장을 보내 주셔서 감사합니다. 높이 및 너비 선언은 IE에서 세로 중앙에 필요합니다. 그것 없이는 콘텐츠가 더 이상 IE11의 중심에 있지 않습니다.
Dragonseer

외부 div에 높이가 설정되어 있어도? 몸에 최소 높이를 추가할까요?
Todd

1

나를 위해 일한 좋은 해결책을 찾았습니다.이 링크를 확인하십시오 https://codepen.io/chriswrightdesign/pen/emQNGZ/?editors=1100 먼저 부모 div를 추가하고 두 번째로 min-height : 100 %를 min- 높이 : 100vh. 매력처럼 작동합니다.

// by having a parent with flex-direction:row, 
// the min-height bug in IE doesn't stick around.
.flashy-content-outer { 
    display:flex;
    flex-direction:row;
}
.flashy-content-inner {
    display:flex;
    flex-direction:column;
    justify-content:center;
    align-items:center;
    min-width:100vw;
    min-height:100vh;
    padding:20px;
    box-sizing:border-box;
}
.flashy-content {
    display:inline-block;
    padding:15px;
    background:#fff;
}  

0

부모의 너비와 높이를 정의 할 수 있다면 컨테이너를 만들지 않고도 이미지를 중앙 집중화 할 수있는 더 간단한 방법이 있습니다.

어떤 이유로 최소 너비를 정의하면 IE는 최대 너비도 인식합니다.

이 솔루션은 IE10 +, Firefox 및 Chrome에서 작동합니다.

<div>
  <img src="http://placehold.it/350x150"/>
</div>

div {
    display: -ms-flexbox;
    display: flex;
    -ms-flex-pack: center;
    justify-content: center;
    -ms-flex-align: center;
    align-items: center;
    border: 1px solid orange;
    width: 100px;
    height: 100px;
}

img{
  min-width: 10%;
  max-width: 100%;
  min-height: 10%;
  max-height: 100%;
}

https://jsfiddle.net/HumbertoMendes/t13dzsmn/

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