Альтернатива Flexbox для IE9

#html #css #internet-explorer #cross-browser #flexbox

#HTML #css #internet-explorer #кросс-браузерный #flexbox

Вопрос:

Изначально я разработал веб-сайт с Chrome (для него проще всего разрабатывать), но теперь я перехожу к модели поддержки IE.

При этом я начал с IE11 и внес необходимые изменения для устранения причудливых различий между IE и Chrome. Но теперь я отказываюсь от версий IE. Мне удалось корректно отобразить 90% веб-страниц с помощью CSS для IE10. Но теперь большинство элементов CSS, которые у меня есть для этих двух браузеров, по большей части не имеют отношения к IE9.

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

Первая проблема заключается в преобразовании IE10 в реализацию модели flexbox CSS.

Текущая реализация для контейнера flexbox:

 div#navContainer{
    display: flex; //Current browsers (IE11, Chrome, etc)
    display: -ms-flexbox; //IE10 implementation
}

div#TeamsSection {
    text-align: center;
}

div.NavSection {
    margin: 0px 7px;
    padding: 4px 0px 0px 0px;
}

div#teams {
    margin: 0px;

    select {
        margin: 0px;
    }
}
  

HTML:

 <div id="navContainer" class="float-left">
    <div id="LogoSection" class="NavSection">
        <div id="Logo">
            <img src="Images/Logo.png" />
        </div>
    </div>
    <div id="TeamsSection" class="NavSection">
        <label>Select a Team:</label><br />
        <div id="teams"></div>
    </div>
    <div id="UserSection" class="NavSection hidden">
        <label>Select a User:</label><br />
        <div id="requestor"></div>
    </div>
</div>
  

Я знаю, что IE9 не реализует Flexbox, поэтому, пожалуйста, не оскорбляйте исследования, которые я уже провел. Мне нужна эквивалентная реализация, которая позволит мне изменять HTML как можно меньше.

Комментарии:

1. вы не говорите, как вы используете свойство flex, display: table amp; table-cell может быть резервным вариантом, где еще он будет играть с макетом и выравниванием текста. display:flex; сам по себе не дает достаточно, чтобы посоветовать вам конкретные резервные варианты

2. Ну, #navContainer элемент — это тот, который вызывает проблему с выходом из потока для IE9. Я опубликовал HTML и расширенные дочерние стили CSS. #teams amp; #requestor заполняются усами из шаблонов. Опять же, проблема действительно в том #navContainer , что IE10 и Chrome работают так, как ожидалось. Для его IE9 мне нужно попытаться получить правильную реализацию.

3. Вы должны проверить Flexie.js .

4. Это не ответ на flexbox в IE9, но если вы добавляете префиксы поставщиков для поддержки IE10, рассмотрите возможность использования Autoprefixer. Это действительно упрощает задачу.

5. Используйте autoprefixer.

Ответ №1:

Используйте modernizr, чтобы определить, присутствуют ли возможности flex, и при необходимости предоставьте резервные стили. Modernizr добавит flexbox no-flexbox flexbox-legacy к элементу html такие классы, как , , и, поэтому в ваших стилях вы можете использовать:

     .container {
        display: flex;
    }
    .no-flexbox .container {
        display: table-cell;
    }
  

Я настоятельно рекомендую прочитать презентации Зои Гилленуотер (@zomigi) по этому вопросу, в частности, повышение уровня с помощью Flexbox (Smart Web Conference — сентябрь 2014)

  • слайд 21: горизонтальный интервал навигации> display: inline-block;
  • слайд 62: закрепление элементов без flexbox > display: table-cell;
  • слайд 70,71: выравнивание резервных копий форм
  • слайд 88,91: пример с гибким порядком и без него

Кроме того, в ее презентации CSS3 Layout есть несколько хороших предварительных просмотров макетов с flexbox и без него:

  • слайд 73: использование встроенного блока с flexbox: горизонтальная форма
  • слайд 79: Использование встроенного блока с flexbox: горизонтальная навигация

Некоторые выводы для меня:

  • поддержка браузеров ie10 довольно хороша, можно использовать
  • используйте auto-prefixr для обработки префиксов браузера
  • используйте modernizr для обеспечения резервных вариантов
  • «flexbox — это не все или ничего» @zomigi

Комментарии:

1. .контейнер { отображение: гибкий; отображение: таблица-ячейка; }

2. Я думаю, что это должно быть .container {display: table-cell; display: flex;}

Ответ №2:

Мне нравится приведенный выше ответ, но вам не обязательно использовать modernizr. Вы могли бы просто использовать макет таблицы для ie9 и flexbox для других.

 .container {
    display: table-cell; // ie9
    display: flex;       // others
}
  

Комментарии:

1. приятно! Я предполагаю, что могут быть некоторые крайние случаи, когда flexbox-legacy браузеры отображают немного по-другому.. автофиксатор по-прежнему удобен!

2. Это не работает. Это дочерние элементы .container , которые должны быть расположены в строке, а не .container сами по себе.

3. Добавьте приведенный выше код к дочерним элементам, если это то, что вам нужно.

4. Мне нравится создавать микширование, чтобы другой разработчик, но, скорее всего, сам, не забыл добавить запасной вариант: @mixin display-flex() {display: table-cell; display: flex;}

Ответ №3:

Год спустя это решение, использующее JavaScript для настройки макета в старых браузерах, кажется интересным => https://github.com/10up/flexibility

Почти 2000 звезд на Github, но последний коммит был 3 месяца назад, я не знаю, поддерживается ли он по-прежнему активно.

Комментарии:

1. качественная утилита не требует большого количества активных изменений. Похоже, что загрузчик Google также предоставляет функциональность, с которой мы все боролись.

2. На самом деле это загрузчик Twitter. Просто говорю. 😉

3. Технические характеристики, все они происходят из одной и той же ветви дерева 😉