Розглянемо 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: