it-swarm.com.ru

Гибкое автоматическое поле не работает в IE10 / 11

У меня сложная компоновка, в которой я центрирую различные элементы по вертикали и горизонтали с помощью flexbox.

Последний элемент тогда имеет margin-right:auto; применяется для толкания элементов влево (и отмены их центрирования).

Это работает правильно везде, кроме IE10/11, и сводит меня с ума.

Пример HTML/CSS:

#container {
  display: -ms-flexbox;
  display: -webkit-flex;
  display: flex;
  
  -ms-flex-flow: row wrap;
  -webkit-flex-flow: row wrap;
  flex-flow: row wrap;
  
  -ms-flex-pack: center;
  -webkit-justify-content: center;
  justify-content: center;
  
  -ms-flex-align: center;
  -webkit-align-items: center;
  align-items: center;
  
  -ms-flex-line-pack: center;
  -webkit-align-content: center;
  align-content: center;
}

#second-item {
  margin-right: auto;
}

/* just some colors - not important */
#container {
  height: 200px;
  width: 100%;
  background: red;
}
#container > div {
  background: blue;
  padding: 10px;
  outline: 1px solid yellow;
}
<div id='container'>
  <div id='first-item'>first item</div>
  <div id='second-item'>second item</div>
</div>

http://codepen.io/anon/pen/NrWVbR

Вы увидите два элемента на экране, которые должны быть выровнены по левому краю сбоку от красного родителя (то есть они оба должны быть центрированы, но последний элемент имеет margin-right:auto; применяется и заполняет всю строку, толкая другой элемент и себя в сторону) - это правильное поведение. За исключением IE10/11, где оба элемента неправильно отцентрированы, то есть у второго элемента margin-right:auto; игнорируется.

Любые эксперты по IE ​​/ flexbox, которые сталкивались с чем-то подобным раньше?

32
Michael

Это, похоже, ошибка IE.

Согласно спецификации flexbox:

8.1. Выравнивание с автоматическими полями

До выравнивания через justify-content а также align-self, любое положительное свободное пространство распределяется по автоматическим полям в этом измерении.

Примечание. Если свободное пространство распределяется по автоматическим полям, свойства выравнивания не будут действовать в этом измерении, потому что поля украдут все свободное пространство, оставшееся после сгибания.

Другими словами, авто поля имеют приоритет над justify-content.

Фактически, если к элементу применены автоматические поля, свойства выравнивания ключевых слов, такие как justify-content а также align-self не имеют никакого эффекта (потому что авто поля заняли все пространство).

Ваш код работает должным образом в Chrome и Firefox, потому что эти браузеры соответствуют спецификации.

IE10 и IE11, кажется, не соответствуют. Они не применяют автоматическую маржу, как определено в спецификации.

(Обратите внимание, что IE10 построен на предыдущая версия спецификации .)


Решения

Метод № 1: Использовать только авто поля

Если justify-content удалено, авто поля работают нормально в IE10/11. Так что не используйте justify-content. Используйте автоматические поля до конца. ( см. Примеры выравнивания с автоматическими полями ).

Метод № 2: Используйте невидимый разделитель div

Создайте третий div с помощью visibility: hidden а также flex-grow:1. Это естественно сместится #first-item а также #second-item к левому краю, без необходимости авто наценки.

#container {
  display: flex;
  flex-flow: row wrap;
  justify-content: center;
  align-items: center;
  align-content: center;
}
#third-item {
  flex-grow: 1;
  visibility: hidden;
}
/* just some colors - not important */
#container {
  height: 200px;
  width: 100%;
  background: pink;
}
#container > div {
  background: cornflowerblue;
  padding: 10px;
  outline: 1px solid yellow;
}
<div id='container'>
  <div id='first-item'>first item</div>
  <div id='second-item'>second item</div>
  <div id='third-item'>third item</div>
</div>
58
Michael_B