#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. Технические характеристики, все они происходят из одной и той же ветви дерева 😉