Ответ 1
Автоматический минимальный размер элементов Flex
Вы сталкиваетесь с настройкой по умолчанию для flexbox.
Сгибаемый элемент не может быть меньше размера его содержимого вдоль главной оси.
Значения по умолчанию...
-
min-width: auto
-
min-height: auto
... для гибких элементов в направлении строк и столбцов соответственно.
Вы можете переопределить эти значения по умолчанию, установив flex-элементы в:
-
min-width: 0
-
min-height: 0
-
overflow: hidden
(или любое другое значение, кромеvisible
)
Спецификация Flexbox
4,5. Автоматический минимальный размер элементов Flex
Чтобы обеспечить более разумный минимальный размер по умолчанию для гибких элементов, эта спецификация вводит новое
auto
значение в качестве начального значения свойствmin-width
иmin-height
определенных в CSS 2.1.
Что касается значения auto
...
Для гибкого элемента,
overflow
которогоvisible
на главной оси, при указании в свойстве min-size главной оси гибких элементов указывается автоматический минимальный размер. В противном случае вычисляется до0
.
Другими словами:
-
min-width: auto
иmin-height: auto
значения по умолчанию применяются только тогда, когдаvisible
overflow
. - Если значение
overflow
неvisible
, значение свойства min-size равно0
. - Следовательно,
overflow: hidden
может заменитьmin-width: 0
иmin-height: 0
.
а также...
- Алгоритм минимального размера применяется только на главной оси.
- Например, гибкий элемент в контейнере в направлении строки не получает
min-height: auto
по умолчанию. - Для более подробного объяснения смотрите этот пост:
Вы применили min-width: 0, а элемент все еще не сжимается?
Вложенные контейнеры Flex
Если вы имеете дело с элементами flex на нескольких уровнях структуры HTML, может потребоваться переопределить стандартную min-width: auto
/min-height: auto
для элементов на более высоких уровнях.
В основном, гибкий элемент более высокого уровня с min-width: auto
может предотвратить сжатие элементов, вложенных ниже с min-width: 0
.
Примеры:
- Элемент Flex не сжимается меньше, чем его содержимое
- Приспособление ребенка к родителю
- Свойство white-space css создает проблемы с flex
Браузер Рендеринг Заметок
-
Chrome против Firefox/Edge
По крайней мере, с 2017 года, похоже, что Chrome либо (1) возвращается к значениям по умолчанию
min-width: 0
/min-height: 0
, либо (2) автоматически применяет значения по умолчанию0
в определенных ситуациях на основе загадочного алгоритма. (Это может быть то, что они называют вмешательством.) В результате многие люди видят, что их макет (особенно нужные полосы прокрутки) работает, как и ожидалось, в Chrome, но не в Firefox/Edge. Эта проблема более подробно рассматривается здесь: несоответствие между Firefox и Chrome -
IE11
Как отмечено в спецификации,
auto
значение для свойствmin-width
иmin-height
является "новым". Это означает, что некоторые браузеры могут по-прежнему отображать значение0
по умолчанию, потому что они реализовали гибкий макет до того, как значение было обновлено, и потому что0
является начальным значением дляmin-width
иmin-height
в CSS 2.1. Одним из таких браузеров является IE11. Другие браузеры обновились до новогоauto
значения, определенного в спецификации flexbox.
Пересмотренный Демо
.container {
display: flex;
}
.col {
min-height: 200px;
padding: 30px;
word-break: break-word
}
.col1 {
flex: 1;
background: orange;
font-size: 80px;
min-width: 0; /* NEW */
}
.col2 {
flex: 3;
background: yellow
}
.col3 {
flex: 4;
background: skyblue
}
.col4 {
flex: 4;
background: red
}
<div class="container">
<div class="col col1">Lorem ipsum dolor</div>
<div class="col col2">Lorem ipsum dolor</div>
<div class="col col3">Lorem ipsum dolor</div>
<div class="col col4">Lorem ipsum dolor</div>
</div>