Каковы различия между гибкой основой и шириной?
были вопросы и статьи об этом, но ничего убедительного, насколько я могу сказать. Лучшее резюме, которое я мог найти, это
flex-basis позволяет указать начальный / начальный размер элемента, прежде чем что-либо еще будет вычислено. Это может быть как процентное, так и абсолютное значение.
...что само по себе не говорит о поведении элементов с flex-basis set. С моим текущим знание flexbox я не понимаю, почему это не может описать ширина также.
Я хотел бы знать, как именно flex-basis отличается от ширина на практике:
- если я заменить ширина С flex-basis(и наоборот), что изменится визуально?
- что произойдет, если я установлю оба значения в другое значение? Что произойдет, если они имеют одинаковое значение?
- есть особые случаи, когда используется либо ширина или flex-basis будет ли существенная разница в использовании другого?
- How do ширина и flex-basis отличаются при использовании в сочетании с другими стилями flexbox, такими как flex-wrap, flex-grow и flex-shrink?
- любые другие значительные различия?
редактировать/пояснения: этот вопрос был задан в другом формате в какие именно наборы свойств flex-basis? но я чувствовал более прямое сравнение или резюме различий flex-basis и ширина (или высота) было бы здорово.
3 ответов:
считают
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-basisне влияет на абсолютно позиционированные элементы гибкого трубопровода.widthиheightсвойства были бы необходимы. абсолютно позиционированные элементы flex не участвуют в макете flex.с помощью
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может будьте минимальны или вообще ничего. Подробнее из спецификации:если указано на элементе flex, то
autoключевое слово получает значение свойства основного размера в качестве используемогоflex-basis. Если это значение самauto, то используется значениеcontent.указывает автоматическая калибровка, основанная на содержимом элемента flex.
Примечание: это значение не присутствовало в начальном выпуске гибкого Макет коробки, и, следовательно, некоторые старые реализации не будут поддерживать его. Эквивалентный эффект может быть достигнут с помощью
autoвместе с основной размер (widthилиheight) изauto.Итак, согласно спецификации,
flex-basisиwidthразрешить одинаково, еслиflex-basisиautoилиcontent. В таких случаяхflex-basisможет использовать ширину содержимого (которая, предположительно,widthсвойство будет использовать, а также).
The
flex-shrinkфакторважно помнить начальные настройки контейнера flex. Некоторые из этих параметров относятся:
flex-direction: row- элементы flex будут выравниваться по горизонталиjustify-content: flex-start- элементы flex будут складываться в начале линии на главной осиalign-items: stretch- гибкие элементы будут расширяться, чтобы покрыть поперечный размер контейнераflex-wrap: nowrap- гибкий элементы вынуждены оставаться в одной строкеflex-shrink: 1- гибкий элемент может сжиматьсяобратите внимание на последний параметр.
поскольку элементы flex могут сжиматься по умолчанию (что предотвращает их переполнение контейнера), указанный
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 */авторам рекомендуется контролировать гибкость с помощью
flexстенография а не с его длинными свойствами непосредственно, как стенография правильно сбрасывает любые неопределенные компоненты для размещения общий использует.
Ошибки Браузера
ошибка, влияющая на все основные браузеры, кроме IE 11 & Edge:
flex-basisигнорируется во вложенном контейнере flex.widthстроительство.обнаружена проблема при определении размеров элементов flex во вложенном flex контейнер.
при использовании
flex-basis, контейнер игнорирует размер своих детей, и дети переполняют контейнер. Но с помощьюwidthсвойство, контейнер уважает размер своих детей и расширяет соответственно. Это не проблема в IE11 и Edge.ссылки:
- Chrome не расширяет Flex parent в соответствии с детским контентом
- разница между шириной и flex-basis
- Flex-basis игнорируется при определении размера вложенных контейнеров flex.
- гибкий график работы-основа:100 пикселей делает что-то другое из ширина:100 Пикс.+шлейф-базис:автоматическое
примеры:
- https://jsfiddle.net/t419zhra/ (источник: @Dremora)
- https://jsfiddle.net/voc9grx6/ (источник: Chromium Баги)
- https://jsfiddle.net/qjpat9zk/ (источник: Баги Хрома)
гибкие элементы с помощью
flex-basisиwhite-space: nowrapпереполненияinline-flexконтейнер.widthстроительство.кажется, что гибкий контейнер установлен в
inline-flexне признаетflex-basisна ребенка при рендеринге брата сwhite-space: nowrap(хотя это может быть просто элемент с неопределенным ширина). Контейнер не разверните для размещения элементов.но когда
widthсвойство используется вместоflex-basis, контейнер уважает загрунтовку своих детей и расширяет соответственно. Это не проблема в IE11 и Edge.ссылки:
- встроенная ширина контейнера гибкого трубопровода не растет
- встроенный контейнер гибкого трубопровода (дисплей: встроенный-гибкий трубопровод) расширяет полную ширину родителя контейнер
пример:
- https://jsfiddle.net/p18h0jxt/1/ (с первого поста выше)
ошибки, влияющие на IE 10 и 11:
в дополнение к превосходному резюме Michael_B стоит повторить это:
flex-basis позволяет указать начальная/стартовая размер элемента, прежде чем что-либо еще вычисляется. Это может быть как процентное, так и абсолютное значение.
важная часть здесь нач.
само по себе, это действительно решает ширину/высоту до другие свойства гибкого трубопровода растут / сжимают приходят в игру.
так. ребенок с
.child { flex-basis:25%; flex-grow:1; }будет 25% широкий первоначально, но затем сразу же расширить столько, сколько он может, пока другие элементы не будут учтены. Если нет..это будет 100% шириной/высотой.
быстрая демонстрация:
.flex { width: 80%; margin: 1em auto; height: 25px; display: flex; background: rebeccapurple; } .child { flex-basis: auto; /* default */ background: plum; } .value { flex-basis: 25%; } .grow { flex-grow: 1; }<div class="flex"> <div class="child auto">Some Content</div> </div> <div class="flex"> <div class="child value">Some Content</div> </div> <div class="flex"> <div class="child grow">Some Content</div> </div>экспериментируя с
flex-grow,flex-shrinkиflex-basis(или стенографияflex :fg fs fb)...может привести к некоторым интересным результатам.
возможно, самый важный момент, чтобы добавить:
Что делать, если браузер не поддерживает
flex? В таком случае,width/heightвзять на себя и их значения.это очень хорошая идея - почти необходимо - определить
width/heightна элементах, даже если у вас тогда есть совершенно другое значение дляflex-basis. Не забудьте проверить, отключивdisplay:flexи видя, что вы получаете.
Comments