оригинал:The Difference Between Width and Flex Basis, от gedd.ski
Фотография |GoranH
Многие люди задавали мне этот вопрос, на самом деле, я много раз гуглил его, когда только начинал использовать Flexbox. Глядя на свою историю поиска в Google, я искал что-то вроде «flex-basis vs width vs min-width» четыре раза за последний год. Без дальнейших церемоний! Позвольте мне ответить на этот вопрос сегодня, я надеюсь, что вам не придется искать снова в будущем.
Формула гибкого элемента
Вот формула, которую нужно запомнить:
содержимое -> ширина -> flex-basis (с учетом максимальной | минимальной ширины)
При выборе размера элемента Flex важно помнить, чтоокончательный размер(окончательная гибкая основа) будет подлежатьmin-width
а такжеmax-width
Ограничения собственности.
Примечание. Спецификация Flexbox называет это «воображаемым размером шпинделя», но проще понимать его как окончательный размер.
если не указаноflex-basis
,flex-basis
вернется кwidth
Атрибуты. если не указаноwidth
Атрибуты,flex-basis
Вернется к расчетной ширине на основе содержимого элемента Flex.
Чтобы проиллюстрировать эту формулу, давайте проиллюстрируем ее, используя flex-контейнер шириной 1000 пикселей с некоторыми flex-элементами:
container {
display: flex;
width: 1000px;
}
установить ширину
Мы устанавливаем элемент Flex размером 200 пикселей × 200 пикселей.
item {
width: 200px;
height: 200px;
}
Теперь, когда гибкий контейнер достаточно велик, чтобы вместить эти элементы, давайте поместим их внутрь.
В этом примере мы не указали элемент Flexflex-basis
(то есть взять по умолчаниюflex-basis: auto
), поэтому базовый размер возвращается кwidth
(200px).
В это время наборwidth
Эквивалентно настройкеflex-basis
.
установить гибкую основу
Далее укажем для проекта Flexflex-basis
, и посмотрим, что произойдет.
item {
width: 30px;
flex-basis: 250px;
}
можно увидеть, указатьflex-basis
назад,width
Свойство игнорируется и больше не имеет никакого эффекта (эквивалентно тому, что оно не задано).
item {
flex-basis: 250px;
}
Окончательный размер каждого элемента250px
. Поскольку места в контейнере по-прежнему достаточно, поместить проект в контейнер по-прежнему не проблема.
Помните формулу для элементов Flex:
содержимое -> ширина -> flex-basis (с учетом максимальной | минимальной ширины)
Что нас волнует, так это окончательный размер. Лучшей практикой является использованиеflex-basis
вместоwidth
илиheight
. В частности, в браузере Safari есть старый баг: при использованииheight
вместоflex-basis
свойства гибкого элементаfelx-shrink
Свойства не вступят в силу.
flex-basis ограничен max-width
На окончательный размер гибкого элемента влияетmin-width
а такжеmax-width
имущественные эффекты. Ставим на проект Flexmax-width
посмотри:
item {
flex-basis: 250px;
max-width: 100px;
}
несмотря на то чтоflex-basis
уже настроен250px
, но достиг100px
изmax-width
предел. Итак, окончательный размер100px
, на этом этапе элемент Flex все еще можно очень хорошо поместить в контейнер Flex:
Теперь давайте установимmin-width
Посмотрите, как это повлияет на окончательный размер:
item {
flex-basis: 100px;
min-width: 250px;
}
Хотя указаноflex-basis: 100px
, а потому что нельзя сравнивать250px
изmin-wdith
меньше. Итак, окончательный размер250px
, элемент Flex помещается прямо во flex-контейнер:
Итак, что такое flex-basis?
Теперь мы знаем, что вflex-basis
Если не указано,width
его резервная схема,min-width
а такжеmax-width
являются верхним и нижним пределами конечного размера. Так,flex-basis
что именно?
На изображении выше вы также могли заметить, что поместили в контейнер flexДо, мы визуализируем размер элемента Flex. Это делается для того, чтобы показать, что этоflex-basis
:То есть размер flex-элемента перед его помещением в flex-контейнер.(Примечание переводчика: То есть проектmax-content
размер). Это идеальный или гипотетический размер элемента Flex. но дляflex-basis
Указанное значение не обязательно будет окончательным размером элемента Flex! Как только мы поместили элемент Flex в контейнер Flex, все изменилось. В приведенном выше примере размер flex-контейнера в самый раз, поэтому все элементы внутри в порядке, потому что окончательный размер всех элементов в сумме равен ширине flex-контейнера (1000 пикселей). Это нормально, но обычно все проекты Flex имеютfelx-basis
При добавлении flex-контейнера либо нет места, либо нет места, а не просто так.
когда места мало
Предположим, мы положили больше, как в контейнереflex-basis: 200px
с проект:
Перед помещением в контейнер каждый из них занимает200px
размер, всего1600px
. Но наш контейнер имеет только1000px
ширина. В результате у нас не хватает места для такого количества flex-элементов, и в результате flex-элементы по умолчанию сжимаются, чтобы соответствовать недостаточному размеру контейнера:
Начальная ширина всех элементов200px
, гибкий элемент начинает сжиматься, чтобы соответствовать пространству контейнера (становится каждый125px
).flex-shrink
Используется для контроля коэффициента усадки. может быть предоставленflex-shrink
Укажите большее или меньшее значение, чтобы контролировать степень усадки, и даже можно установить значение0
, что указывает на то, что усадка не допускается.
когда осталось место
Также иногда, когда мы ставим окончательныйflex-basis
После сложения в контейнере остается место.
item {
flex-basis: 100px;
}
Мы можем указать, что наши flex-элементы растягиваются после помещения в flex-контейнер, чтобы занять оставшееся место, с помощьюflex-grow
контролируемое свойство, это свойство по умолчанию равно0
, указывая на то, что он не будет растягиваться. В приведенном ниже примере мы настроили для каждого элемента Flexflex-grow: 1
(растянуть в той же пропорции), чтобы занять оставшееся место.
item {
flex-basis: 100px;
flex-grow: 1;
}
Увеличение и сжатие — одна из основных особенностей макетов Flexbox, и именно поэтому Flexbox так хорош в адаптивном дизайне пользовательского интерфейса.
width vs flex-basis
теперь можно отличитьwidth
а такжеflex-basis
Хорошо,min-width
а такжеmax-width
будет ограничивать окончательный размер. и когдаflex-direction
дляcolumn
илиcolumn-reverse
, то естьflex-basis
а такжеheight
отношение.
(над)