CSS Grid Layout не работает в IE11 даже с префиксами

Я использую следующую разметку HTML для моей сетки.

<section class="grid">
    <article class="grid-item width-2x height-2x">....</article>
    <article class="grid-item">....</article>
    <article class="grid-item">....</article>
    <article class="grid-item width-2x">....</article>
    <article class="grid-item height-2x">....</article>
    <article class="grid-item">....</article>
    <article class="grid-item">....</article>
    <article class="grid-item width-2x height-2x">....</article>
</section>

Код SCSS выглядит следующим образом:

.grid {
    display: grid;
    grid-template-columns: repeat( 4, 1fr );
    grid-gap: 30px;
    align-items: start;

    .grid-item {
        &.height-2x {
            grid-row: span 2;
        }
        &.width-2x {
            grid-column: span 2;
        }
    }
}

Поскольку я использую auto-prefixer в своем рабочем процессе, он автоматически добавляет все соответствующие свойства с префиксом -ms. Я могу подтвердить это через элемент проверки.

Теперь проблема заключается в том, что этот код отлично работает в Chrome, Firefox и Opera, но когда я открываю эту страницу в Microsoft Edge или в IE 11, все элементы сетки перекрываются друг с другом в первой ячейке. Согласно этот сайт, эти браузеры поддерживают макет CSS Grid с префиксом -ms. Я создал CodePen для этого сценария.

CodePen Link

Почему он не работает?

.grid {
  display: -ms-grid;
  display: grid;
  -ms-grid-columns: (1fr)[4];
  grid-template-columns: repeat(4, 1fr);
  -ms-grid-rows: (270px)[4];
  grid-template-rows: repeat(4, 270px);
  grid-gap: 30px;
}

.grid .grid-item {
  background-color: #000;
  color: #fff;
  text-align: center;
  line-height: 270px;
}

.grid .grid-item.height-2x {
  -ms-grid-row: span 2;
  grid-row: span 2;
}

.grid .grid-item.width-2x {
  -ms-grid-column: span 2;
  grid-column: span 2;
}
<section class="grid">
  <article class="grid-item width-2x height-2x">....</article>
  <article class="grid-item">....</article>
  <article class="grid-item">....</article>
  <article class="grid-item width-2x">....</article>
  <article class="grid-item height-2x">....</article>
  <article class="grid-item">....</article>
  <article class="grid-item">....</article>
  <article class="grid-item width-2x height-2x">....</article>
</section>

Ответ 1

IE11 использует более старую версию спецификации Grid.

Используемые вами свойства не существуют в более старой спецификации сетки. Использование префиксов не имеет значения.

Вот три проблемы, которые я вижу сразу.


repeat()

Функция repeat() не существует в более старой спецификации, поэтому она не поддерживается IE11.

Вам нужно использовать правильный синтаксис, который описан в другом ответе на этот пост, или объявить все длины строк и столбцов.

Вместо:

.grid {
  display: -ms-grid;
  display: grid;
  -ms-grid-columns: repeat( 4, 1fr );
      grid-template-columns: repeat( 4, 1fr );
  -ms-grid-rows: repeat( 4, 270px );
      grid-template-rows: repeat( 4, 270px );
  grid-gap: 30px;
}

Использование:

.grid {
  display: -ms-grid;
  display: grid;
  -ms-grid-columns: 1fr 1fr 1fr 1fr;             /* adjusted */
      grid-template-columns:  repeat( 4, 1fr );
  -ms-grid-rows: 270px 270px 270px 270px;        /* adjusted */
      grid-template-rows: repeat( 4, 270px );
  grid-gap: 30px;
}

Старая ссылка на спецификацию: https://www.w3.org/TR/2011/WD-css3-grid-layout-20110407/#grid-repeating-columns-and-rows


span

Ключевое слово span не существует в более старой спецификации, поэтому оно не поддерживается IE11. Вам придется использовать эквивалентные свойства для этих браузеров.

Вместо:

.grid .grid-item.height-2x {
  -ms-grid-row: span 2;
      grid-row: span 2;
}
.grid .grid-item.width-2x {
  -ms-grid-column: span 2;
      grid-column: span 2;
}

Использование:

.grid .grid-item.height-2x {
  -ms-grid-row-span: 2;          /* adjusted */
      grid-row: span 2;
}
.grid .grid-item.width-2x {
  -ms-grid-column-span: 2;       /* adjusted */
      grid-column: span 2;
}

Старая ссылка на спецификацию: https://www.w3.org/TR/2011/WD-css3-grid-layout-20110407/#grid-row-span-and-grid-column-span


grid-gap

Свойство grid-gap, а также его длинные формы grid-column-gap и grid-row-gap не существуют в более старой спецификации, поэтому они не поддерживаются IE11. Вы должны будете найти другой способ отделить коробки. Я не читал всю старую спецификацию, так что может быть метод. В противном случае попробуйте поля.


автоматическое размещение элементов сетки

В старой спецификации обсуждалось автоматическое размещение элементов сетки, но эта функция никогда не была реализована в IE11. (Автоматическое размещение элементов сетки теперь является стандартным в текущих браузерах).

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

Используйте свойства -ms-grid-row и -ms-grid-column.

Ответ 2

Ответ уже дали Фейсал Хуршид и Майкл_B.
Это просто попытка сделать возможное решение более очевидным.

Для IE11 и ниже вам нужно включить более раннюю спецификацию сетки в родительском div, например, body или как здесь "grid", например так:

.grid-parent{display:-ms-grid;}

затем определите количество и ширину столбцов и строк, например, так:

.grid-parent{
  -ms-grid-columns: 1fr 3fr;
  -ms-grid-rows: 4fr;
}

наконец, вам нужно явно указать браузеру, где должен быть размещен ваш элемент (элемент), например, так:

.grid-item-1{
  -ms-grid-column: 1;
  -ms-grid-row: 1;
}

.grid-item-2{
  -ms-grid-column: 2;
  -ms-grid-row: 1;
}

Ответ 3

Майкл дал очень исчерпывающий ответ, но я хотел бы указать на несколько вещей, которые вы все еще можете сделать, чтобы иметь возможность использовать сетки в IE практически безболезненно.

Функция repeat поддерживается

Вы все еще можете использовать функцию повтора, она просто скрывается за другим синтаксисом. Вместо того, чтобы писать repeat(4, 1fr), вы должны написать (1fr)[4]. Это. Смотрите эту серию статей о текущем положении дел: https://css-tricks.com/css-grid-in-ie-debunking-common-ie-grid-misconceptions/

Поддержка сетки разрыва

Сетки гапсов поддерживаются во всех браузерах, кроме IE. Таким образом, вы можете использовать @supports at-rule для условной установки зазоров сетки для всех новых браузеров:

Пример:

.grid {
  display: grid;
}
.item {
  margin-right: 1rem;
  margin-bottom: 1rem;
}
@supports (grid-gap: 1rem) {
  .grid {
    grid-gap: 1rem;
  }
  .item {
    margin-right: 0;
    margin-bottom: 0;
  }
}

Это немного многословно, но, с другой стороны, вам не нужно вообще отказываться от гридов только для поддержки IE.

Используйте Autoprefixer

Я не могу подчеркнуть это достаточно - половину боли гридов решают, просто используя autoprefixer на вашем этапе сборки. Напишите свой CSS стандартным способом и просто позвольте авторефиксору сделать это, автоматически преобразовав все свойства старой спецификации. Когда вы решите, что не хотите поддерживать IE, просто измените одну строку в конфигурации браузера, и вы удалите весь специфичный для IE код из ваших встроенных файлов.

Ответ 4

Для поддержки IE11 с автоматическим размещением я конвертировал макет grid в table каждый раз, когда использовал макет сетки только в 1 измерении. Я также использовал margin вместо grid-gap.

Результат тот же, посмотри как ты можешь это сделать здесь https://jsfiddle.net/hp95z6v1/3/