Рассматривать flex-direction
Первое, что приходит на ум при чтении вашего вопроса - flex-basis
это не всегда применимо к width
.
Когда flex-direction
есть row
, flex-basis
контролирует ширину.
Но когда flex-direction
есть column
, flex-basis
контролирует высоту.
Ключевые отличия
Вот некоторые важные различия между flex-basis
и width
/ height
:
flex-basis
применяется только к гибким предметам. Flex-контейнеры (которые также не являются flex-элементами) будут игнорировать, flex-basis
но могут использовать width
и height
.
flex-basis
работает только на главной оси. Например, если вы находитесь flex-direction: column
, это width
свойство будет необходимо для определения размера элементов Flex по горизонтали.
flex-basis
не влияет на абсолютно позиционированные гибкие элементы. width
и height
свойства будут необходимы. Абсолютно позиционированные флекс-элементы не участвуют в флекс-макете .
Используя flex
свойство, три свойства - flex-grow
, flex-shrink
и flex-basis
- может быть аккуратно объединены в одной декларации. Используя width
одно и то же правило, потребуется несколько строк кода.
Поведение браузера
С точки зрения того, как они отображаются, не должно быть никакой разницы между flex-basis
и width
, если не flex-basis
является auto
или content
.
Из спецификации:
7.2.3. flex-basis
недвижимость
Для всех значений, кроме auto
и content
, flex-basis
разрешается так же, как и width
в горизонтальных режимах записи.
Но влияние auto
или content
может быть минимальным или вообще ничего. Больше из спецификации:
auto
При указании в элементе flex auto
ключевое слово извлекает значение свойства основного размера в качестве используемого flex-basis
. Если это значение само по себе auto
, то используемое значение content
.
content
Указывает на автоматическое изменение размера в зависимости от содержимого элемента flex.
Примечание. Это значение отсутствовало в первоначальном выпуске Flexible Box Layout, поэтому некоторые старые реализации не будут его поддерживать. Эквивалентный эффект может быть достигнут при использовании auto
вместе с основным размером ( width
или height
) из auto
.
Так что, согласно спецификации, flex-basis
и width
решать одинаково, если не flex-basis
является auto
или content
. В таких случаях flex-basis
может использоваться ширина содержимого (которую, вероятно, width
будет использовать и свойство).
flex-shrink
фактор
Важно помнить начальные настройки гибкого контейнера. Некоторые из этих настроек включают в себя:
flex-direction: row
- гибкие элементы будут выровнены по горизонтали
justify-content: flex-start
- гибкие элементы будут складываться в начале линии на главной оси
align-items: stretch
- гибкие элементы будут расширяться, чтобы охватить поперечный размер контейнера
flex-wrap: nowrap
- гибкие предметы вынуждены оставаться в одной строке
flex-shrink: 1
- гибкий элемент может сжиматься
Обратите внимание на последний параметр.
Потому что гибкие предметы могут сокращаться по умолчанию (который предотвращает их от переполнения контейнера), указанный flex-basis
/ width
/ height
может быть переопределен.
Например, flex-basis: 100px
или width: 100px
, в сочетании с flex-shrink: 1
, не обязательно будет 100px.
Чтобы отобразить указанную ширину и сохранить ее фиксированной, вам нужно отключить сжатие:
div {
width: 100px;
flex-shrink: 0;
}
ИЛИ
div {
flex-basis: 100px;
flex-shrink: 0;
}
ИЛИ, как указано в спецификации:
flex: 0 0 100px; /* don't grow, don't shrink, stay fixed at 100px */
7.2. Компоненты гибкости
Авторам рекомендуется контролировать гибкость, используя flex
сокращение, а не напрямую с его свойствами, так как сокращение корректно сбрасывает любые неуказанные компоненты для обеспечения общего использования .
Ошибки браузера
В некоторых браузерах возникают проблемы с определением размера элементов Flex во вложенных контейнерах Flex.
flex-basis
игнорируется во вложенном гибком контейнере. width
работает.
При использовании flex-basis
контейнер игнорирует размеры своих дочерних элементов, и дочерние элементы переполняют контейнер. Но со width
свойством контейнер учитывает размеры своих дочерних элементов и соответственно расширяется.
Ссылки:
Примеры:
использование гибких элементов flex-basis
и white-space: nowrap
переполнение inline-flex
контейнера. width
работает.
Похоже, что гибкий контейнер inline-flex
не распознается flex-basis
на дочернем white-space: nowrap
элементе при рендеринге брата (хотя это может быть просто элемент с неопределенной шириной). Контейнер не расширяется для размещения предметов.
Но когда width
свойство используется вместо flex-basis
, контейнер учитывает размеры своих дочерних элементов и соответственно расширяется. Это не проблема в IE11 и Edge.
Ссылки:
Пример:
flex-basis
(и flex-grow
) не работает над элементом таблицы
Ссылки:
flex-basis
происходит сбой в Chrome и Firefox, когда дедушка-родительский элемент является усадочным элементом. Настройка отлично работает в Edge.
Как и в примере, представленном в приведенной выше ссылке, с position: absolute
использованием, float
и inline-block
также будет отображаться тот же некорректный вывод ( jsfiddle demo ).
Ошибки, влияющие на IE 10 и 11: