flex | CSS | WebReference
- Содержание
- Краткая информация
- Синтаксис
- Значения
- Пример
- Примечание
- Спецификация
- Браузеры
Сокращённое свойство, которое позволяет указать параметры элемента, чтобы он эффективно заполнял доступное пространство. Элементы могут быть растянуты пропорционально с учётом заданного соотношения или сжаты, чтобы целиком вместить все элементы без переносов в одну строку.
Значение по умолчанию | flex-grow: 0 flex-shrink: 1 flex-basis: auto |
---|---|
Наследуется | Нет |
Применяется | К флекс-элементам |
Анимируется | Да |
Синтаксис
flex: none | [ flex-grow flex-shrink? || flex-basis ]
Обозначения
Описание | Пример | |
---|---|---|
<тип> | Указывает тип значения. | <размер> |
A && B | <размер> && <цвет> | |
A | B | Указывает, что надо выбрать только одно значение из предложенных (A или B). | normal | small-caps |
A || B | Каждое значение может использоваться самостоятельно или совместно с другими в произвольном порядке. | width || count |
[ ] | Группирует значения. | [ crop || cross ] |
* | Повторять ноль или больше раз. | [,<время>]* |
+ | Повторять один или больше раз. | <число>+ |
? | Указанный тип, слово или группа не является обязательным. | inset? |
{A, B} | Повторять не менее A, но не более B раз. | <радиус>{1,4} |
# | Повторять один или больше раз через запятую. | <время># |
Значения
- none
- Соответствует значению 0 0 auto.
Смотрите отдельные свойства для их значений.
Пример
<!DOCTYPE html> <html> <head> <meta charset=»utf-8″> <title>flex</title> <style> body { margin: 0; /* Убираем отступы */ display: flex; /* Включаем флексы */ height: 100vh; /* Занимает всю высоту */ flex-direction: column; /* Главная ось располагается вертикально */ } main { flex: 1; /* Соответствует flex: 1 1 0% */ } footer { background: #e4efc7; /* Цвет фона */ padding: 10px; /* Поля вокруг текста */ } </style> </head> <body> <main> </main> <footer>Подвал</footer> </body> </html>Объектная модель
Объект.style.flex
Примечание
Safari до версии 9 поддерживает свойство -webkit-flex.
Спецификация
Спецификация | Статус |
---|---|
CSS Flexible Box Layout Module Level 1 | Возможная рекомендация |
Спецификация
Каждая спецификация проходит несколько стадий одобрения.
- Recommendation (Рекомендация) — спецификация одобрена W3C и рекомендована как стандарт.
- Candidate Recommendation (Возможная рекомендация) — группа, отвечающая за стандарт, удовлетворена, как он соответствует своим целям, но требуется помощь сообщества разработчиков по реализации стандарта.
- Proposed Recommendation (Предлагаемая рекомендация) — на этом этапе документ представлен на рассмотрение Консультативного совета W3C для окончательного утверждения.
- Working Draft (Рабочий проект) — более зрелая версия черновика после обсуждения и внесения поправок для рассмотрения сообществом.
- Editor’s draft (Редакторский черновик) — черновая версия стандарта после внесения правок редакторами проекта.
- Draft (Черновик спецификации) — первая черновая версия стандарта.
Браузеры
11 | 13 | 29 | 12.1 | 6.1 | 9 | 28 |
4.4 | 28 | 12.1 | 7.1 | 9.2 |
Браузеры
В таблице браузеров применяются следующие обозначения.
- — свойство полностью поддерживается браузером со всеми допустимыми значениями;
- — свойство браузером не воспринимается и игнорируется;
- — при работе возможно появление различных ошибок, либо свойство поддерживается лишь частично, например, не все допустимые значения действуют или свойство применяется не ко всем элементам, которые указаны в спецификации.
Число указывает версию браузера, начиная с которой свойство поддерживается.
Флексы
См. также
- Выравнивание элементов форм
Автор и редакторы
Автор: Влад Мержевич
Последнее изменение: 24.04.2020
Редакторы: Влад Мержевич
Полное руководство по CSS Flex + опыт использования / Хабр
Как и CSS Grid, Flex Box довольно сложен, потому что состоит из двух составляющих: контейнера и элементов внутри него.
Когда я начал изучать Flex, я хотел увидеть все, на что он способен. Но мне не удалось найти подробное руководство с примерами всех возможностей. Поэтому я решил самостоятельно создать диаграммы свойств Flex с «высоты птичьего полета».
Это все, на что способен Flex.Но… давайте рассмотрим каждую диаграмму отдельно. К концу этого руководства по Flex вы узнаете обо всех его возможностях.
CSS Flex или Flex Box
Flex — это набор правил для автоматического растягивания нескольких столбцов и строк внутри родительского контейнера.
display:flex
В отличие от многих других свойств CSS, в Flex есть основной контейнер и вложенные в него элементы. Некоторые свойства CSS-Flex относятся только к контейнеру. А другие можно применить только к элементам внутри него.
Вы можете думать о flex-элементе как о родительском контейнере со свойством display: flex. Элемент, помещенный в контейнер, называется item. Каждый контейнер имеет границы начала(flex-start) и конца гибкости(flex-end), как показано на этой диаграмме.
Горизонтальная (main) и вертикальная (cross) оси
Хотя список элементов представлен линейно, необходимо обращать внимание на строки и столбцы. По этой причине Flex включает в себя координатные оси. Горизонтальная ось называется main-axis, а вертикальная — cross-axis.
Чтобы управлять шириной содержимого контейнера и промежутками между элементами, которые растягиваются вдоль main-axis, необходимо использовать Justify-content. Для управления вертикальными изменениями элементов необходимо использовать align-items.
Если у вас есть 3 столбца и 6 элементов, Flex автоматически создаст вторую строку для размещения оставшихся элементов. Если у вас в списке более 6 элементов, будут созданы дополнительные строки.
По умолчанию, элементы Flex равномерно распределяются внутри контейнера по горизонтальной оси. Мы рассмотрим различные свойства и значения.
Вы можете определять количество столбцов.Распределение строк и столбцов внутри родительского элемента определяется свойствами CSS Flex flex-direction, flex-wrap и некоторыми другими, которые будут продемонстрированы дальше.
:У нас есть произвольное n-количество элементов, расположенных в контейнере. По умолчанию элементы растягиваются слева направо. Однако направление можно изменить.Direction
Можно задать направление движения элементов (по умолчанию слева направо).
flex-direction: row-reverse изменяет направление движения списка элементов. По умолчанию стоит значение row, что означает движение слева направо.
Wrap
flex-wrap: wrap определяет перенос элементов на другую строку, когда в родительском контейнере заканчивается место.
Flow
flex-flow включает в себя flex-direction и flex-wrap, что позволяет определять их с помощью одного свойства.
Примеры:
Направление можно изменить, чтобы сделать вертикальную ось главной.
Когда мы меняем flex-direction на column, свойство flex-flow ведет себя точно так же, как и в предыдущих примерах. За исключением wrap-reverse, когда элементы переносятся снизу вверх.
justify-content
Я получил много просьб прояснить приведенный выше пример. Для этого я создал анимацию:
Анимированные возможности justify-content.Надеюсь, эта CSS-анимация поможет лучше понять работу justify content.
Свойства следующие:flex-direction:row; justify-content: flex-start | flex-end | center | space-between | space-around | stretch | space-evenly. В этом примере мы используем только 3 элемента в строке.
Нет никаких ограничений на количество элементов, которые можно использовать в Flex. Эти диаграммы демонстрируют только поведение элементов, когда одно из перечисленных значений применяется к свойству justify-content .
То же свойство justify-content используется для выравнивания элементов, когда flex-direction: column.Packing Flex Lines (согласно спецификации Flex)
Я не уверен, реализовано ли это в каком-либо браузере, но когда-то это было частью спецификации CSS-flex и, вероятно, стоит упомянуть об этом для полноты картины.
В спецификации Flex это называется «Packing Flex Lines». По сути, это работает так же, как в примерах выше. Однако стоит обратить внимание, что интервал расположен между целыми группами элементов. Это полезно, когда вы хотите создать зазоры между группами.
Packing Flex Lines, но теперь с flex-direction: columnalign-items
align-items контролирует выравнивание элементов по горизонтали относительно родительского контейнера.
flex-basis
flex-basis работает аналогично другому свойству CSS: min-width. Оно увеличивает размер элемента в зависимости от содержимого. Если свойство не задействуется, то используется значение по умолчанию.
flex-grow
flex-grow применяется к конкретному элементу и масштабирует его относительно суммы размеров всех других элементов в той же строке, которые автоматически корректируются в соответствии с заданным значением свойства. В примере значение flex-grow для элементов было установлено на 1, 7 и (3 и 5) в последней строке.
flex-shrink
flex-shrink — это противоположность flex-grow. В примере значение flex-shrink равно 7. При таком значении размер элемента равен 1/7 размера окружающих его элементов (размер которых автоматически скорректирован).
При работе с отдельными элементами можно использовать только одно свойство из трёх: flex-grow , flex-shrink или flex-base.
order
Используя свойство order , можно изменить естественный порядок элементов.
justify-items
И последнее, что нужно для тех, кто хочет использовать CSS Grid вместе с Flex Box… justify-items в CSS Grid похожи на justify-content в Flex. Свойства, описанные на приведенной выше диаграмме, не будут работать в Flex, но в значительной степени эквивалентны сетке для выравнивания содержимого ячеек.
Мы в веб-студии ITSOFT перешли на Flex в 2010 году. В основе всех наших новых проектов лежит именно эта технология. Наш опыт показал, что она позволяет создавать адаптивные и кроссбраузерные сайты с действительно красивым дизайном.
При использовании Flex нужно учитывать, что:
Flex-элементы по умолчанию ужимаются под свое содержимое; Это может пригодиться, когда есть блоки, размер которых изначально неизвестен и зависит от количества контента.
Примеры: пункты меню в https://ketoplus.ru/
Внешние отступы flex-элементов не схлопываются и не выпадают, в отличие от блочной модели.
Схлопывание и выпадание отступов полезно, в основном, при верстке текстовых страниц, поэтому во избежание путаницы в отступах при создании сеток отсутствие такого поведения приходится очень кстати.
Пример: блоки в http://velpharm.ru/about/veltrade/
Flex-элементы умеют перераспределять свободное пространство вокруг себя, таким образом меняя свои размеры;
Больше не нужно вручную задавать ширину в процентах флекс-элементам, если необходимо равномерно заполнить все пространство флекс-контейнера. Браузер сам рассчитает размеры и распределит элементы по флекс-контейнеру.
Пример: главная страница http://oflomil.ru/
Внутри одного флекс-контейнера можно менять порядок флекс-элементов, хотя в DOM-дереве порядок остается неизменным.
Бывают макеты страниц, в которых порядок следования элементов отличается на мобильной и десктопной версиях. Flex справится с задачей.
Пример: разный порядок следования логотипа и навигации в шапке в мобильной и десктопной версиях (http://elmucin.ru/).
Flex-элементу можно задать не только горизонтальные автоматические отступы, но и вертикальные; к тому же есть специальные свойства, с помощью которых очень просто выравнивать элементы внутри флекс-контейнера по горизонтали или вертикали.
Пример: кнопка всегда находится в нижней части карточки статьи (https://rabiet.ru/experts/), блок продукция (https://stomatofit.ru/#products).
Flex-элементы могут переноситься на следующую строку, если указано соответствующее свойство.
Эта особенность полезна в каталогах и различных списках, где изначально количество всех элементов неизвестно. Если их станет слишком много и предусмотрен перенос, то страница в этом случае не развалится.
Пример: каталог Велфарм (http://velpharm.ru/catalog/), блок Где купить (http://valosemid/#partners, https://gopantomid.ru/)
Стоит отметить, что Flexbox поддерживается в Internet Explorer 10-11, хоть и с некоторыми оговорками.
Некоторые интересные фишки Flex мы реализовали на сайте oflomil.ru. На разводящей странице есть 3 столбца на всю высоту видимой области экрана. На мобильном они трансформируются в 3 строки, каждая из которых равномерно занимает место в видимой части экрана. На продуктовых страницах без единого скрипта реализована бегущая строка. Текстовые элементы расположены в ряд благодаря inline-flex. Все свободное пространство в ряду распределено между этими элементами равномерно. Наш собственный сайт также свёрстан с использованием Flex.
Реализация бегущей строки с FlexИз недостатков можно отметить то, что Flex не хватает при верстке писем. Не во всех почтовых клиентах он работает корректно.
В скором времени большую распространённость получит технология Grid. Однако Grid не замена Flexbox. Флексы в связке с гридами помогут решать задачи, которые раньше были сложными или вовсе невозможными. К примеру, Masonry-раскладка — одна из тех вещей, которую нельзя полноценно реализовать на данный момент. После появления возможностей спецификации Grid Layout 3 уровня в браузерах, реализация такой раскладки станет возможной и к тому же простой.
Источники: оригинал руководства с картинками
Дата-центр ITSOFT — размещение и аренда серверов и стоек в двух дата-центрах в Москве. За последние годы UPTIME 100%. Размещение GPU-ферм и ASIC-майнеров, аренда GPU-серверов, лицензии связи, SSL-сертификаты, администрирование серверов и поддержка сайтов.
Исследование CSS-свойства flex / Хабр
Вам когда-нибудь было интересно узнать о том, как работает сокращённое CSS-свойство flex
? Оно позволяет задавать значения свойств flex-grow
, flex-shrink
и flex-basis
. Я обратил внимание на то, что данное свойство чаще всего используют в виде flex: 1
, что позволяет flex-элементу растягиваться, занимая доступное пространство.
В этом материале я хочу поговорить о сокращённом свойстве flex
и о тех свойствах, значения которых устанавливают с его помощью. Я собираюсь рассказать о том, когда и почему можно пользоваться этими свойствами, приведу практические примеры.
Свойство flex-grow
CSS-свойство flex-grow
используется для настройки так называемого «коэффициента роста» элементов (flex grow factor), что позволяет этим элементам растягиваться, занимая доступное пространство. В качестве значений этого свойства можно использовать только целые числа. Рассмотрим пример.
Вот HTML-разметка:
<div> <div></div> <div></div> <div></div> </div>
Вот стили:
.wrapper { display: flex; flex-wrap: wrap; } .item { flex-grow: 1; }
Свойство flex-grow
может воздействовать на ширину или на высоту элемента, что зависит от значения свойства flex-direction
. Рассматривая следующие примеры, учитывайте то, что используемое в них свойство flex-direction
установлено в значение, задаваемое по умолчанию (row
). Если это будет не так — я об этом скажу.
Обратите внимание на то, что без использования flex-grow
ширина flex-элементов будет установлена в значение, применяемое по умолчанию, то есть — она будет равна их исходной ширине. А если используется flex-grow: 1
, то доступное свободное пространство распределяется между элементами.
Вверху свойство flex-grow не применяется. Внизу применяется flex-grow: 1
Возможно, тут у вас возникнет вопрос о том, как именно между flex-элементами распределяется свободное пространство. Это — хороший вопрос. Скоро я на него отвечу.
На следующем рисунке показано то, как элементы выглядят без использования свойства flex-grow
. Другими словами, здесь показаны элементы, имеющие свой обычный размер.
Свойство flex-grow не используется
Для того чтобы понять то, как вычисляется ширина flex-элементов, взгляните на формулы, показанные ниже. Я нашёл эти формулы в материале Саманты Минг (за что её благодарю!).
Давайте посчитаем ширину первого элемента — того, в котором находится текст CSS
.
Нахождение ширины элемента
Итак, тут используется такая формула:
Ширина элемента = ((flex-grow элемента / сумма значений flex-grow) * доступное пространство) + исходная ширина элемента
Разберём эту формулу:
flex-grow элемента
— это коэффициент роста, заданный для элемента.сумма значений flex-grow
— это сумма значений коэффициентов роста всех элементов.доступное пространство
— это свободное пространство контейнера, которое имеется в нём до применения механизмовflex-grow
.исходная ширина элемента
— это, как несложно догадаться, ширина элемента до её изменения с помощьюflex-grow
.
В результате подстановки в эту формулу реальных значений получается следующее:
Ширина элемента = ( (1 / 3) * 498) + 77 = 241
Разные значения flex-grow, задаваемые для разных элементов
В предыдущем примере для всех flex-элементов использовалось одно и то же значение flex-grow
. Попробуем теперь назначить первому элементу свойство flex-grow: 2
. Как будет вычисляться ширина элементов теперь? Рассматривая следующую формулу, помните о том, что ширина свободного пространства в нашем примере равняется 498px
.
Нахождение ширины элемента в ситуации, когда разным элементам заданы разные значения flex-grow
Как видите, тут используется тот же механизм расчёта ширины элементов, который был рассмотрен выше. Главное отличие заключается в том, что значение flex-grow
для первого элемента задано как 2
, что находит отражение в формуле расчёта ширины элементов.
Можно ли использовать 0 в качестве значения flex-grow?
Конечно можно! Так как свойство flex-grow
принимает целочисленные значения, в него можно записать и 0
. Это будет означать, что мы не хотим, чтобы flex-элемент менял бы размеры, занимая некоторую часть свободного пространства контейнера.
Последствия установки свойства flex-grow в значение 0
Как видите, элемент, которому назначено свойство flex-grow: 0
, не меняет ширину. Этот приём может быть полезен в тех случаях, когда нужно, чтобы некий flex-элемент сохранял бы свою исходную ширину.
Использование flex-grow не приводит к тому, что элементы становятся одинаковыми
Существует распространённое заблуждение, в соответствии с которым использование flex-grow
позволяет сделать так, чтобы соответствующие элементы имели бы одинаковую ширину. Это — ошибка. Смысл использования
заключается в распределении доступного пространства между элементами. Как вы могли видеть, анализируя вышеприведённые формулы, итоговая ширина flex-элементов вычисляется на основе их исходной ширины (то есть той, которую они имели до применения flex-grow
).
Если вам нужно сделать так, чтобы все элементы из некоего набора имели бы одинаковую ширину, то знайте, что сделать это можно, воспользовавшись свойством flex-basis
. Мы поговорим об этом ниже.
Свойство flex-shrink
Свойство flex-shrink
позволяет задать так называемый «коэффициент сжатия» элемента (flex shrink factor). Если размер всех flex-элементов больше, чем размер их контейнера, размер элементов будет уменьшен в соответствии с назначенными им значениями свойства flex-shrink
.
Центральному элементу назначено свойство flex-shrink: 1
Вот стили к этому примеру:
.item-2 { width: 300px; flex-shrink: 1; }
Браузер сделает ширину элемента item-2
равной 300px
при выполнении следующих условий:
- Общая ширина всех элементов меньше ширины контейнера.
- Ширина области просмотра страницы равна или больше ширины элемента.
Вот как элементы из предыдущего примера ведут себя при их выводе в областях просмотра разной ширины.
Ширина элемента с текстом Is не уменьшается до тех пор, пока на экране достаточно места для его вывода
Как видите, элемент не сжимается, сохраняя ширину в 300px
до тех пор, пока ему хватает места.
Свойство flex-basis
Свойство flex-basis
задаёт базовый размер flex-элемента, который он имеет до распределения свободного пространства в соответствии с коэффициентами гибкости, задаваемыми свойствами flex-grow
и flex-shrink
. По умолчанию, для всех значений, кроме auto
и content
, значение flex-basis
равняется ширине элемента, а при использовании свойства flex-direction: column
— его высоте.
Свойство flex-basis
принимает те же значения, которые могут принимать свойства width
и height
. Значением, задаваемым по умолчанию, является auto
, которое устанавливается на основе значения content
. Значение content
задаётся автоматически, на основе размера содержимого flex-элемента.
Применим к элементу item-1
из нашего примера следующие стили:
.item-1 { flex-grow: 0; flex-shrink: 0; flex-basis: 50%; }
Использование свойства flex-basis: 50%
Здесь первому элементу назначено свойство flex-basis: 50%
. При этом тут важно сбросить в 0
свойство flex-grow
, что позволит сделать так, чтобы размер элемента не превысил бы 50%
.
Что произойдёт, если вместо этого записать в свойство flex-basis
значение 100%
? Это приведёт к тому, что элемент займёт 100% ширины родительского элемента, а другие элементы будут перенесены на новую строку.
Вот соответствующие стили:
.item-1 { flex-grow: 0; flex-shrink: 0; flex-basis: 100%; }
Результат использования свойства flex-basis: 100%;
Сокращённое свойство flex
Свойство flex
позволяет, в сокращённом формате, задавать значения свойств flex-grow
, flex-shrink
и flex-basis
. Значением по умолчанию, которое принимает это свойство, является auto
. Оно соответствует flex: 0 1 auto
. Это означает, что оно позволяет flex-элементам увеличиваться в размерах, основываясь на размерах их содержимого.
В данном контексте мне хотелось бы обратить ваше внимание на одну важную деталь. Речь идёт о flex-элементах с абсолютными и относительными размерами. И, кстати, это не имеет отношения к CSS-позиционированию. Это относится к модели flexbox.
Flex-элементы с относительными размерами
Вот CSS-код:
.item { /* Значение, используемое по умолчанию, эквивалентно flex: 1 1 auto */ flex: auto; }
Здесь размер flex-элементов основан на их содержимом. В результате элементы, в которых больше содержимого, будут больше.
Элемент, в котором больше содержимого, будет больше
Flex-элементы с абсолютными размерами
Если же, в отличие от предыдущего примера, свойство flex-basis
будет установлено в значение 0
, это приведёт к тому, что все flex-элементы увеличатся до одного и того же размера.
Вот стиль:
.item { /* Аналогично flex: 1 1 0% */ flex: 1; }
Элементы имеют одинаковый размер
Особенности свойства flex, которые мне нравятся
Само название свойства flex
намекает на то, что оно умеет гибко работать с передаваемыми ему значениями. Это наделяет его некоторыми особенностями, которые кажутся мне привлекательными. Рассмотрим несколько примеров.
▍Одно значение без единиц измерения
Вот CSS-код:
.item { flex: 1; }
Здесь в свойство flex
записывается единственное значение без единиц измерения. Это значение будет воспринято системой как значение свойства flex-grow
. Его эквивалент будет выглядеть как flex: 1 1 0
.
▍Два значения без единиц измерения
Взглянем на следующий стиль:
. item { flex: 1 1; }
Тут мы в явном виде задаём, соответственно, значения flex-grow
и flex-shrink
. При этом flex-basis
будет сброшено в значение, применяемое по умолчанию.
▍Одно значение, представляющее собой некий размер
Поговорим о том, как будет «расшифрован» следующий стиль:
.item { flex: 100px; /* flex: 1 1 100px */ }
Значение 100px
будет рассматриваться системой как значение flex-basis
. А во flex-grow
и flex-shrink
будет, по умолчанию, записано 1
.
▍Использование значения 0 без указания единиц измерения
Предположим, нужно установить flex-basis
в значение 0
, воспользовавшись свойством flex
. Мы, для решения этой задачи, решим поступить так:
. item { flex: 0; }
Делать так не рекомендуется, так как это способно запутать и тех, кто будет читать подобный код, и браузер. Как понять — к чему именно относится этот 0
? К свойству flex-grow
, flex-shrink
или flex-basis
? В общем — путаница получается. Вот что говорится об этом в спецификации CSS:
Ноль без указания единиц измерения, перед которым нет двух значений коэффициентов гибкости, должен интерпретироваться как значение коэффициента гибкости. Для того чтобы избежать неправильной интерпретации или ошибочного объявления свойства, авторы должны, задавая нулевое значение flex-basis, использовать единицы измерения, или ставить перед этим значением два значения, относящиеся к коэффициентам гибкости.
То есть, чтобы избежать неоднозначностей, вышеприведённый код стоит переписать так:
.item { flex: 0%; /* flex: 1 1 0% */ }
Здесь используется конструкция 0%
, но можно, например, воспользоваться и конструкцией 0px
.
Пользуйтесь сокращённым свойством flex
Когда вам надо задать свойства flex-grow
, flex-shrink
и flex-basis
, лучше всего использовать для этого сокращённое свойство flex
.
Заглянем в спецификацию CSS:
Авторам рекомендуется управлять гибкими элементами, используя сокращённое свойство flex, а не применяя напрямую полные имена свойств, так как при применении сокращённого свойства производится корректный сброс неуказанных значений к состоянию, соответствующему распространённым способам их использования.
Сценарии использования и практические примеры
▍Аватары пользователей
Аватар, при настройке которого использовано свойство flex
Модель flexbox часто используется для оформления компонентов страниц, имеющих отношение к пользователям. Например, это касается аватара пользователя и соответствующей подписи, которые должны находиться на одной строке.
Вот разметка:
<div> <img src="shadeed.jpg" alt="" /> <div> <h4>Ahmad Shadeed</h4> <p>Author of Debugging CSS</p> </div> </div>
Вот стиль:
.user { display: flex; flex-wrap: wrap; align-items: center; } .user__avatar { flex: 0 0 70px; width: 70px; height: 70px; }
Обратите внимание на то, что, настраивая элемент user__avatar
, я применил свойство flex: 0 0 70px
. Это важно, так как без этой настройки в некоторых устаревших браузерах изображение может вывестись неправильно. Более того, приоритет свойства flex
выше приоритета свойства width
(если речь идёт о ситуации, в которой применяется flex-direction: row
) и свойства height
(в ситуации, когда применяется flex-direction: column
).
Если изменить размер аватара, воздействуя только на свойство flex
, браузер проигнорирует то, что задано в свойстве width
. Вот соответствующий стиль:
.user__avatar { /* Ширина будет 100px, а не 70px */ flex: 0 0 100px; width: 70px; height: 70px; }
▍Заголовок элемента
Заголовок элемента
Предположим, нам надо оформить заголовок некоего элемента. Этот заголовок должен занять всё доступное ему пространство. Решить эту задачу можно с помощью свойства flex: 1
:
.page-header { display: flex; flex-wrap: wrap; } .page-header__title { flex: 1; }
▍Поле ввода для подготовки сообщения
Поле ввода
Подобные поля часто встречаются в приложениях для обмена сообщениями, вроде тех, что есть в Facebook и Twitter. Такое поле должно занимать всё доступное ему пространство. При этом кнопка для отправки сообщения должна иметь фиксированную ширину. Вот как это выглядит в CSS:
form { display: flex; flex-wrap: wrap; } input { flex: 1; /* Другие стили */ }
Этот пример являет собой удачную демонстрацию использования свойства flex-grow
.
Надо отметить, что некоторым способам использования свойства flex
не уделяется достаточно внимания в публикациях, посвящённых этому свойству. Давайте это исправим.
▍Выравнивание нижних элементов, находящихся на разных карточках
Цель — выровнять обе даты по красной линии
Предположим, что перед нами — макет, сформированный средствами CSS Grid, в котором имеются две колонки. Проблема тут в том, что даты, выводимые в конце текстового содержимого карточек, не выровнены. А нам нужно, чтобы они находились бы на одной линии, показанной на предыдущем рисунке.
Для решения этой задачи можно воспользоваться моделью flexbox.
Вот разметка:
<div> <img src="thumb.jpg" alt=""> <h4>Title short</h4> <time></time> </div>
Достичь нашей цели можно, воспользовавшись свойством flex-direction: column
. Элемент card__title
, заголовок, можно стилизовать, применив свойство flex-grow
и сделав так, чтобы он занимал бы всё доступное ему пространство. В результате окажется, что строка с датой попадёт в нижнюю часть карточки. Так произойдёт даже в том случае, если сам заголовок окажется достаточно коротким.
Вот стили:
.card { display: flex; flex-direction: column; } /* Первое решение */ .card__title { flex-grow: 1; }
Решить эту задачу можно и не прибегая к свойству flex-grow
. А именно, речь идёт о применении модели flexbox и механизма автоматической настройки внешних отступов с использованием ключевого слова auto
. Я, кстати, написал об этом подробную статью.
/* Второе решение */ .card__date { margin-top: auto; }
Использование разных значений для коэффициентов гибкости
В этом разделе я хочу рассказать об использовании свойств flex-grow
и flex-shrink
, которым назначают значения, отличные от 1
. Сейчас я приведу несколько практических примеров использования подобной схемы настройки этих свойств.
▍Панели управления
Набор элементов управления
На подготовку этого примера меня вдохновил дизайн Facebook (значки я тоже взял оттуда). На панели управления (элемент actions
в следующем коде) имеется четыре элемента. Последний (элемент actions__item.user
) имеет ширину, которая меньше, чем ширина других элементов. Сформировать подобную панель управления можно так:
.actions { display: flex; flex-wrap: wrap; } .actions__item { flex: 2; } .actions__item.user { flex: 1; }
▍Анимация, в ходе которой элемент растягивается
Элемент растягивается при наведении на него указателя мыши
Flex-элементы можно анимировать при наведении на них указателя мыши. Этот приём может оказаться крайне полезным. Вот соответствующий CSS-код:
. palette { display: flex; flex-wrap: wrap; } .palette__item { flex: 1; transition: flex 0.3s ease-out; } .palette__item:hover { flex: 4; }
Здесь можно найти видео, демонстрирующее всё это в действии.
▍Увеличение размера активной карточки
Мне очень нравится этот проект на CodePen, в котором реализован механизм увеличения размеров карточки с описанием тарифного плана, по которой щёлкнул пользователь. Размер карточки меняется благодаря установке её свойства flex-grow
в значение 4
.
Увеличение размера активной карточки
▍Что делать, если содержимое контейнера больше самого контейнера?
Элементы не помещаются в контейнер
Некоторое время тому назад мне пришло письмо от одного из моих читателей, который рассказал мне о возникшей у него проблеме и попросил помочь с её решением. Суть этой проблемы представлена на предыдущем рисунке. Здесь есть пара изображений, которые должны находиться в пределах элемента-контейнера, но размер этих изображений больше размеров контейнера.
Попробуем такой стиль:
.wrapper { display: flex; } .wrapper img { flex: 1; }
Но даже при использовании свойства flex: 1
изображения в контейнер не помещаются. Обратимся к спецификации CSS:
Flex-элементы, по умолчанию, не уменьшаются в размерах до величин, меньших, чем размеры их содержимого (длина самого длинного слова или элемента с фиксированным размером). Для того чтобы это изменить, нужно воспользоваться свойствами min-width или min-height.
В нашем случае проблема заключается в том, что изображения слишком велики и модель flexbox не уменьшает их до таких размеров, чтобы они поместились бы в контейнер. Исправить это можно так:
.wrapper img { flex: 1; min-width: 0; }
Подробности смотрите в этой моей статье.
Итоги
Здесь я рассказал вам о свойстве flex
и о том, как им пользоваться. Надеюсь, вы узнали из этого материала что-то новое и полезное.
Пользуетесь ли вы CSS-свойством flex в своих проектах?
Свойство flex | CSS справочник
CSS свойстваОпределение и применение
CSS свойство flex является короткой записью для свойств, которые позволяют определить размер для флекс элемента, установленный по умолчанию, указать на сколько элемент может увеличится, либо уменьшится по отношению к остальным флекс элементам в одном контейнере, а именно:
- flex-grow (number | initial | inherit)
- flex-shrink (number | initial | inherit)
- flex-basis (auto | width | initial | inherit)
Поддержка браузерами
Свойство | Chrome | Firefox | Opera | Safari | IExplorer | Edge |
---|---|---|---|---|---|---|
flex | 29. 0 21.0 -webkit- | 28.0 18.0 -moz- | 17.0 | 9.0 6.1 -webkit- | 11.0 10.0 -ms- | 12.0 |
CSS синтаксис:
flex:"flex-grow flex-shrink flex-basis | auto | none | initial | inherit"; Если указывается одно числовое значение оно устанавливается для flex-grow, если указаны единицы измерения CSS, то для flex-basis Если второе значение соответствует числовому значению, то оно устанавливается для flex-shrink, если указаны единицы измерения CSS, то для flex-basis и т.п.
JavaScript синтаксис:
object.style.flex = "0 1 auto"
Значения свойства
Значение | Описание |
---|---|
flex-grow | Число, которое указывает, на сколько будет увеличен блок по отношению к остальным флекс элементам в контейнере. Отрицательные значения не допускаются. Значение по умолчанию 0. |
flex-shrink | Число, которое указывает, на сколько будет уменьшен блок по отношению к остальным флекс элементам в контейнере (при недостатке свободного пространства). Отрицательные значения не допускаются. Значение по умолчанию 1. |
flex-basis | Определяет размер для флекс элемента, установленный по умолчанию перед распределением пространства в контейнере. Отрицательные значения не допускаются. Размер указывается в единицах измерения CSS(px, em, pt и т.д.), либо высчитывается автоматически браузером исходя из содержания элемента. Значение по умолчанию auto. |
auto | Соответствует значению flex : 1 1 auto;. |
none | Соответствует значению flex : 0 0 auto;. |
initial | Устанавливает свойство в значение по умолчанию. Соответствует значению flex : 0 1 auto;. |
inherit | Указывает, что значение наследуется от родительского элемента. |
Версия CSS
CSS3Наследуется
Нет.Анимируемое
Да.Пример использования
Рассмотрим пример увеличения флекс элементов в CSS, используя свойство flex:
<!DOCTYPE html> <html> <head> <title>Увеличение флекс элементов в CSS</title> <style> . container { width: 100%; /* устанавливаем ширину блока */ height: 100px; /* устанавливаем высоту блока */ display: -webkit-flex; /* для поддержки ранних версий браузеров */ display: flex; /* элемент отображается как блочный flex-контейнер */ color: white; /* устанавливаем цвет шрифта */ } .container div:nth-of-type(1) { псевдокласс :nth-of-type() выбирает каждый указанный элемент, который является заданным дочерним элементом своего родительского элемента (выбираем первый <div> в контейнере) -webkit-flex: 1; /* для поддержки ранних версий браузеров */ flex: 1; /* число, которое указывает, на сколько будет увеличен блок по отношению к остальным флекс элементам */ background: orange; /* устанавливаем цвет заднего фона */ } .container div:nth-of-type(2) { псевдокласс :nth-of-type() выбирает каждый указанный элемент, который является заданным дочерним элементом своего родительского элемента (выбираем второй <div> в контейнере) -webkit-flex: 3; /* для поддержки ранних версий браузеров */ flex: 3; /* число, которое указывает, на сколько будет увеличен блок по отношению к остальным флекс элементам */ background: brown; /* устанавливаем цвет заднего фона */ } . container div:nth-of-type(3) { псевдокласс :nth-of-type() выбирает каждый указанный элемент, который является заданным дочерним элементом своего родительского элемента (выбираем третий <div> в контейнере) -webkit-flex: 1; /* для поддержки ранних версий браузеров */ flex: 1; /* число, которое указывает, на сколько будет увеличен блок по отношению к остальным флекс элементам */ background: tan; /* устанавливаем цвет заднего фона */ } </style> </head> <body> <div class = "container"> <div>1</div> <div>3</div> <div>1</div> </div> </body> </html>Пример использования CSS свойства flex(увеличение флекс элементов в CSS).
Рассмотрим пример уменьшения флекс элементов в CSS, используя свойство flex:
<!DOCTYPE html> <html> <head> <title>Уменьшение флекс элементов в CSS</title> <style> .container { width: 250px; /* устанавливаем ширину блока */ height: 100px; /* устанавливаем высоту блока */ display: -webkit-flex; /* для поддержки ранних версий браузеров */ display: flex; /* элемент отображается как блочный flex-контейнер */ color: white; /* устанавливаем цвет шрифта */ /* устанавливаем два свойства для возможности масштабировать контейнер по горизонтали (изменять ширину): */ overflow: auto; /* указываем, что при переполнении содержимое отображается (автоматический режим) */ resize: horizontal; /* пользователь может изменять ширину элемента */ } . container div:nth-of-type(1) { псевдокласс :nth-of-type() выбирает каждый указанный элемент, который является заданным дочерним элементом своего родительского элемента (выбираем первый <div> в контейнере) -webkit-flex: 0 1 150px; /* для поддержки ранних версий браузеров */ flex: 0 1 150px; /* блоки по отношению к другим не увеличиваем(значение 0), указываем, что блок при недостатке места будет уменьшен по умолчанию(1), определяем начальную ширину флекс элемента (приведет сразу к уменьшению второго блока, т.к. ширина контейнера 250px) */ background: orange; /* устанавливаем цвет заднего фона */ } .container div:nth-of-type(2) { псевдокласс :nth-of-type() выбирает каждый указанный элемент, который является заданным дочерним элементом своего родительского элемента (выбираем второй <div> в контейнере) -webkit-flex: 0 3 150px; /* для поддержки ранних версий браузеров */ flex: 0 3 150px; /* блоки по отношению к другим не увеличиваем(значение 0), указываем, что блок при недостатке места будет уменьшен по отношению к другим на 3, определяем начальную ширину флекс элемента (приведет сразу к уменьшению второго блока, т. к. ширина контейнера 250px) */ background: brown; /* устанавливаем цвет заднего фона */ } .container div:nth-of-type(3) { псевдокласс :nth-of-type() выбирает каждый указанный элемент, который является заданным дочерним элементом своего родительского элемента (выбираем третий <div> в контейнере) -webkit-flex: 0 1 150px; /* для поддержки ранних версий браузеров */ flex: 0 1 150px; /* блоки по отношению к другим не увеличиваем(значение 0), указываем, что блок при недостатке места будет уменьшен по умолчанию(1), определяем начальную ширину флекс элемента (приведет сразу к уменьшению второго блока, т.к. ширина контейнера 250px) */ background: tan; /* устанавливаем цвет заднего фона */ } </style> </head> <body> <div class = "container"> <div>1</div> <div>3</div> <div>1</div> </div> </body> </html>Пример использования CSS свойства flex(уменьшение флекс элементов в CSS).
Рассмотрим пример, где мы укажем значение ширины флекс элемента по умолчанию, используя при этом единицы измерения CSS и в автоматическом режиме, используя свойство flex:
<!DOCTYPE html> <html> <head> <title>Размер флекс элементов по умолчанию в CSS</title> <style> . container { width: 250px; /* устанавливаем ширину блока */ height: 100px; /* устанавливаем высоту блока */ display: -webkit-flex; /* для поддержки ранних версий браузеров */ display: flex; /* элемент отображается как блочный flex-контейнер */ color: white; /* устанавливаем цвет шрифта */ /* устанавливаем два свойства для возможности масштабировать контейнер по горизонтали (изменять ширину): */ overflow: auto; /* указываем, что при переполнении содержимое отображается (автоматический режим) */ resize: horizontal; /* пользователь может изменять ширину элемента */ } .container div:nth-of-type(1) { псевдокласс :nth-of-type() выбирает каждый указанный элемент, который является заданным дочерним элементом своего родительского элемента (выбираем первый <div> в контейнере) -webkit-flex: 0 1 auto; /* для поддержки ранних версий браузеров */ flex: 0 1 auto; /* для элемента задано значение по умолчанию (ширина элемента расчитывается по содержимомку) */ background: orange; /* устанавливаем цвет заднего фона */ } . container div:nth-of-type(2) { псевдокласс :nth-of-type() выбирает каждый указанный элемент, который является заданным дочерним элементом своего родительского элемента (выбираем второй <div> в контейнере) -webkit-flex: 0 1 150px; /* для поддержки ранних версий браузеров */ flex: 0 1 150px; /* элемент не увеличиваем и не уменьшаем по отношению к другим, но значение ширины по умолчанию устанавливаем равной 150px */ background: brown; /* устанавливаем цвет заднего фона */ } .container div:nth-of-type(3) { псевдокласс :nth-of-type() выбирает каждый указанный элемент, который является заданным дочерним элементом своего родительского элемента (выбираем третий <div> в контейнере) -webkit-flex: 0 1 auto; /* для поддержки ранних версий браузеров */ flex: 0 1 auto; /* для элемента задано значение по умолчанию (ширина элемента расчитывается по содержимомку) */ background: tan; /* устанавливаем цвет заднего фона */ } </style> </head> <body> <div class = "container"> <div>auto</div> <div>150px</div> <div>auto</div> </div> </body> </html>Пример использования CSS свойства flex(размер флекс элементов по умолчанию в CSS). CSS свойства
CSS свойство flex
❮ Назад Вперед ❯
Свойство flex определяет компоненты гибкой длины. Это сокращенное свойство для flex-grow, flex-shrink и flex-basis. Flex-shrink и flex-basis — дополнительные свойства, т. е. нет необходимости включать их в объявление flex.
Свойство flex является частью модуля макета гибкого контейнера. Если нет гибких элементов, свойство flex не будет иметь эффекта.
Если не включать свойство flex-grow в сокращенное объявление, значение будет равно 1 по умолчанию. Если не включать свойство flex-shrink в сокращенное объявление, значение будет равно 1 по умолчанию. Фактор свойства flex-shrink увеличивается с помощью flex-basis, когда есть распределенное отрицательное пространство. Когда свойство flex-basis не включено в сокращенное объявление, будет задано значение 0%.
«Auto» — значение по умолчанию свойства flex. Это свойство устанавливает размер элементов на основе свойства width/height. (Если свойство задает основной размер элемента как «auto», это значение устанавливает размер флекс-элемента на основе его контента.)
Значение «initial» устанавливает размер элемента на основе свойства width/height (или на основе контента, если свойства не заданы). При этом значении элемент становится негибким, если доступно свободное пространство, но дает возможность максимально уменьшить элемент в случае недостаточного пространства. Возможности выравнивания и auto margins могут быть использованы для выравнивания флекс-элементов по главной оси.
Значение «none» устанавливает размер элемента на основе свойств width и height. Является полностью негибким.
Примечание: Начальные значения свойств flex-grow и flex-shrink отличаются от их значений по умолчанию, когда они не включены в сокращенное объявление flex.
flex: flex-grow | flex-shrink | flex-basis | auto | initial | inherit;
Пример
<!DOCTYPE html> <html> <title>Заголовок документа</title> <head> <style> . box { width: 350px; height: 200px; padding-left: 0; list-style-type: none; border: 1px dashed black; display: -webkit-flex; display: flex; } .box div { flex: 1; } .green {background-color: #8ebf42} .blue {background-color: #1c87c9;} .gray {background-color: #666} </style> </head> <body> <h3>Пример свойства flex</h3> <div> <div>GREEN</div> <div>BLUE</div> <div>GRAY</div> </div> </body> </html>
Попробуйте сами!
Пример, где один из элементов имеет другой размер:
Пример
<!DOCTYPE html> <html> <head> <title>Заголовок документа</title> <style> . box { width: 320px; height: 120px; border: 1px solid #666; display: -webkit-flex; /* Safari */ display: flex; } /* Safari 6.1+ */ .box div:nth-of-type(1) {-webkit-flex-grow: 1;} .box div:nth-of-type(2) {-webkit-flex-grow: 4;} .box div:nth-of-type(3) {-webkit-flex-grow: 1;} .box div:nth-of-type(4) {-webkit-flex-grow: 1;} .box div:nth-of-type(5) {-webkit-flex-grow: 1;} /* Standard syntax */ .example div:nth-of-type(1) {flex-grow: 1;} .example div:nth-of-type(2) {flex-grow: 4;} .example div:nth-of-type(3) {flex-grow: 1;} .example div:nth-of-type(4) {flex-grow: 1;} .example div:nth-of-type(5) {flex-grow: 1;} </style> </head> <body> <h3>Пример flex-grow</h3> <div> <div></div> <div></div> <div></div> <div></div> <div></div> </div> </body> </html>
Попробуйте сами!
Пример с flex-shrink:
Пример
<!DOCTYPE html> <html> <head> <title>Заголовок документа</title> <style> . box { width: 320px; height: 120px; border: 1px solid #666; display: -webkit-flex; /* Safari */ display: flex; } .box div { -webkit-flex-grow: 1; /* Safari 6.1+ */ -webkit-flex-shrink: 2; /* Safari 6.1+ */ -webkit-flex-basis: 100px; /* Safari 6.1+ */ flex-grow: 1; flex-shrink: 2; flex-basis: 100px; } .box div:nth-of-type(2) { -webkit-flex-shrink: 5; /* Safari 6.1+ */ flex-shrink: 5; } </style> </head> <body> <h3>Пример flex-shrink</h3> <div> <div></div> <div></div> <div></div> <div></div> <div></div> </div> </body> </html>
Попробуйте сами!
Обзор CSS Flexbox layout — технологии для расположения блоков на HTML-странице
Flexbox разработан для оптимизации раскладки элементов, в отличие от float. Он облегчает выравнивание элементов по горизонтали и вертикали, смену направления и порядок отображения элементов, позволяет растягивать блоки на всю высоту родителя или опускать их к нижнему краю.
В статье проведем краткое знакомство с технологией Flexbox. Решив ее использовать, приготовьтесь поменять свои привычные представления о выстраивании элементов в потоке. И дайте себе немного времени на адаптацию к новому подходу.
Что же такое Flexbox
С уверенностью можно сказать, что Flexbox призван помочь нам с некоторыми особо неприятными моментами CSS (например, вертикальное выравнивание). И в решении данного вопроса ему нет равных. Но порой разобраться в принципах работы этой технологии бывает сложно. Особенно если у вас не хватает опыта или вы совсем новичок.
Главная задача Flexbox — сделать слои гибкими, а работу с ними максимально простой. Идея гибкой (flex) разметки — позволить контейнеру менять ширину/высоту (и порядок) своих элементов, чтобы наилучшим образом заполнить доступное пространство (в основном для размещения на всех типах и размерах экранов). Flexbox контейнер расширяет элементы, чтобы заполнить свободное пространство, или сжимает их, чтобы избежать переполнения.
Так как Flexbox — это полноценный модуль, а не отдельное свойство, он содержит целый набор свойств.
Некоторые элементы предназначены для работы с родительским контейнером «flex-контейнер». А другие касаются дочерних элементов (известных, как «flex-элементы»).
Если обычная система компоновки основана на блочных и строковых направлениях, то Flexbox основан на «flex-flow направлениях».
Чтобы начать работать с Flexbox, нам нужно сделать наш контейнер flex-контейнером. Делается это так:
<div class="flex-container"> <div class="box box-1">Item 1</div> <div class="box box-2">Item 2</div> <div class="box box-3">Item 3</div> <div class="box box-4">Item 4</div> </div> .flex-container { display: flex; }
Как можно заметить, элементы выстроились в ряд.
Flex-direction
У flex-контейнера есть две оси: главная ось и перпендикулярная ей.
По умолчанию все предметы располагаются вдоль главной оси: слева направо. Из-за этого блоки выровнялись в линию, когда мы применили свойство display:flex;
Свойство flex-direction
позволяет вращать главную ось.
Важно, что свойство flex-direction: column
не выравнивает квадраты по оси, перпендикулярной главной. Главная ось сама меняет свое расположение и теперь направлена сверху вниз.
Также существует еще несколько параметров для flex-direction
: row-reverse и column-reverse.
.flex-container { display: flex; flex-direction: column-reverse; }
.flex-container { display: flex; flex-direction: row-reverse; }
Justify-сontent
Свойство justify-content:
может принимать пять разных значений:
flex-start; flex-end; center; space-between; space-around.
Работу всех этих свойств можно посмотреть, вписав в пример ниже:
Если justify-content
работает с главной осью, то align-items
работает с осью, перпендикулярной главной оси.
Свойство также может принимать пять разных значений:
flex-start; flex-end; center; stretch; baseline;
Как показано в примере, свойства justify-content
и align-items
довольно легко объединять:
Align-self
Align-self
позволяет выравнивать элементы по отдельности.
.flex-container { display: flex; min-height:100px; flex-direction: row; justify-content: center; align-items: flex-start; }
.box-1 { width:50px; } .box-2 { width:70px; } .box-3 { align-self:center; width:90px; } .box-4 { align-self:flex-end; }
Flex-grow
Свойство определяет возможность элемента увеличиваться в размере при необходимости. Оно принимает безразмерное значение в качестве пропорции, которое определяет, какое количество свободного пространства внутри контейнера должен занимать элемент.
Если у всех элементов свойство flex-grow
установлено в 1
, то свободное пространство внутри контейнера будет равномерно распределено между всеми элементами. Если у одного из элементов значение установлено в 2
, то элемент будет занимать в два раза больше пространства, чем остальные (по крайней мере попытается).
<div class="flex-container"> <div class="box box-1">Item 1</div> <div class="box box-2">Item 2</div> <div class="box box-3">Item 3</div> <div class="box box-4">Item 4</div> </div> .box-1 { flex-grow: 1; } .box-2 { flex-grow: 2; } .box-3 { flex-grow: 3; } .box-4 { flex-grow: 4; }
Указывать отрицательные числа нельзя.
Flex-shrink
Это свойство определяет возможность элемента уменьшаться в размере, при необходимости.
.item { flex-shrink: <number>; /* по умолчанию 1 */ }
Указывать отрицательные числа нельзя.
Flex
Это сокращение для flex-grow
, flex-shrink
и flex-basis
. Второй и третий параметры (flex-shrink и flex-basis) не обязательны. Значение по умолчанию установлено в 0 1 auto.
Рекомендуется использовать это сокращённое свойство, а не указывать значения индивидуально.
Поддержка браузерами
Chrome - 21+ Safari - 3.1+ Firefox - 22+ Opera - 12.1+ IE - 11 Edge Android - 2.1+ iOS - 3.2+
Заключение
В этой статье я попытался изложить все довольно сжато, но информативно. Flexbox все чаще и чаще начинает встречаться в разработке различных проектов, и у него определенно большое будущее.
Эта технология больше подходит для компонентов приложения и небольших макетов, хотя и весьма сложных, тогда как спецификация CSS Grid Layout предназначена для более масштабных макетов.
Плюсы
- Не нужны сетки различных HTML-фреймворков
- Управление блоками абсолютно наглядно и гибко.
- Полностью решена проблема вертикального позиционирования.
- Полная поддержка всеми современными браузерами, кроме Internet Explorer.
Минусы
- Невозможность использования под Internet Explorer 9.
- Internet Explorer 10+ не понимают некоторые условия Flexbox.
Этот материал на английском языке — CSS Flex-Box: Web-Development Guide
Читайте также: Обзор CSS Grid — технологии для упрощения разметки HTML-страниц
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.
Теми: CSS, frontend, HTML, tech, Web
flex-basis — CSS: Каскадные таблицы стилей
CSS-свойство flex-basis
задает начальный основной размер гибкого элемента. Он устанавливает размер блока содержимого, если не указано иное с помощью box-sizing
.
В этом примере для свойств flex-grow
и flex-shrink
установлено значение 1
для всех трех элементов, что указывает на то, что flex-элемент может увеличиваться и уменьшаться от исходного flex-basis
.
Демо затем изменяет flex-basis
на первый элемент. Затем он будет расти и сжиматься от этой гибкой основы. Это означает, что, например, когда flex-basis
первого элемента равен 200px
, он будет начинаться с 200px, но затем сжиматься, чтобы соответствовать доступному пространству, а другие элементы имеют размер не менее min-content
. .
На изображении ниже показано, как Firefox Flexbox Inspector помогает понять, какой размер становится у элементов:
Примечание: В случае, если для элемента установлены flex-basis
(кроме auto
) и width
(или height
в случае flex-direction: column
) , база
имеет приоритет.
/* Укажите <'ширину'> */ flex-база: 10em; flex-база: 3px; flex-база: 50%; flex-основа: авто; /* Ключевые слова внутреннего размера */ flex-basis: максимальное содержание; flex-база: мин-контент; flex-basis: fit-контент; /* Автоматический размер на основе содержимого гибкого элемента */ flex-база: контент; /* Глобальные значения */ flex-база: наследовать; flex-база: начальная; flex-база: вернуться; flex-basis: revert-слой; flex-база: не установлена;
Свойство flex-basis
указывается либо как ключевое слово content
, либо как <'width'>
.
Значения
-
<'ширина'>
Абсолютное
auto
. Отрицательные значения недействительны. По умолчаниюавто
.-
содержание
Указывает автоматическое изменение размера на основе содержимого гибкого элемента.
Примечание: Это значение отсутствовало в первоначальном выпуске Flexible Box Layout, поэтому некоторые более старые реализации не поддерживают его. Аналогичный эффект можно получить, используя
auto
вместе с основным размером (шириной или высотой)auto
.- Первоначально
flex-basis:auto
означало «посмотрите на мойширина
иливысота
недвижимость». - Затем
flex-basis:auto
было изменено на автоматическое изменение размера, а «основной размер» был введен как ключевое слово «посмотрите на мое свойствоwidth
илиheight
». Он был реализован в ошибке 1032922. - Затем это изменение было отменено в ошибке 1093316, поэтому
auto
еще раз означает «посмотрите на мое свойствоwidth
илиheight
«; и новое ключевое словоcontent
вводится для запуска автоматического изменения размера. (ошибка 1105111 связана с добавлением этого ключевого слова).
- Первоначально
flex-basis =
контент |
<'width'>
Установка начальных размеров гибкого элемента
HTML
- 1: тест на основе гибкости
- 2: тест на гибкость
- 3: тест на гибкость
- 4: проверка гибкости
- 5: проверка гибкости
КСС
.контейнер { семейство шрифтов: arial, без засечек; маржа: 0; заполнение: 0; тип стиля списка: нет; дисплей: гибкий; flex-wrap: обернуть; } .flex { фон: #6ab6d8; отступ: 10 пикселей; нижняя граница: 50 пикселей; граница: 3 пикселя сплошная #2e86bb; белый цвет; размер шрифта: 14px; выравнивание текста: по центру; положение: родственник; } . flex :: после { положение: абсолютное; z-индекс: 1; слева: 0; верх: 100%; поле сверху: 10px; ширина: 100%; цвет: #333; размер шрифта: 12px; } .flex1 { flex-основа: авто; } .flex1 :: после { содержание: "авто"; } .flex2 { flex-basis: максимальное содержание; } .flex2 :: после { контент: "максимальное содержание"; } .flex3 { flex-база: мин-контент; } .flex3 :: после { контент: "мин-контент"; } .flex4 { flex-basis: fit-контент; } .flex4:: после { контент: "фит-контент"; } .flex5 { flex-база: контент; } .flex5:: после { контент: "контент"; }
Результаты
Спецификация |
---|
Неизвестная спецификация # Flex-Basis-Property |