Свойство flex — это один из двух инструментов для построения сеток и микросеток на странице. Свойство основано на концепции гибкого макета, где элементы могут растягиваться или сжиматься, чтобы использовать доступное пространство на странице наиболее эффективно.

🚀 Сегодня вам бесплатно доступен тренажёр по HTML и CSS.

Синтаксис

ul {
  display: flex;
  flex-direction: row;
}
Простая сетка из 3 элементов
Простая сетка из 3 элементов

Значения свойства flex

  • flex-grow
  • flex-shrink
  • flex-basis
  • flex-direction
  • flex-wrap
  • justify-content
  • align-items
  • align-self
  • order

Разберём значения на примерах.

Flex-grow

Значение flex-grow определяет, как элементы будут растягиваться внутри контейнера, когда есть свободное пространство. flex-grow может принимать целые или дробные числовые значения и по умолчанию равно 0. Если задать flex-grow значение больше нуля, то флекс-элемент растянется на всё оставшееся во флекс-контейнере свободное пространство.

.container {
  display: flex;
}

.item-puppy {
  flex-grow: 0;
}

.item-cat {
  flex-grow: 1;
}
Второй элемент занимает всё свободное пространство контейнера, так как flex-grow равно 1
Второй элемент занимает всё свободное пространство контейнера, так как flex-grow равно 1

Если флекс-элементам задать одинаковые положительные значения flex-grow, то они поровну поделят между собой свободное пространство.

.container {
  display: flex;
}

.item-puppy {
  flex-grow: 1;
}

.item-cat {
  flex-grow: 1;
}
У обоих элементов flex-grow равен 1, поэтому они делят всё свободное пространство пополам
У обоих элементов flex-grow равен 1, поэтому они делят всё свободное пространство пополам

Flex-shrink

Значение flex-shrink отвечает за гибкость и сжатие элементов, когда доступное пространство ограничено. Принимает числовое значение, которое указывает, какую долю свободного пространства элемент займёт при сжатии относительно других элементов в контейнере. По умолчанию равно 1.

Все флекс-элементы по умолчанию могут сжиматься, если после определения размеров выяснилось, что места во флекс-контейнере не хватает. Если один элемент имеет flex-shrink: 2, а другие — flex-shrink: 1, первый элемент будет сжиматься в два раза больше остальных. В целом значение flex-shrink используется достаточно редко. Если в микросетке большое количество элементов, то обычно сразу включают многострочный флекс-контейнер, чтобы элементы не деформировались.

.container {
  display: flex;
}

.item-puppy {
  flex-shrink: 2;
}

.item-cat {
  flex-shrink: 1;
}

.item-corgi {
  flex-shrink: 1;
}
У первого элемента значение flex-shrink равно 2, поэтому он сжимается большее остальных элементов
У первого элемента значение flex-shrink равно 2, поэтому он сжимается большее остальных элементов

Flex-basis

Свойство flex-basis задает начальный размер элемента перед распределением доступного пространства. Можно указать значение в px, mm или в процентах вдоль главной оси. Значение по умолчанию — auto.

Свойство flex-basis сильнее width и height, оно их переопределит, если встретится с ними на одном и том же флекс-элементе.

.container {
  display: flex;
}

.item-puppy {
  height: 220px;
  width: 220px;
  flex-basis: 300px;
}

.item-cat {
  height: 220px;
  width: 220px;
}

.item-corgi {
  height: 220px;
  width: 220px;
}
У первого элемента свойство flex-basis переопределяет размеры и элемент становится шире
У первого элемента свойство flex-basis переопределяет размеры и элемент становится шире

Flex-direction

Свойство flex-direction определяет направление элементов в контейнере — горизонтальное или вертикальное, что дает большую гибкость в создании различных макетов.

Можно указать одно из четырех значений:

row — значение по умолчанию, указывает, что элементы располагаются горизонтально в контейнере. Порядок элементов определяется их последовательностью в разметке.

.container { 
  display: flex; 
  flex-direction: row;
}
Элементы располагаются горизонтально по порядку, определённому в разметке
Элементы располагаются горизонтально по порядку, определённому в разметке

row-reverse указывает, что элементы располагаются в контейнере горизонтально, но в обратном порядке. Первый элемент становится последним, а последний элемент — первым.

css .container { display: flex; flex-direction: row-reverse; }

Элементы располагаются горизонтально в обратном порядке
Элементы располагаются горизонтально в обратном порядке

column указывает, что элементы располагаются вертикально в контейнере. Каждый элемент занимает отдельную строку внутри контейнера.

css .container { display: flex; flex-direction: column; }

Элементы располагаются вертикально по порядку в разметке
Элементы располагаются вертикально по порядку в разметке

column-reverse указывает, что элементы располагаются в контейнере вертикально, но в обратном порядке. Первый элемент перемещается на последнее место, а последний — на первое.

.container {
  display: flex;
  flex-direction: column-reverse;
}
Первый по разметке элемент располагается на последнем месте и элементы перестраиваются
Первый по разметке элемент располагается на последнем месте и элементы перестраиваются

Flex-wrap

Свойство flex-wrap определяет, должны ли элементы переноситься на новую строку или оставаться на одной. Имеет три значения — nowrap, wrap, wrap-reverse.

nowrap — значение по умолчанию, указывает, что элементы располагаются в контейнере в одну строку или столбец. Если элементы не помещаются по ширине или высоте контейнера, они будут масштабироваться.

.container {
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
}

.blue {
  height: 220px;
  width: 220px;
  background: #4b9eb3;
}
  
.item-puppy {
  height: 220px;
  width: 220px;
  background-image: url(./images/puppy.jpg);  
}

.pink {
  height: 220px;
  width: 220px;
  background: #e78830;
}
  
.item-cat {
  height: 220px;
  width: 220px;
  background-image: url(./images/cat.jpg);
}
Все элементы располагаются на одной строке
Все элементы располагаются на одной строке

wrap — элементы могут переноситься на следующую строку или столбец, если они не помещаются. Это позволяет создавать многострочные или многоколоночные макеты. Элементы будут размещены в новых строках или столбцах сверху вниз или слева направо, в зависимости от ориентации основной оси.

.container {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
}

.blue {
  height: 220px;
  width: 220px;
  background: #4b9eb3;
}
  
.item-puppy {
  height: 220px;
  width: 220px;
  background-image: url(./images/puppy.jpg);  
}

.pink {
  height: 220px;
  width: 220px;
  background: #e78830;
}
  
.item-cat {
  height: 220px;
  width: 220px;
  background-image: url(./images/cat.jpg);
}
  
.green {
  height: 220px;
  width: 220px;
  background: #4bb381;
}

.item-corgi {
  height: 220px;
  width: 220px;
  background-image: url(./images/corgi.jpg); 
 }
Элементы переносятся на следующую строку, если не помещаются
Элементы переносятся на следующую строку, если не помещаются

wrap-reverse — значение работает аналогично wrap, но элементы будут переноситься на следующую строку или столбец в обратном порядке. Например, если в flex-direction указано row, элементы будут переноситься на новую строку справа налево.

.container {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap-reverse;
}

.blue {
  height: 220px;
  width: 220px;
  background: #4b9eb3;
}
  
.item-puppy {
  height: 220px;
  width: 220px;
  background-image: url(./images/puppy.jpg);  
}

.pink {
  height: 220px;
  width: 220px;
  background: #e78830;
}
  
.item-cat {
  height: 220px;
  width: 220px;
  background-image: url(./images/cat.jpg);
}
  
.green {
  height: 220px;
  width: 220px;
  background: #4bb381;
}

.item-corgi {
  height: 220px;
  width: 220px;
  background-image: url(./images/corgi.jpg); 
}
Элементы переносятся на следующую строку в обратном порядке
Элементы переносятся на следующую строку в обратном порядке

Justify-content

Свойство justify-content распределяет элементы вдоль главной оси контейнера.

У свойства есть ряд значений:

flex-start — значение по умолчанию, оно указывает, что флекс-элементы выровнены по началу главной оси контейнера. Если основная ось направлена горизонтально, то элементы будут выравниваться слева, а если ось направлена вертикально, то элементы будут выравниваться сверху.

.container {
  display: flex;
  flex-direction: row;
  justify-content: flex-start;
}
Элементы выравниваются по началу главной оси контейнера
Элементы выравниваются по началу главной оси контейнера

flex-end указывает, что флекс-элементы выровнены по концу главной оси контейнера. Если основная ось направлена горизонтально, то элементы будут выравниваться справа, а если ось направлена вертикально — снизу.

.container {
  display: flex;
  flex-direction: row;
  justify-content: flex-end;
}
Элементы выравниваются по концу главной оси контейнера
Элементы выравниваются по концу главной оси контейнера

center указывает, что флекс-элементы выровнены по центру главной оси контейнера. Элементы будут выравниваться горизонтально или вертикально в центре контейнера.

.container {
  display: flex;
  flex-direction: row;
  justify-content: center;
}
Элементы выравниваются по центру главной оси
Элементы выравниваются по центру главной оси

space-between указывает, что флекс-элементы равномерно распределены вдоль главной оси контейнера. Первый элемент будет выровнен в начале оси, а последний элемент — в конце. Промежутки между элементами будут распределены равномерно.

.container {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
}
Элементы располагаются равномерно вдоль главной оси контейнера
Элементы располагаются равномерно вдоль главной оси контейнера

space-around означает, что флекс-элементы равномерно распределены вдоль главной оси контейнера с равными промежутками как до, так и после каждого элемента.

.container {
  display: flex;
  flex-direction: row;
  justify-content: space-around;
}
Элементы равномерно распределены вдоль главной оси контейнера с равными промежутками
Элементы равномерно распределены вдоль главной оси контейнера с равными промежутками

space-evenly указывает, что элементы равномерно распределены вдоль главной оси контейнера, и промежутки между ними и на краях контейнера равны.

.container {
  display: flex;
  flex-direction: row;
  justify-content: space-evenly;
}
Элементы равномерно распределены, промежутки между ними и на краях контейнера равны
Элементы равномерно распределены, промежутки между ними и на краях контейнера равны

Align-items

Свойство align-items определяет выравнивание элементов вдоль поперечной оси контейнера.

Распределение осей в контейнере по умолчанию, align-items: stretch
Распределение осей в контейнере по умолчанию, align-items: stretch

align-items имеет несколько значений:

flex-start — флекс-элементы выровнены по началу поперечной оси контейнера. Если поперечная ось направлена горизонтально, то элементы будут выравниваться вверху, а если ось направлена вертикально, то элементы будут выравниваться слева.

.container {
  display: flex;
  flex-direction: row;
  align-items: flex-start;
}
Поперечная линия направлена вертикально, элементы выравнивается слева
Поперечная линия направлена вертикально, элементы выравнивается слева

flex-end — флекс-элементы выровнены по концу поперечной оси контейнера.

.container {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
}
Элементы выровнены по концу поперечной оси контейнера
Элементы выровнены по концу поперечной оси контейнера

center — флекс-элементы выровнены по центру поперечной оси контейнера. Элементы будут выравниваться горизонтально или вертикально в центре контейнера.

.container {
  display: flex;
  flex-direction: column;
  align-items: center;
}
Элементы выровнены по центру поперечной оси
Элементы выровнены по центру поперечной оси

baseline — флекс-элементы выровнены по базовой линии, которая обычно используется для выравнивания текста.

stretch — значение по умолчанию. Указывает, что элементы должны растягиваться по высоте или ширине контейнера, чтобы занять всю доступную площадь вдоль поперечной оси. Это значение делает флекс-элементы одинаковой высоты или ширины, в зависимости от ориентации поперечной оси.

Align-self

Свойство align-self определяет выравнивание отдельного элемента вдоль поперечной оси контейнера. Это свойство задаётся флекс-элементу, а не флекс-контейнеру, и имеет такие же значения, как свойство align-items.

.container {
  display: flex;
  flex-direction: column;
  align-items: baseline;
}

.item-puppy {
  height: 220px;
  width: 220px;
  background-image: url(./images/puppy.jpg);  
  align-self: center;
}
Все элементы в контейнере выравниваются по базовой линии, но элемент с классом .puppy выравнивается по центру контейнера
Все элементы в контейнере выравниваются по базовой линии, но элемент с классом.puppy выравнивается по центру контейнера

Order

Значение order определяет порядок отображения элементов в контейнере, задаётся нужному флекс-элементу. Числовое значение определяет порядковый номер элемента, и чем меньше число, тем ближе элемент будет располагаться к началу контейнера.

.container {
  display: flex;
}

.item:first-child {
  order: 2;
}

.item:last-child {
  order: 1;
}
Первый элемент с классом .item будет отображаться после последнего элемента в контейнере
Первый элемент с классом.item будет отображаться после последнего элемента в контейнере

Нюансы использования

  • Свойство flex работает только для элементов, у которых значение свойства display установлено на flex.
  • Если элементы не помещаются в одну строку или колонку из-за ограничений ширины или высоты контейнера, используется свойство flex-wrap со значением wrap, чтобы элементы переносились на новую строку или колонку.
  • Расположение элементов в HTML-файле не имеет решающего значения. Порядок элементов можно поменять в CSS.
  • Если нужно задать порядок отображения элементов, можно использовать свойство order, где меньшее значение будет помещать элемент ближе к началу контейнера.
  • Множество языков в мире используют написание справа налево rtl (right-to-left), в отличие от привычного ltr (left-to-right). Флекс адаптирован для этого. В нем есть понятие начала и конца, поэтому в браузерах с локалью rtl все элементы будут автоматически расположены в реверсном порядке.

📌 Актуальная информация о поддержке браузерами свойства flex на caniuse.

Материалы по теме


«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.

ТелеграмПодкастБесплатные учебники

Читать дальше

Лигатуры в CSS: как сделать текст аккуратнее

Лигатуры в CSS: как сделать текст аккуратнее

Если вы когда-нибудь присматривались к сочетаниям букв вроде «fi» или «fl» в хороших шрифтах, то, возможно, замечали, что они выглядят чуть иначе, чем при простом наборе. Буквы как будто «срастаются» в один знак, чтобы хвостики и точки не мешали друг другу. Это и есть лигатуры — особые глифы, которые шрифтовые дизайнеры создают для улучшения читаемости и эстетики текста. В вебе ими управляет свойство font-variant-ligatures.

Лигатуры пришли к нам из полиграфии: ещё в эпоху ручного набора наборщики заменяли конфликтующие буквы на слитные формы, чтобы набор выглядел аккуратнее. Сегодня это реализуется средствами OpenType, а браузеры, если шрифт поддерживает лигатуры, могут автоматически подставлять нужный глиф вместо пары букв.

Для фронтенд-разработчика важно знать, что лигатуры меняют только вид текста, но не его содержимое в DOM. Поиск, копирование, скрин-ридеры — всё продолжает работать корректно, ведь под капотом там по-прежнему две буквы, а не одна.

Читать дальше
CSS, Это база
  • 9 августа 2025
CSS-селекторы. Шпаргалка для новичков

CSS-селекторы. Шпаргалка для новичков

Селекторы — это шаблоны, которые используются для привязки стилевых свойств к элементам в документе. Вы можете задать стиль для всех элементов или сократить выбор с помощью определённого селектора.

Читать дальше
CSS
  • 8 августа 2025
CSS-градиенты в oklch

CSS-градиенты в oklch

Градиент — это плавный переход между двумя или более цветами, создаваемый с помощью функций linear-gradient() или radial-gradient(). Его используют в вебе для фонов, кнопок, рамок, декоративных элементов и даже в интерактивных эффектах при наведении.

Классические градиенты в CSS описываются в sRGB — привычном цветовом пространстве браузеров. Но у sRGB есть ограничения: некоторые переходы выглядят тусклыми или неравномерными, особенно если использовать яркие и сложные оттенки.

Чтобы добиться более естественного восприятия цвета, в CSS можно использовать современные цветовые модели, например oklch. Эта модель разработана с учётом особенностей человеческого зрения: яркость, насыщенность и оттенок регулируются отдельно, а сами переходы кажутся глазу равномерными.

Читать дальше
CSS
  • 8 августа 2025
CSS :has() — проверка наличия потомков или соседних элементов

CSS :has() — проверка наличия потомков или соседних элементов

Представьте селектор, который выбирает элемент не по его собственным классам, а по тому, что происходит внутри него или рядом с ним. Так работает псевдокласс :has(): он позволяет применить стили к родителю (или соседу), если в нужном контексте нашёлся подходящий элемент. В результате — меньше вспомогательных классов, меньше JavaScript для «протаскивания» состояний наверх, и чище разметка.

Читать дальше
CSS
  • 6 августа 2025
Функция image() в CSS: цветовые плашки, вырезки из спрайтов и bidi-изображения

Функция image() в CSS: цветовые плашки, вырезки из спрайтов и bidi-изображения

Функция image() из модуля CSS Images Level 4 — это «умная» альтернатива url(), которая умеет больше: задавать направленность изображения (для языков слева-направо и справа-налево), вырезать фрагмент по медиасегменту #xywh и даже рисовать однотонную плашку как самостоятельный слой изображения. Звучит как швейцарский нож для бэкграундов — и так и есть. Но есть важная оговорка: на сегодня поддержка в браузерах минимальна, поэтому ниже мы покажем, как писать код «по-новому» и какие фолбэки использовать уже сейчас.

Читать дальше
CSS
  • 5 августа 2025
Всё самое важное о псевдоклассе :default

Всё самое важное о псевдоклассе :default

Псевдокласс :default — это способ стилизации элемента формы, выбранного по умолчанию. Он особенно полезен при работе с группами радиокнопок, чекбоксов или выпадающих списков, где важно визуально выделить стартовый (предустановленный) вариант. Такой подход делает интерфейс понятнее и помогает пользователю быстрее ориентироваться в выборе.

Доступно в Baseline в статусе «Widely Available» с 2022-07-15

Читать дальше
CSS
  • 4 августа 2025
Как работает единица измерения em в CSS

Как работает единица измерения em в CSS

Единица em используется в CSS для задания относительных размеров, которые зависят от шрифта родительского или текущего элемента. Это делает верстку гибкой и адаптивной: если пользователь увеличит базовый размер текста, элементы тоже изменятся.

Доступно в Baseline в статусе «Widely Available» с 2018-01-29

Читать дальше
CSS
  • 30 июля 2025
Как найти пустые элементы в CSS

Как найти пустые элементы в CSS

Псевдокласс :empty помогает находить пустые HTML-элементы, чтобы применять к ним стили или скрывать их. Это удобно для автоматической очистки интерфейса и улучшения UX без дополнительных классов или JavaScript.

Читать дальше
CSS
  • 29 июля 2025
Как работает ::first-line — оформление первой строки текста в CSS

Как работает ::first-line — оформление первой строки текста в CSS

Псевдоэлемент ::first-line позволяет задать особое оформление только для первой строки текста внутри элемента. Это полезно, когда нужно визуально выделить начало абзаца — например, сделать первую строку жирной, изменить цвет или стиль шрифта. Такой приём часто используют в типографике и веб-дизайне, чтобы направить внимание читателя.

Этот псевдоэлемент находится в Baseline в статусе «Widely Available» с 2018-01-29

Как использовать: first-line

🚀 Сегодня вам бесплатно доступен тренажёр по HTML и CSS.

Псевдоэлемент добавляется к селектору через ::, и внутри блока задаются стили, которые применятся только к первой строке, как она отображается в браузере:

p::first-line {
  font-weight: bold;
  color: red;
}

Этот стиль сделает только первую строку текста в каждом абзаце <p> красной и жирной. Важно: то, где заканчивается строка, зависит от ширины контейнера и размера шрифта, а не от переносов в HTML.

Какие свойства работают

Псевдоэлемент ::first-line не поддерживает любые стили. Он ограничен только теми, что могут визуально применяться к строке текста:

Поддерживаются:

  • color
  • font и его производные (font-size, font-weight, font-style, font-variant)
  • letter-spacing, word-spacing
  • line-height
  • text-decoration
  • text-transform
  • vertical-align
  • background
  • margin-left и margin-right
  • padding-left и padding-right
  • border-left и border-right

Не поддерживаются:

  • display, position, transform, width, height и другие «структурные» свойства.

Это сделано, чтобы не нарушать верстку и избежать проблем с потоком документа.

Пример с цитатой

<blockquote>
  Когда вы начнёте, главное — не останавливаться.
</blockquote>
blockquote::first-line {
  text-transform: uppercase;
  letter-spacing: 2px;
}

Здесь первая строка цитаты будет написана ПРОПИСНЫМИ буквами с увеличенным расстоянием между символами. Это создаёт акцент и улучшает читаемость начала мысли.

Советы по использованию

  • Используйте ::first-line для декоративных акцентов: начало статьи, цитаты, описание карточки.
  • Старайтесь не задавать свойства, которые не поддерживаются — они просто игнорируются.
  • Не используйте псевдоэлемент для логических операций — он только визуальный.
  • Не забывайте про адаптивность: на разных экранах «первая строка» может меняться.

Поддержка

Псевдоэлемент ::first-line поддерживается во всех современных браузерах, включая Chrome, Firefox, Safari, Edge. Работает на блоковых и строчно-блочных элементах (display: block, inline-block, inline).

Заключение

::first-line — это простой и эффективный инструмент, который помогает сделать текст живым и выразительным. Он особенно полезен для визуального оформления абзацев, заголовков, описаний, не вмешиваясь в HTML-структуру. Даже пара свойств может кардинально изменить восприятие контента.

Больше обзоров веб-функций — в телеграм-канале HTML Academy.

Нашли ошибку или опечатку? Напишите нам.

CSS
  • 27 июля 2025
CSS-счётчики: как работает свойство counter-set

CSS-счётчики: как работает свойство counter-set

counter-set — это новое CSS-свойство, с помощью которого можно явно установить значение счётчика в нужный момент. Оно похоже на counter-reset, но отличается тем, что не сбрасывает счётчик, а просто присваивает ему конкретное значение. Это даёт больше контроля над нумерацией, особенно когда нужно продолжить счёт или задать его вручную в разных частях документа.

CSS-счётчики — это способ автоматически нумеровать элементы, например заголовки, пункты списка, шаги в инструкции. Их можно комбинировать с псевдоэлементами и свойством content, чтобы вставлять числа прямо в текст.

Читать дальше
CSS
  • 25 июля 2025