Минимальная ширина рендеринга по-разному в направлении Flex: строка и направление Flex: столбец
У меня есть контейнер с display: flex
а также flex-direction: row
,
В этом контейнере есть субконтейнер также с display: flex
но с flex-direction: column
,
Проблема в том, что если я добавлю вход в субконтейнер, min-width
этого ввода будут игнорироваться.
Это код, где я попробовал несколько случаев ввода во flexbox:
form {
margin: 100px;
}
div.flex_ctn {
display: flex;
}
input {
flex: 1;
min-width: 40px;
}
div.column {
flex-direction: column;
}
div.row {
flex-direction: row;
}
div.sub_ctn {
flex: 1;
/*min-width:40px;*/
}
<form>
<div class="flex_ctn row">
<input />
</div>
<div class="flex_ctn column">
<input />
</div>
<div class="flex_ctn row">
<div class="flex_ctn column sub_ctn">
<input />
</div>
</div>
<div class="flex_ctn column">
<div class="flex_ctn row sub_ctn">
<input />
</div>
</div>
</form>
https://fiddle.jshell.net/s3gu32ku/2/
Если вы уменьшите размер экрана, 3-я строка не будет реагировать, как другие.
В CSS вы увидите, что последняя строка установлена как комментарий. Когда эта часть включена, вам просто нужно перезагрузить, и проблема исчезнет. Настолько совершенен! У меня есть решение!
Но это мешает мне использовать то, что я не понимаю ^^.
Было бы замечательно, если бы кто-то мог объяснить мне, почему возникает эта ошибка, почему эта строка исправляет ее, а также если есть лучший способ избежать этой проблемы.
1 ответ
Вообще говоря, flex-элементы по умолчанию не могут быть меньше размера их содержимого.
Более конкретно, это начальные настройки элементов flex:
min-width: auto
(применяется вflex-direction: row
)min-height: auto
(применяется вflex-direction: column
)
Более конкретно, взгляните на спецификации языка:
4,5. Предполагаемый минимальный размер элементов Flex
Чтобы обеспечить более разумный минимальный размер по умолчанию для гибких элементов, эта спецификация вводит новый
auto
значение в качестве начального значенияmin-width
а такжеmin-height
свойства, определенные в CSS 2.1.
auto
На гибком предмете
overflow
являетсяvisible
на главной оси, если указано в свойстве min-size главной оси гибкого элемента, задается автоматический минимальный размер. В противном случае вычисляется0
,
Другими словами, алгоритм минимального размера применяется только на главной оси.
Ваши элементы ввода в контейнерах направления столбцов не получают min-width: auto
- потому что главная ось в этих случаях вертикальная - поэтому они сжимаются и не переполняют контейнер. Вы можете видеть это поведение на вашем втором элементе ввода. Уменьшите размер экрана во время просмотра этой демонстрации.
То же самое происходит с третьим входом, который является дочерним элементом вложенного гибкого контейнера с flex-direction: column
... КРОМЕ этого контейнера в направлении столбцов также является гибким элементом более крупного контейнера с flex-direction: row
,
Это означает, что главная ось вложенного контейнера горизонтальна и min-width: auto
применяется. В результате этот гибкий элемент не будет уменьшаться ниже внутренней ширины ввода. Для иллюстрации см. Ту же демонстрацию сверху.
Следовательно, вам нужно переопределить это значение по умолчанию min-width: 0
или же overflow: hidden
( демо).
И по причинам, объясненным выше, четвертый вход, содержащийся во вложенном гибком контейнере в направлении строки, также должен иметь min-width: auto
переопределено ( демо).
Связанный: почему не сгибает элемент, уменьшая размер контента?