Розглянемо flex-direction
Перше, що спадає на думку, читаючи ваше запитання, - flex-basis
це не завжди стосується width
.
Коли flex-direction
є row
, flex-basis
регулює ширину.
Але коли flex-direction
є column
, flex-basis
контролює висоту.
Ключові відмінності
Ось кілька важливих відмінностей між flex-basis
та width
/ height
:
flex-basis
стосується лише гнучких предметів. Flex контейнери (які також не є гнучкими елементами) ігнорують, flex-basis
але можуть використовувати width
і height
.
flex-basis
працює лише на головній осі. Наприклад, якщо ви знаходитесь flex-direction: column
, width
властивість знадобиться для розміщення гнучких елементів горизонтально.
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.
Примітка. Це значення не було в початковому випуску гнучкої схеми Box Box, і тому деякі старі реалізації не підтримують його. Еквівалентний ефект можна досягти, використовуючи auto
разом з основним розміром ( width
або height
) auto
.
Так, в відповідності зі специфікацією, flex-basis
і width
рішучістю однаково, якщо flex-basis
НЕ auto
або content
. У таких випадках flex-basis
може використовуватися ширина вмісту (що, імовірно, width
буде використане і властивість).
The 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
не обов'язково буде 100 пікселів.
Щоб відобразити задану ширину - і зберегти її фіксованою - вам потрібно буде відключити скорочення:
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-basis
ігнорується в вкладеному контейнері flex. 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: