Были вопросы и статьи по этому поводу, но, насколько я могу судить, нет ничего убедительного. Лучшее резюме, которое я смог найти, это
flex-based позволяет указать начальный / начальный размер элемента, прежде чем что-либо еще будет вычислено. Это может быть процент или абсолютное значение.
... что само по себе мало говорит о поведении элементов с набором flex- base. С моим текущим знанием flexbox я не понимаю, почему это также не может описать ширину .
Я хотел бы знать, чем именно flex-base отличается от ширины на практике:
- Если я заменю ширину на flex-base (и наоборот), что изменится визуально?
- Что произойдет, если я установлю другое значение? Что произойдет, если они имеют одинаковое значение?
- Существуют ли особые случаи, когда использование width или flex-based будет существенно отличаться от использования другого?
- Как ширина и основание Flex отличаются при использовании в сочетании с другими стилями flexbox, такими как flex-wrap , flex-grow и flex-shrink ?
- Есть ли другие существенные различия?
Изменить / уточнить : Этот вопрос был задан в другом формате в разделе Что такое наборы свойств flex-based? но я чувствовал, что было бы неплохо более прямое сравнение или обобщение различий flex-base и width (или height ).
Ответы:
Рассматривать
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
.Из спецификации:
Но влияние
auto
илиcontent
может быть минимальным или вообще ничего. Больше из спецификации:Так что, согласно спецификации,
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.Чтобы отобразить указанную ширину и сохранить ее фиксированной, вам нужно отключить сжатие:
ИЛИ
ИЛИ, как указано в спецификации:
Ошибки браузера
В некоторых браузерах возникают проблемы с определением размера элементов 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:
flex
стенографические объявления с единичнымиflex-basis
значениями игнорируютсяflex-basis
не учитываетbox-sizing: border-box
flex-basis
не поддерживаетcalc()
flex-basis
при использованииflex
сокращенияисточник
min-width:100px;
? Может ли быть опция отключения усадки?flex-shrink
останавливается наmin-width
. Эквивалентное гибкое правило будетflex: 1 0 100px
.flex: 1 0 100px
приводит к тому же результату, но я не уверен, что вы подразумеваете под «эквивалентом».flex: 0 0 100px
, например?В дополнение к превосходному резюме Michael_B стоит повторить следующее:
Важная часть здесь является начальной .
Само по себе это разрешает ширину / высоту до тех пор, пока не вступят в игру другие свойства роста / сжатия.
Так. ребенок с
сначала он будет иметь ширину 25%, но затем сразу же увеличится настолько, насколько это возможно, пока не будут учтены другие элементы. Если их нет, он будет иметь ширину 100% / высоту.
Быстрая демонстрация:
Показать фрагмент кода
Эксперименты с
flex-grow
,flex-shrink
иflex-basis
(или сокращениемflex :fg fs fb
) ... могут привести к некоторым интересным результатам.источник
flex-basis
иwidth / height
задают начальный / начальный размер элемента. Например вflex-basis: 200px
основном работает так же какflex-basis: auto; width: 200px;
. Похоже, когдаflex-basis
не установлен,auto
то просто переопределяетwidth / height
значение. Единственное отличие, которое я вижу, заключается в способе обработки переполнения контента.Возможно, самый важный момент, чтобы добавить:
Что если браузер не поддерживает
flex
? В таком случаеwidth/height
вступают во владение и их значения применяются.Это очень хорошая идея - почти необходимая - для определения
width/height
элементов, даже если у вас тогда совершенно другое значение дляflex-basis
. Не забудьте проверить, отключивdisplay:flex
и увидев, что вы получаете.источник
flex
.