Flexbox, IE'de Dikey Olarak Ortalamıyor


116

Sayfada ortalanmış bazı Lipsum içeriğine sahip basit bir web sayfam var. Sayfa, Chrome ve Firefox'ta iyi çalışıyor. Pencerenin boyutunu küçültürsem, içerik pencereyi kapayana kadar doldurur ve ardından bir kaydırma çubuğu ekleyip içeriği ekranın dışına, aşağıya doğru doldurur.

Ancak, sayfa IE11'de ortalanmıyor. Gövdeyi esneterek sayfanın IE'de ortalanmasını sağlayabilirim, ancak bunu yaparsam, içerik ekrandan yukarıya doğru çıkmaya başlar ve içeriğin üst kısmını keser.

Aşağıda iki senaryo bulunmaktadır. İlgili Fiddles'a bakın. Sorun hemen ortaya çıkmazsa, sonuç penceresinin boyutunu küçültün, böylece bir kaydırma çubuğu oluşturmaya zorlanır.

Not: Bu uygulama yalnızca Firefox, Chrome ve IE'nin (IE11) en son sürümlerini hedefler ve bunların tümü Flexbox'ın Aday Önerisini destekler , bu nedenle özellik uyumluluğu bir sorun olmamalıdır (teoride).

Düzenleme : Dış div'i tam ekran için Tam Ekran API'sini kullanırken, tüm tarayıcılar orijinal CSS'yi kullanarak doğru şekilde ortalanır. Ancak, tam ekran modundan çıktıktan sonra IE, yatay olarak ortalanmış ve dikey olarak üste hizalanmış duruma geri döner.

Düzenleme : IE11, Flexbox'ın satıcıya özel olmayan uygulamasını kullanır. Esnek kutu ("Flexbox") düzeni güncellemeleri


Chrome / FF'de Doğru Şekilde Merkezler ve Yeniden Boyutlandırır, IE11'de Ortalamıyor Ancak Doğru Şekilde Yeniden Boyutlandırılıyor

Keman: 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%;
}

Her Yerde Doğru Şekilde Merkezlenir, Küçük Boyutta Üstü Keser

Keman: 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%;
}

Şu anda IE11'e erişimim yok, bu çözümü denediniz mi : stackoverflow.com/questions/16122341/… ?
cimmanon

margin: auto bir fark yaratmış gibi görünmüyor.
Dragonseer

Lütfen Microsoft'a hata
bildirin

-ms-flexboxIE için kullanmanız gerekiyor ..
avrahamcool

IE11, mevcut Flexbox görüntüleme standardını kullanır: flex. msdn.microsoft.com/en-us/library/ie/dn265027(v=vs.85).aspx . Yine de denedim ve bir fark yaratmadı; içerik hala üst hizada. Ayrıca, dış div'in tam ekran olduğunda doğru şekilde ortalandığını, ancak tam ekrandayken üste hizalandığını belirten orijinal sorudaki düzenlememe lütfen dikkat edin.
Dragonseer

Yanıtlar:


225

Yani tarayıcının, yalnızca minimum yükseklik stili ayarlandığında veya yükseklik stili eksik olduğunda, iç kapları dikey olarak hizalamakta sorun yaşadığını buldum. Yaptığım şey, bir değerle yükseklik stili eklemekti ve bu benim için sorunu çözmekti.

Örneğin :

.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;
    }

Şimdi yükseklik stilimiz var, ancak minimum yükseklik bunun üzerine yazacak. Bu şekilde ie mutlu olur ve yine de min-yüksekliği kullanabiliriz.

Umarım bu birisi için yararlıdır.


9
-ms-flex-align:center;IE10'u unutmayın . Desteği align-itemsyalnızca IE11'de eklendi .
Boaz

Ah! çok aylar sonra bu beni kurtardı - minimum yükseklik yerine bir yükseklik ayarı işe yaradı.
Pete

@KaloyanStamatov Otomatik düzelticiye göz atın ve bu can sıkıcı tarayıcılar arası sorunlardan kurtulmanıza yardımcı olun.
hitautodestruct

29
Bu çözüm, içerik minimum yükseklikten daha büyük olduğunda çalışmaz. min-heightGerçekten geçersiz kılıyor heightkuralı, ancak içerik aşarsa min-heightbasitçe sınırlarının dışına taşacak. @Ericodes tarafından cevap bu sorunu çözer ve çözüm destek esnek tüm tarayıcılarda çalışır.
lachie_h

2
2019'da veya daha sonra buraya gelen herkes için en iyi çözüm, @ sergey-fedirko'nun fazladan HTML öğesi ve sert yükseklik gerektirmeyen çözümüdür;) Bu: stackoverflow.com/a/54796082/134120
AsGoodAsItGets

71

Flexbox'ladığınız div ne olursa olsun flex-direction: column, aynı zamanda flexbox'lı bir kapta sarmayı deneyin.

Bunu IE11'de test ettim ve işe yarıyor. Garip bir düzeltme, ancak Microsoft dahili hata düzeltmesini harici yapana kadar ... bunu yapmak zorunda kalacak!

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'de test edebileceğiniz 2 örnek: http://codepen.io/philipwalton/pen/JdvdJE http://codepen.io/chriswrightdesign/pen/emQNGZ/


1
Harici bir URL'ye bağlantı vermek yerine, sorunu çözmek için kullandığınız kodu gerçek cevabınızda yayınlamalısınız. Bu durumda, bağlantınız öldükten sonra bile yanıtınız yardımcı olmaya devam edecektir.
Kelly Keller-Heikkila

11
Bu, bu hataya açık ara en iyi çözümdür. Diğer tüm yanıtlar, kapsayıcı üzerinde sabit bir yükseklik önermektedir; bu, içerik değişken yükseklikteyse çalışmaz. Bu çözüm, min-heightsert bir heightkural yerine kullanımına izin verirken, yine de kullanımını destekleyen tüm tarayıcılarda dikey olarak ortalanır display: flex.
lachie_h

1
Sadece display:flexpaketleyicide gereklidir ve belki de bunlardan biri çocukta: width: 100% flex-basis:100% flex-grow:1içeriğinize / stilinize bağlı olarak.
fregante

FlexContainerWrapper özelliği align-itemsayarlandıysa bu geçici çözüm çalışmaz . Orijinal flexbox'ı bu özellik olmadan bir flexbox ile sarmalısınız.
Marcus Krahl

hey @MarcusKrahl! orijinal flexbox'ı (FlexContainer) bir align-itemsözelliği olmayan bir flexbox (FlexContainerWrapper) ile sarmayı mı söylüyorsunuz ?
ericodes

10

İşte benim çalışma çözümüm (SCSS):

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

6

Sadece birisinin buraya benimle aynı sorunla gelmesi durumunda, ki bu önceki yorumlarda özellikle ele alınmamış.

Ben margin: auto's üst sayfanın alt (veya dış eleman) için sopa buna neden iç elemana. Benim için düzelten şey, marjı olarak değiştirmekti margin: 0 auto;.


5

43
Görünüşe göre dışarıdan sabitlenmemiş.
Blazemonger

4
"Bu sorun Microsoft Edge'de düzeltilmiş görünüyor. Şu anda güvenlikle ilgili sorunlar dışında Internet Explorer'daki özellik hataları üzerinde çalışmıyoruz." IE ön-Edge sürümleri için sorunu kapattılar
David Zulaica

1
Mümkünse çözüm, minimum yükseklik yerine yükseklik kullanmak gibi görünüyor.
frodo2975


3

Her iki keman da güncelledim. Umarım işinizi halleder.

merkezleme

    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;
}

ortala ve kaydır

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;
    }

Girdiğiniz için teşekkürler. Maalesef, Fiddles'ınız Chrome veya IE11'de çalışmıyor. Merkezleme örneği artık Chrome'da ortalanmıyor ve merkez ve kaydırma örneği IE11'de ortalanmıyor ve yine de içeriği kesiyor.
Dragonseer

1

Çok fazla deneyimim yok Flexboxama bana öyle geliyor ki htmlve bodyetiketlerindeki zorunlu yükseklik, yeniden boyutlandırıldığında metnin üstte kaybolmasına neden oluyor - IE'de test edemedim, ancak aynı etkiyi Chrome'da buldum.

Kemancınızı çatalladım ve heightve widthbeyanları kaldırdım .

body
{
    margin: 0;
}

Ayrıca flexayarların diğer flexöğelere de uygulanması gerekiyordu . Ancak, uygulamadan display: flexiçin .innerneden konularda açıkça belirlenen bu yüzden .inneretmek display: blockve set .outeriçin flexkonumlandırma için.

.outerGörüntü alanını doldurmak için minimum yüksekliği display: flexve yatay ve dikey hizalamayı ayarladım:

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

Ben ayarlamak .inneriçin display: blockaçıkça. Chrome'da, miras flexalınmış gibi görünüyordu .outer. Ayrıca genişliği de ayarladım:

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

Bu, Chrome'daki sorunu çözdü, umarım aynısını IE11'de de yapabilir. İşte keman versiyonum: http://jsfiddle.net/ToddT/5CxAy/21/


Cevabın için teşekkürler. Yükseklik ve genişlik bildirimi, IE'de dikey olarak ortalamak için gereklidir. Bu olmadan içerik artık IE11'de ortalanmaz.
Dragonseer

Dış bölmede yükseklik ayarlanmış olsa bile mi? Belki vücuda bir min-yükseklik ekleyin?
Todd

1

Benim için işe yarayan iyi bir çözüm buldum, bu bağlantıyı kontrol edin https://codepen.io/chriswrightdesign/pen/emQNGZ/?editors=1100 İlk olarak, bir üst div ekliyoruz, ikinci olarak min-yüksekliği değiştiriyoruz:% 100 min- yüksekliği: 100vh. Mucizevi şekilde çalışır.

// 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

Ebeveynin genişliğini ve yüksekliğini tanımlayabilirseniz, bunun için bir kap oluşturmak zorunda kalmadan görüntüyü merkezileştirmenin daha basit bir yolu vardır.

Bazı nedenlerden dolayı, min-genişliği tanımlarsanız, IE de maks-genişliği tanıyacaktır.

Bu çözüm IE10 +, Firefox ve Chrome için çalışıyor.

<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/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.