Je n'ai pas pu déterminer pourquoi la flexbox ne fonctionne pas dans IE 11.
Pour les tests, j'ai utilisé une disposition très simple de flexbox auprès de CodePen et collé les informations ci-dessous.
Chrome fonctionne comme prévu. IE11 échoue.
Image de la mise en page réussie sur Chrome:
Image d'échec de la mise en page sur IE11
body {
background: #333;
font-family: helvetica;
font-weight: bold;
font-size: 1.7rem;
}
ul {
list-style: none;
}
li {
background: hotpink;
height: 200px;
text-align: center;
border: 2px solid seashell;
color: seashell;
margin: 10px;
flex: auto;
min-width: 120px;
max-width: 180px;
}
.flex {
display: flex;
justify-content: flex-start;
flex-wrap: wrap;
}
<ul class="flex">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
</ul>
IE rencontre un problème pour analyser la propriété flex
.
Voici quelques solutions de contournement qui ont fonctionné pour moi:
Utilisez les propriétés de la main longue au lieu de la sténographie.
Au lieu de quelque chose comme ceci: flex: 0 0 35%
.
Essaye ça:
flex-grow: 0
flex-shrink: 0
flex-basis: 35%
Assurez-vous que flex-shrink
est activé.
Donc au lieu de ceci: flex: 0 0 35%
Essayez ceci: flex: 0 1 35%
(Dans d'autres cas, flex-shrink
doit être désactivé: L'élément Flex chevauche un autre élément dans IE11 )
Attention avec les valeurs en pourcentage et sans unité avec flex-basis
Cela peut dépendre de votre version de IE11. Le comportement semble varier.
Essayez ces variations:
flex: 1 1 0
flex: 1 1 0px
flex: 1 1 0%
Il faut se méfier! Certains minificateurs CSS remplaceront 0px
par 0
, ce qui peut être très ennuyeux à déboguer (cependant, ils ne changeront pas 0%
pour une raison quelconque).
Plus de détails ici:
Au lieu de flex: 1
, utilisez flex: auto
(ou ajoutez flex-basis: auto
)
Si vous utilisez flex: 1
dans flex-direction: row
(comme sur des écrans plus grands) et que vous passez à flex-direction: column
dans une requête multimédia (par exemple, pour les appareils mobiles), vous constaterez peut-être que vos éléments flexibles se réduisent.
Dans votre requête multimédia, ajoutez flex-basis: auto
. Cela remplacera la valeur flex-basis
dans la règle flex: 1
(qui est généralement 0
, 0px
ou 0%
, en fonction du navigateur).
Utiliser flex: auto
devrait aussi fonctionner, ce qui est court pour:
flex-grow: 1
flex-shrink: 1
flex-basis: auto
width
/height
à l'ancienne au lieu de flex
.Utilisez la disposition block
au lieu de la disposition flex
.
Vous n'avez pas besoin d'abandonner complètement la mise en page flexible. Mais pour un conteneur particulier, vous pourrez peut-être exécuter le travail avec display: block
au lieu de display: flex; flex-direction: column
.
Par exemple, pour utiliser l’astuce padding afin d’intégrer de manière réactive une vidéo dans un élément flex, l’obstacle que j’étais confronté était que certains navigateurs ne fonctionnent pas bien avec un pourcentage de remplissage (ou de marge) dans un conteneur flex .
Pour que cela fonctionne, j'ai remplacé la valeur display
de l'élément flex par ceci:
/* a flex item, also a nested flex container */
#footer-container > article {
display: flex;
flex-direction: column;
}
pour ça:
#footer-container > article {
display: block;
}
Pour moi, en utilisant
flex: 1 1 auto;
au lieu de
flex: 1;
a résolu le problème de flexion sur IE 11.
Dans mon cas, le minificateur CSS rejette l'unité px
du dernier argument de la règle abrégée -ms-flex
, j'ai essayé d'utiliser l'unité %
et tout fonctionne correctement.
Comme dans la réponse @Michael_B, limitez la croissance avec la propriété _flex
de Flexbox: flex: 0 1 (1/n - b)
pris en valeur%, où n
est le nombre d'éléments flexibles dans une ligne et b
est l'écart entre les éléments flexibles dans IE.
Sur les éléments flex avec la propriété flex
ci-dessus, utilisez la propriété max-width
avec une valeur en pourcentage de 1/n - b
.
Dans votre cas, le CSS généralisé pour l'élément flex serait:
li {
// ... the remaining code from your snippet
// Calculate the following manually and insert or use CSS preprocessor that does math for you.
// See the formula explanation above.
max-width: (your flex container max-width / 2) * 100% - b;
flex: 0 1 (your flex container max-width / 2) * 100% - b;
}
Dans le cas réel avec 5 éléments/ligne, il y aura (1/5) * 100% - 1% = 19%
=> max-width: 19%
et flex: 0 1 19%;
.
Jouez avec le paramètre b
pour rendre les éléments flex suffisamment courts pour permettre à flex: wrap;
de fonctionner.
Il suffit d'utiliser flex:1 0 auto;
. Ça va marcher.