Flexbox ne se centre pas verticalement dans IE

116

J'ai une page Web simple avec du contenu Lipsum centré sur la page. La page fonctionne bien dans Chrome et Firefox. Si je réduis la taille de la fenêtre, le contenu remplit la fenêtre jusqu'à ce qu'il ne puisse pas, puis ajoute une barre de défilement et remplit le contenu hors de l'écran, vers le bas.

Cependant, la page n'est pas centrée dans IE11. Je peux centrer la page dans IE en fléchissant le corps, mais si je le fais, le contenu commence à sortir de l'écran vers le haut et coupe le haut du contenu.

Voici les deux scénarios. Voir les Fiddles associés. Si le problème n'est pas évident tout de suite, réduisez la taille de la fenêtre de résultats afin qu'elle soit obligée de générer une barre de défilement.

Remarque: cette application ne cible que les dernières versions de Firefox, Chrome et IE (IE11), qui prennent toutes en charge la recommandation candidate de Flexbox , la compatibilité des fonctionnalités ne devrait donc pas être un problème (en théorie).

Modifier : lorsque vous utilisez l'API Plein écran pour plein écran sur le div externe, tous les navigateurs centrent correctement en utilisant le CSS d'origine. Cependant, en quittant le mode plein écran, IE revient à être centré horizontalement et aligné verticalement en haut.

Edit : IE11 utilise une implémentation spécifique non-fournisseur de Flexbox. Mises à jour de la disposition de la boîte flexible («Flexbox»)


Centre et redimensionne correctement dans Chrome / FF, ne centre pas mais redimensionne correctement dans IE11

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

Centre correctement partout, coupe le haut lorsqu'il est redimensionné

Violon: 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%;
}
Dragonseer
la source
Je n'ai pas accès à IE11 pour le moment, avez-vous essayé cette solution: stackoverflow.com/questions/16122341/… ?
cimmanon
margin: auto ne semble pas avoir fait de différence.
Dragonseer
S'il vous plaît rapport de bogue Microsoft au moins ils auront un bogue de moins dans la version officielle, comme toujours IE aura quelque chose (beaucoup de bogues uniques) à gérer ..
MarmiK
vous devez utiliser -ms-flexboxpour IE ..
avrahamcool
IE11 utilise le standard d'affichage actuel de Flexbox: flex. msdn.microsoft.com/en-us/library/ie/dn265027(v=vs.85).aspx . Je l'ai essayé quand même et cela n'a pas fait de différence; le contenu est toujours aligné en haut. Veuillez également noter ma modification dans la question originale qui indique que la div externe se centre correctement lorsqu'elle est en plein écran mais qu'elle est alignée en haut lorsqu'elle n'est pas en plein écran.
Dragonseer

Réponses:

225

J'ai trouvé que le navigateur avait des problèmes pour aligner verticalement les conteneurs intérieurs, lorsque seul le style de hauteur minimale est défini ou lorsque le style de hauteur est absent du tout. Ce que j'ai fait, c'est d'ajouter un style de hauteur avec une certaine valeur et cela résout le problème pour moi.

par exemple :

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

Nous avons donc maintenant un style de hauteur, mais la hauteur min l'écrasera. De cette façon, c'est heureux et nous pouvons toujours utiliser min-height.

J'espère que cela est utile pour quelqu'un.

Kaloyan Stamatov
la source
9
N'oubliez pas -ms-flex-align:center;pour IE10. La prise en charge de a align-itemsété ajoutée uniquement dans IE11 .
Boaz
Ah! tant de mois plus tard, cela m'a sauvé - définir une hauteur au lieu de la hauteur minimale travaillée.
Pete
@KaloyanStamatov Consultez le préfixeur automatique et aidez-vous à vous débarrasser de ces ennuyeux problèmes de navigateur.
hitautodestruct
29
Cette solution ne fonctionne pas lorsque le contenu est plus grand que la hauteur minimale. Le min-heightremplace effectivement la heightrègle, mais si le contenu dépasse le, min-heightil s'étendra simplement en dehors des limites. La réponse de @ericodes résout ce problème et la solution fonctionne sur tous les navigateurs prenant en charge flex.
lachie_h
2
Pour tous ceux qui viennent ici en 2019 ou après 2019, la meilleure solution est de loin celle de @ sergey-fedirko ne nécessitant aucun élément HTML supplémentaire et aucune hauteur
précise
71

Essayez d'emballer tout div avec lequel vous avez flexboxed flex-direction: columndans un conteneur qui est également flexbox.

Je viens de tester cela dans IE11 et cela fonctionne. Un correctif étrange, mais jusqu'à ce que Microsoft rende sa correction de bogue interne externe ... il faudra le faire!

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

2 exemples à tester dans IE11: http://codepen.io/philipwalton/pen/JdvdJE http://codepen.io/chriswrightdesign/pen/emQNGZ/

ericodes
la source
1
Vous devez publier le code que vous avez utilisé pour résoudre le problème dans votre réponse réelle, plutôt qu'un lien vers une URL externe. Ensuite, votre réponse continuera d'être utile, même après la mort du lien.
Kelly Keller-Heikkila
11
C'est de loin la meilleure solution à ce bug. Toutes les autres réponses suggèrent une hauteur fixe sur le conteneur, ce qui ne fonctionne pas si le contenu est de hauteur variable. Cette solution permet d'utiliser min-heightau lieu d'une heightrègle stricte, tout en se centrant verticalement sur tous les navigateurs prenant en charge l'utilisation de display: flex.
lachie_h
1
Juste display:flexest nécessaire sur le wrapper, et peut-être l'un de ces deux sur l'enfant: en width: 100% flex-basis:100% flex-grow:1fonction de votre contenu / style.
fregante
cette solution de contournement ne fonctionne pas si la propriété FlexContainerWrapper align-itemsest définie. Vous devez envelopper la flexbox d'origine avec une flexbox sans cette propriété.
Marcus Krahl
hé @MarcusKrahl! voulez-vous envelopper la flexbox d'origine (FlexContainer) avec une flexbox sans align-itemspropriété (FlexContainerWrapper)?
ericodes le
10

Voici ma solution de travail (SCSS):

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

Juste au cas où quelqu'un arriverait ici avec le même problème que moi, qui n'est pas spécifiquement abordé dans les commentaires précédents.

J'avais margin: autosur l'élément intérieur qui l'a fait coller au bas de son parent (ou à l'élément extérieur). Ce qui a résolu le problème pour moi, c'est de changer la marge margin: 0 auto;.

Gal Talmor
la source
5

Il s'agit d'un bogue connu qui semble avoir été corrigé en interne chez Microsoft.

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

David Zulaica
la source
43
Cela n'a apparemment pas été corrigé à l'extérieur, cependant.
Blazemonger du
4
"Ce problème semble avoir été résolu dans Microsoft Edge. Nous ne travaillons actuellement pas sur des bogues de fonctionnalité dans Internet Explorer en dehors des problèmes de sécurité." Ils ont fermé le problème pour les versions d'IE pre-Edge
David Zulaica
1
La solution semble être d'utiliser la hauteur au lieu de la hauteur minimale, si vous le pouvez.
frodo2975
3

j'ai mis à jour les deux violons. j'espère que cela fera votre travail.

centrage

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

centre et défilement

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;
    }
Umar Khan
la source
Merci pour votre contribution. Malheureusement, vos Fiddles ne semblent pas fonctionner dans Chrome ou IE11. L'exemple de centrage n'est plus centré dans Chrome et l'exemple de centre et de défilement n'est pas centré dans IE11 et coupe toujours le contenu.
Dragonseer
1

Je n'ai pas beaucoup d'expérience avec, Flexboxmais il me semble que la hauteur forcée sur les balises htmlet bodyfait disparaître le texte en haut lors du redimensionnement - je n'ai pas pu tester dans IE mais j'ai trouvé le même effet dans Chrome.

J'ai bifurqué votre violon et enlevé les déclarations heightet width.

body
{
    margin: 0;
}

Il semblait également que les flexparamètres devaient être appliqués à d'autres flexéléments. Cependant, en appliquant display: flexaux .innerproblèmes causés, j'ai explicitement défini le .innersur display: blocket défini .outersur flexpour le positionnement.

J'ai défini la .outerhauteur minimale pour remplir la fenêtre, le display: flex, et définir l'alignement horizontal et vertical:

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

Je me suis mis .innerà display: blockexplicitement. Dans Chrome, il semblait hérité flexde .outer. J'ai également défini la largeur:

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

Cela a résolu le problème dans Chrome, j'espère que cela pourrait faire la même chose dans IE11. Voici ma version du violon: http://jsfiddle.net/ToddT/5CxAy/21/

Todd
la source
Merci pour votre réponse. La déclaration de hauteur et de largeur est nécessaire pour centrer verticalement dans IE. Sans cela, le contenu n'est plus centré sur IE11.
Dragonseer
Même avec la hauteur définie sur la div externe? Peut-être ajouter une hauteur minimale au corps?
Todd
1

J'ai trouvé une bonne solution ce qui a fonctionné pour moi, vérifiez ce lien https://codepen.io/chriswrightdesign/pen/emQNGZ/?editors=1100 Premièrement, nous ajoutons un div parent, deuxièmement, nous changeons min-height: 100% en min- hauteur: 100vh. Il fonctionne comme un charme.

// 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;
}  
Avirtum
la source
0

Si vous pouvez définir la largeur et la hauteur du parent, il existe un moyen plus simple de centraliser l'image sans avoir à créer un conteneur pour elle.

Pour une raison quelconque, si vous définissez la largeur minimale, IE reconnaîtra également la largeur maximale.

Cette solution fonctionne pour IE10 +, Firefox et 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/

Humberto Mendes
la source