Рассматривать 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: