Мистический inline-flex и что он делает | by Stas Bagretsov
4 min read
·
Apr 17, 2019
Это очень редко используемое свойство в CSS Flexbox и про него в принципе мало чего написано. Но это не беда. В этой статье вы узнаете о том, что же такое display:inline-flex
и какие преимущества он даёт при вёрстке, а также поймете его отличия отdisplay: flex
.
👉Мой Твиттер — там много из мира фронтенда, да и вообще поговорим🖖. Подписывайтесь, будет интересно: ) ✈️
Перевод двух статей:
I Used CSS Inline Flex For The First Time
И
display: flex vs display: inline-flex
Как фронт-энд разработчик, я регулярно использую свойство CSS display
в своей ежедневной работе. Я могу использовать block
, grid
или flex
, как его значения.
Во время работы над проектом мне был нужен flex-контейнер, который в тот же момент был бы ещё и инлайновым. Другими словами, мне нужно было, чтобы контент внутри контейнера был флексовым, но сам контейнер вёл бы себя как инлайновый элемент.
Хорошо, что я вспомнил о display: inline-flex
. Никогда его до этого не использовал, но всегда видел его в DevTools браузера.
Итак, давайте посмотрим на дизайн, который мне нужно было сверстать:
У каждого бэджа есть своя уникальная иконка, отцентрированная внутри горизонтально и вертикально. Центрирование, как вы уже наверное поняли, происходит с помощью Flexbox и все бэджи стоят в ряд, так как к ним применено display: inline-flex
.
HTML:
<div>
<div>
<svg>..</svg>
</div>
<div>
<svg>..</svg>
</div>
<!-- другие бэджи -->
</div>
Для уточнения, врапер .badges-list
ничего не делает для инлайнового позиционирования элементов. Так происходит, потому что на его потомке . c-badge
применяется inline-flex
.
CSS:
.c-badge {
display: inline-flex;
justify-content: center;
align-items: center;
}
Ну и конечно же демка:
В чем тут разница?
Пример 1: display: flexУ трёх контейнеров с display: flex
синий цвет, в них есть три потомка div
’а, отмеченные красным цветом и имеющие flex: 1
.
Каждый родительский контейнер находится на своей строке. А трое потомков занимают равную ширину.
$flexColor: #64B5F6;
$inlineColor: #F06292;.container--inline-flex,
.container--flex {
background-color: $flexColor;
margin-bottom: 10px; /* для эстетичности*/
}
.container--flex {
display: flex;
}.flex-child {
flex: 1;
min-width: 50px;
min-height: 50px;
margin: 10px;
background-color: $inlineColor;
}.flex-color {
color: $flexColor;
}
.inline-color {
color: $inlineColor;
}/* Визуальный CSS */
body {
font-family: 'Open Sans', sans-serif;
}
code {
background-color: #EEEEEE;
padding: 1px 5px;
}
HTML:
<div>Пример 2: display: inline-flex
<div></div>
<div></div>
<div></div>
</div>
<div>
<div></div>
<div></div>
<div></div>
</div>
<div>
<div></div>
<div></div>
<div></div>
</div>
К трем контейнерам в синем цвете применяем display: inline-flex
, в них есть три потомка div
’а, которые в красном цвете имеют flex:1
и min-width: 50px
.
Каждый родительский контейнер стоит сразу за другим, потому что они могут уместиться в один ряд. Ширина родительского контейнера зависит от размера потомков, которым тут был выставлен min-width
в 50px.
CSS, но уже с inline-flex
:
.container--inline-flex {
display: inline-flex;
}
HTML:
<div>Объясняем примеры
<div></div>
<div></div>
<div></div>
</div>
<div>
<div></div>
<div></div>
<div></div>
</div>
<div>
<div></div>
<div></div>
<div></div>
</div>
Элемент с display:flex
очень схож с элементом, на котором стоит display: block
, потому что он забирает сразу всю строку. Однако, в сравнении с представленными до этого свойствами позиционирования, его потомки могут быть размещены в контейнере куда более гибко и динамично, нежели это было возможно ранее.
Если мы изменим display: flex
на display: inline-flex
:
Родительский контейнер будет показываться инлайново.
К потомкам могут быть применены все flex-свойства, разницы с display: flex
в этом плане совсем не будет.
В общем, это означает то, что если элементы потомки не слишком велики, то два контейнера с display: inline-flex
могут идти бок о бок в одной строке.
У других display
свойств тоже есть свои инлайновые близнецы:
У block
есть inline-block
У table
есть inline-table
И даже у grid
есть inline-grid
Больше про CSS Flex и его свойства вы можете прочитать в статье — Вёрстка на Flexbox в CSS. Полный справочник
flex-direction ⚡️ HTML и CSS с примерами кода
Свойство flex-direction
задаёт направление основных осей в контейнере и тем самым определяет положение флексов в контейнере.
На само направление также влияет значение атрибута dir
у контейнера.
Демо
Flexbox и выравнивание- flex
- flex-basis
- flex-direction
- flex-flow
- flex-grow
- flex-shrink
- flex-wrap
- order
- justify-content
- align-content
- place-content
- justify-items
- align-items
- place-items
- justify-self
- align-self
- place-self
- row-gap
- column-gap
- gap
Синтаксис
/* The direction text is laid out in a line */ flex-direction: row; /* Like <row>, but reversed */ flex-direction: row-reverse; /* The direction in which lines of text are stacked */ flex-direction: column; /* Like <column>, but reversed */ flex-direction: column-reverse; /* Global values */ flex-direction: inherit; flex-direction: initial; flex-direction: unset;
Значения
Значение по-умолчанию: row
Наследуется: нет
Применяется к флекс-элементам
Анимируется: нет
row
- Главная ось направлена так же, как и ориентация текста, по умолчанию слева направо. Если значение
dir
задано какrtl
, то направление оси идёт справа налево. row-reverse
- Похоже на значение
row
, но меняются местами начальная и конечная точки и главная ось направлена справа налево. Если значениеdir
задано какrtl
, то направление оси идёт слева направо. column
- Главная ось располагается вертикально и направлена сверху вниз.
column-reverse
- Главная ось располагается вертикально, но меняется положение начальной и конечной точек и ось направлена снизу вверх.
Примечание
Safari до версии 9 поддерживает свойство -webkit-flex-direction
.
Спецификации
- CSS Flexible Box Layout Module
Поддержка браузерами
Can I Use flexbox? Data on support for the flexbox feature across the major browsers from caniuse. com.
Описание и примеры
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>flex-direction</title> <style> .flex-row { padding: 0; margin: 0; list-style: none; display: flex; flex-direction: row-reverse; } </style> </head> <body> <ul> <li><img src="image/thumb1.jpg" alt="" /></li> <li><img src="image/thumb2.jpg" alt="" /></li> <li><img src="image/thumb3.jpg" alt="" /></li> </ul> </body> </html>
См. также
- Руководство по Flexbox
css — В чем разница между display:inline-flex и display:flex?
Я хотел бы добавить некоторые подробности о поведении программы чтения с экрана, потому что здесь есть некоторые сюрпризы.
Сначала предыстория. Некоторые программы чтения с экрана, такие как NVDA, обрабатывают display: block
и display: inline-block
по-разному (и они должны, как вы увидите позже).
Сравнение различных атрибутов отображения
отображение: блок
Дисплей : элемент блока
всегда будет объявляться в отдельной «строке», что означает, что NVDA перестанет говорить после его содержимого, и пользователь вручную скажет NVDA объявить следующий элемент (обычно с помощью клавиши со стрелкой вниз
) .
Это первая строкаЭто другая строка
Это заставит NVDA объявить Это первая строка
, а затем Это еще одна строка
.
Следующее дает тот же результат:
Это первая строка Это другая строка
display: inline-block
A display: inline-block Элемент
будет объявлен вместе со всеми предшествующими и последующими другими строчными элементами ( display: inline
и display: inline-block
).
Это первая строка Это другая строка
Это заставит программу чтения с экрана объявлять оба элемента одновременно: Это первая строка Это еще одна строка
.
Как было сказано ранее, не имеет значения, является ли это элементом inline
или inline-block
; следующий результат дает точно такой же результат:
Это первая строка Это другая строка
display: flex
Это работает точно так же, как display: block
.
display: inline-flex
Удивительно, но этот также работает как display: block
, не как display: inline-block
!
display: grid
/ display: inline-grid
Я не проверял это, но я ожидаю того же, что и с flex
/ inline-flex
здесь.
Почему это проблема?
Используя display: inline-block
, можно создавать элементы, которые визуально выглядят очень разными, но семантически обрабатываются как одно целое.
Например, рассмотрим следующий заголовок на онлайн-платформе новостей:
Дождевые леса Им нужна наша любовь
Теперь вы хотите визуально стилизовать категорию ( Тропические леса
), сильно отличающуюся от «настоящего» названия («Им нужна наша любовь»), т. е. поместив каждую в отдельную строку, примерно так:
Если бы вы сделали категорию элементом display: block
, тогда программа чтения с экрана объявила бы заголовок в двух отдельных строках, например: Тропические леса, уровень заголовка 2
, затем Им нужна наша любовь, уровень заголовка 2
. Это сбивает пользователя с толку: на странице два разных заголовка? Почему нет содержания для первого (вместо этого, кажется, сразу следует второй заголовок)?
Однако если вы сделаете категорию display: inline-block
element, то программа чтения с экрана объявит заголовок сразу: Тропические леса Им нужна наша любовь, уровень заголовка 2
.
Печально, что display: inline-flex
(и, возможно, inline-grid
тоже) не имитирует поведение. Поэтому, если вы хотите предложить идеальную доступность, вы можете использовать встроенный блок
в таких ситуациях.
Учебное пособие по CSS Flexbox. Что такое Flex и Inline-Flex?
Flexbox заставляет браузеры отображать выбранные элементы HTML в виде гибких блочных моделей.
Flexbox позволяет легко изменять размер и положение гибкого контейнера и его элементов в одном измерении.
Контейнер Flex и элемент Flex: в чем разница?
Элементы Flex являются прямыми дочерними элементами контейнера Flex.
Контейнер flex (большая желтая область на изображении) — это элемент HTML, значением свойства display которого является flex или inline-flex. Flex-элементы (меньшие прямоугольники внутри желтого контейнера) являются прямыми дочерними элементами flex-контейнера. flex
указывает браузерам отображать выбранный элемент HTML как гибкую блочную модель на уровне блоков.
Другими словами, установка значения свойства display
элемента на flex
превращает блочную модель в flexbox блочного уровня.
Вот пример:
- CSS
- HTML
section {
display: flex;
цвет фона: оранжевый; поле
: 10 пикселей;
отступ: 7px;
}дел {
цвет фона: фиолетовый;
цвет: белый; поле
: 5 пикселей;
отступ: 10 пикселей;
радиус границы: 5 пикселей;
}
Попробуйте на StackBlitz
Фрагмент выше использовал значение flex
для преобразования элементов HTML-документа
из обычных
- Преобразование узла HTML в гибкую блочную модель делает непосредственные дочерние элементы элемента гибкими элементами.
- Директива
display: flex
влияет только на блочную модель и ее прямые дочерние элементы. Это не влияет на узлы-внуки.
Давайте теперь обсудим inline-flex
.
inline-flex
указывает браузерам отображать выбранный элемент HTML как гибкую блочную модель встроенного уровня.
Другими словами, установка значения свойства display элемента на
inline-flex
превращает блочную модель в flexbox встроенного уровня.
Вот пример:
- CSS
- HTML
section {
display: inline-flex;
цвет фона: оранжевый; поле
: 10 пикселей;
отступ: 7px;
}div {
цвет фона: фиолетовый;
цвет: белый; поле
: 5 пикселей;
отступ: 10 пикселей;
радиус границы: 5 пикселей;
}
Попробуйте на StackBlitz
Фрагмент выше использовал значение inline-flex
для преобразования документа HTML
элементов от обычных
узлов до гибких блочных моделей встроенного уровня.
- Преобразование узла HTML в гибкую блочную модель делает непосредственные дочерние элементы элемента гибкими элементами.
- Директива
display: inline-flex
влияет только на блочную модель и ее прямые дочерние элементы. Это не влияет на узлы-внуки.
При преобразовании обычного HTML-элемента в flex
(или inline-flex
) блочная модель, Flexbox предоставляет два типа свойств для позиционирования гибкого блока и его прямых дочерних элементов:
- Свойства гибкого контейнера
- Свойства гибкого элемента
Какие свойства гибкого контейнера?
Свойства гибкого контейнера указывают как браузеры должны размещать элементы в гибкой блочной модели.
Мы определяем свойство гибкого контейнера во гибком контейнере, а не в его элементах.
Шесть (6) типов свойств гибкого контейнера:
-
flex-direction
-
flex-wrap
-
flex-flow
-
justify-content
90 176 -
align-items
-
align-content
Гибкие свойства элемента указать, как браузеры должны размещать указанный элемент в гибкой блочной модели.