CSS модуль раскладки Flexible Box, обычно называемый флексбокс или flexbox или просто flex (флекс), был разработан как модель одномерного-направленного макета и как один из методов распределения пространства между элементами в интерфейсе, с мощными возможностями выравнивания. В этой статье дается краткое описание основных функций flexbox, которые мы рассмотрим более подробно в остальных руководствах.
Когда мы описываем flexbox как одномерно-направленный, мы имеем в виду, что flexbox имеет дело с макетом в одной плоскости за раз – либо в виде строки, либо в виде столбца. Как альтернативу можно упомянуть двумерную модель CSS Grid Layout, которая управляет и столбцами и строками одновременно.
Flexbox: две оси
При работе с flexbox нужно мыслить с точки зрения двух осей – главной оси и побочной оси. Главная ось определяется свойством flex-direction
, а побочная ось проходит перпендикулярно ей. Все, что мы делаем с flexbox, относится к этим осям, поэтому стоит с самого начала понять, как они работают.
Главная ось
Главная ось определяется свойством flex-direction
, которая может принимать одно из следующих значений:
row
row-reverse
column
column-reverse
Если вы выберете row
или row-reverse
, ваша главная ось будет проходить в горизонтальном направлении (inline direction).
Если вы выберете column
или column-reverse
, ваша главная ось будет проходить в вертикальном направлении (block direction).
Побочная ось
Побочная ось проходит перпендикулярно главной оси, поэтому, если свойство flex-direction
(главная ось) задано как row
или row-reverse
, побочная ось будет проходить в вертикальном направлении.
Если свойство flex-direction
задано как column
или column-reverse
, побочная ось будет проходить в горизонтальном направлении.
Понимание того, с какой осью вы работаете (главная или побочная) очень важно для дальнейшего изучения Flexbox.
Начало и конец строки
Важно понимать, что flexbox не делает никаких предположений о режиме написания документа. Раньше CSS был сильно ориентирован на горизонтальный режим и режим письма слева направо. Современные методы верстки охватывают полный диапазон режимов письма, и поэтому мы больше не предполагаем, что строка текста будет начинаться в верхнем левом углу документа и будет проходить по направлению к правой стороне, а новые строки будут появляться одна под другой.
Вы можете прочитать больше о взаимосвязи между flexbox и спецификацией Writing Modes в следующей статье, однако следующее описание должно помочь объяснить, почему мы не говорим о левом, правом, верхнем и нижнем направлениях наших flex-элементов.
Если свойству flex-direction
задано значение row
и вы работаете с английским языком, то начало главной оси будет слева, а конец главной оси – справа.
Если бы вы работаете с арабским языком, то начало главной оси будет справа, а конец главной оси – слева.
В обоих случаях начало побочной оси находится вверху flex контейнера, а конец – внизу, поскольку оба языка имеют режим горизонтальной записи.
Спустя некоторое время становится естественным думать о начале и конце оси, а не о левом и правом краях. Это будет полезно для вас при работе с другими методами, такими как CSS Grid Layout, которые следуют тем же шаблонам.
Flex контейнер
Область документа, использующая flexbox, называется flex контейнером. Чтобы создать flex контейнер, мы задаем значение flex
или inline-flex
для свойства display
контейнера. Как только мы делаем это, прямые потомки этого контейнера становятся flex элементами. Как и для всех свойств в CSS, некоторые начальные значения уже определены, поэтому при создании flex-контейнера все содержащиеся в нем flex-элементы будут вести себя следующим образом.
- Элементы отображаются в ряд (свойство
flex-direction
по умолчанию имеет значениеrow
). - Позиционирование элементов начинается от начала главной оси.
- Элементы не растягиваются по основной оси, но могут сжиматься.
- Элементы будут растягиваться, чтобы заполнить размер побочной оси.
- Свойству
flex-basis
задано значениеauto
. - Свойству
flex-wrap
задано значениеnowrap
.
Результатом этого является то, что все ваши элементы будут выстроены в ряд, используя размер содержимого в качестве их размера на главной оси. Если в контейнере больше элементов, чем можно уместить, они не будут обернуты и контейнер будет переполнен. Если некоторые элементы выше других, все элементы будут вытянуты вдоль побочной оси, чтобы заполнить ось в полный размер.
Вы можете увидеть принцип работы в живом примере ниже. Попробуйте отредактировать или добавить дополнительные элементы, чтобы проверить поведение flexbox.
Изменение flex-direction
Добавление свойства flex-direction
в контейнер позволяет нам изменять направление, в котором отображаются наши элементы flex. Установка flex-direction: row-reverse
сохранит порядок отображаения элементов вдоль строки, однако начало и конец строки поменяются местами.
Если изменить значение свойства flex-direction
на column
, главная ось изменится, и наши элементы будут отображаются в столбец. При установке параметра column-reverse
, начало и конец стобца поменяются местами.
В приведенном ниже примере значение свойства flex-direction
установлено как row-reverse
row
, column
иcolumn-reverse
, чтобы посмотреть как изменятся элементы контейнера.Многострочный флекс-контейнер с flex-wrap
Несмотря на то, что флекс-бокс — это однонаправленная модель, есть возможность завернуть наши флекс-элементы в несколько строк. При этом вы должны рассматривать каждую строку как новый флекс контейнер. Распределение пространства будет происходить на этой конкретной линии, не привязываясь к соседним линиям.
Чтобы включить такое поведение, добавьте параметр flex-wrap
со значением wrap
. Теперь, как только ваши элементы будут слишком большими для того, чтобы влезать на одну строчку, они будут переноситься на новые строки. Живой пример ниже содержит широкие элементы, у которых общая ширина больше, чем размер контейнера. Так как параметр flex-wrap
установлен в значение wrap
, элементы переносятся. Если Вы установите значение nowrap
, то есть в начальное значение, то элементы ужмутся так, чтобы все элементы поместились на одной строке, потому что у них установлено значение, позволяющее им ужиматься при необходимости. Если им запретить ужиматься, или если они не смогут ужаться достаточно сильно, то при установленном значении
будет происходить переполнение контейнера.
Более подробно эту тема разбирается в статье Разбираемся с обёртыванием Flex элементов.
Краткая запись направления и многострочности: flex-flow
Вы можете указать два свойства flex-direction
и flex-wrap
в одном flex-flow
. Первое значение свойства определяет flex-direction
, второе flex-wrap
.
В приведенном ниже примере вы можете изменить первое значение на одно из доступных для flex-direction
— row
, row-reverse
, column
or column-reverse
, а второе на wrap
или nowrap
, чтобы посмотреть как изменятся элементы контейнера.
Свойства, применяемые к флекс-элементам
Управлять поведением флекс-элементов более детально мы можем с помощью их собственных свойств:
В этом обзоре мы лишь кратко рассмотрим эти свойства. Чтобы получить более глубокое понимание обратитесь к руководству Управление соотношением элементов вдоль главной оси.
Чтобы понять как работают эти свойства, прежде нам необходимо разобраться с концепцией доступного пространства. Изменяя значения этих флекс свойств, мы влияем на то, как доступное пространство распределяется между нашими элементами. Эта концепция так же важна для выравнивания элементов.
Если наш контейнер шириной 500 пикселей содержит три элемента шириной 100 пикселей каждый, для их размещения нам потребуется пространство шириной в 300 пикселей. Остается 200 пикселей свободного пространства. Если мы не изменим исходные значения этих свойств, флексбокс разместит это пространство за последним элементом.
Если вместо этого мы хотим чтобы элементы росли и заполняли собой свободное пространство, нам нужно указать способ распределения оставшегося пространства между элементами. Это как раз то для чего предназначены
свойства.
Свойство flex-basis
The flex-basis
is what defines the size of that item in terms of the space it leaves as available space. The initial value of this property is auto
— in this case the browser looks to see if the items have a size. In the example above, all of the items have a width of 100 pixels and so this is used as the flex-basis
.
If the items don’t have a size then the content’s size is used as the flex-basis. This is why when we just declare display: flex
on the parent to create flex items, the items all move into a row and take only as much space as they need to display their contents.
Свойство flex-grow
With the flex-grow
property set to a positive integer, flex items can grow along the main axis from their flex-basis
. This will cause the item to stretch and take up any available space on that axis, or a proportion of the available space if other items are allowed to grow too.
If we gave all of our items in the example above a flex-grow
value of 1 then the available space in the flex container would be equally shared between our items and they would stretch to fill the container on the main axis.
The flex-grow property can be used to distribute space in proportion. If we give our first item a flex-grow
value of 2 and the other items a value of 1, 2 parts will be given to the first item (100px out of 200px in the case of the example above), 1 part each the other two (50px each out of the 200px total).
Свойство flex-shrink
Where the flex-grow
property deals with adding space in the main axis, the flex-shrink
property controls how it is taken away. If we do not have enough space in the container to lay out our items and
is set to a positive integer the item can become smaller than the flex-basis
. As with flex-grow
different values can be assigned in order to cause one item to shrink faster than others — an item with a higher value set for flex-shrink
will shrink faster than its siblings that have lower values.
The minimum size of the item will be taken into account while working out the actual amount of shrinkage that will happen, which means that flex-shrink has the potential to appear less consistent than flex-grow in behavior. We’ll therefore take a more detailed look at how this algorithm works in the article Controlling Ratios of items along the main axis.
Note that these values for flex-grow
and flex-shrink
are proportions. Typically if we had all of our items set to flex: 1 1 200px
and then wanted one item to grow at twice the rate, we would set that item to flex: 2 1 200px
. However you could use flex: 10 1 200px
and flex: 20 1 200px
if you wanted.
Краткая запись значений флекс свойств
You will very rarely see the flex-grow
, flex-shrink
, and flex-basis
properties used individually; instead they are combined into the flex
shorthand. The flex
shorthand allows you to set the three values in this order — flex-grow
, flex-shrink
, flex-basis
.
The live example below allows you to test out the different values of the flex shorthand; remember that the first value is flex-grow
. Giving this a positive value means the item can grow. The second is flex-shrink
— with a positive value the items can shrink, but only if their total values overflow the main axis. The final value is flex-basis
; this is the value the items are using as their base value to grow and shrink from.
There are also some predefined shorthand values which cover most of the use cases. You will often see these used in tutorials, and in many cases these are all you will need to use. The predefined values are as follows:
flex: initial
flex: auto
flex: none
flex: <positive-number>
Setting flex: initial
resets the item to the initial values of Flexbox. This is the same as flex: 0 1 auto
. In this case the value of flex-grow
is 0, so items will not grow larger than their flex-basis
size. The value of flex-shrink
is 1, so items can shrink if they need to rather than overflowing. The value of flex-basis
is auto
. Items will either use any size set on the item in the main dimension, or they will get their size from the content size.
Using flex: auto
is the same as using flex: 1 1 auto
; everything is as with flex:initial
but in this case the items can grow and fill the container as well as shrink if required.
Using flex: none
will create fully inflexible flex items. It is as if you wrote flex: 0 0 auto
. The items cannot grow or shrink but will be laid out using flexbox with a flex-basis
of auto
.
The shorthand you often see in tutorials is flex: 1
or flex: 2
and so on. This is as if you used flex: 1 1 0
. The items can grow and shrink from a flex-basis
of 0.
Try these shorthand values in the live example below.
Alignment, justification and distribution of free space between items
A key feature of flexbox is the ability to align and justify items on the main- and cross-axes, and to distribute space between flex items.
align-items
The align-items
property will align the items on the cross axis.
The initial value for this property is stretch
and this is why flex items stretch to the height of the tallest one by default. They are in fact stretching to fill the flex container — the tallest item is defining the height of that.
You could instead set align-items
to flex-start
in order to make the items line up at the start of the flex container, flex-end
to align them to the end, or center
to align them in the centre. Try this in the live example — I have given the flex container a height in order that you can see how the items can be moved around inside the container. See what happens if you set the value of align-items to:
stretch
flex-start
flex-end
center
justify-content
The justify-content
property is used to align the items on the main axis, the direction in which flex-direction
has set the flow. The initial value is flex-start
which will line the items up at the start edge of the container, but you could also set the value to flex-end
to line them up at the end, or center
to line them up in the centre.
You can also use the value space-between
to take all the spare space after the items have been laid out, and share it out evenly between the items so there will be an equal amount of space between each item. To cause an equal amount of space on the right and left of each item use the value space-around
. With space-around
, items have a half-size space on either end. Or, to cause items to have equal space around them use the value space-evenly
. With space-evenly
, items have a full-size space on either end.
Try the following values of justify-content
in the live example:
flex-start
flex-end
center
space-around
space-between
space-evenly
In the article Aligning Items in a Flex Container we will explore these properties in more depth, in order to have a better understanding of how they work. These simple examples however will be useful in the majority of use cases.
Next steps
After reading this article you should have an understanding of the basic features of Flexbox. In the next article we will look at how this specification relates to other parts of CSS.
Flexbox — Изучение веб-разработки | MDN
Это новая технология, которая уже имеет достаточно широкую поддержку браузеров. Flexbox предоставляет инструменты для быстрого создания сложных, гибких макетов, и функции, которые были сложны в традиционных методах CSS. В этой статье объясняются все основы данной технологии.
Необходимые навыки: | HTML основы (изучите Введение в HTML), знание того, как работает CSS (изучите Вступление в CSS). |
---|---|
Цель: | Узнать, как использовать систему адаптируемых блоков Flexbox для создания веб-макетов. |
Почему Flexbox?
Долгое время единственными надёжными инструментами CSS верстки были такие способы как Float (обтекание) и позиционирование .
С их помощью сложно или невозможно достичь следующих простых требований к макету:
- Вертикального выравнивания блока внутри родителя.
- Оформления всех детей контейнера так, чтобы они распределили между собой доступную ширину/высоту, независимо от того, сколько ширины/высоты доступно.
- Сделать все колонки в макете одинаковой высоты, даже если наполнение в них различно.
Как вы увидите в последующих разделах, flexbox значительно облегчает работу с макетами. Погружаемся!
Разберём простой пример
В этой статье вы проработаете серию упражнений, которые помогут понять, как работает flexbox. Чтобы начать, скачайте на компьютер стартовый файл — flexbox0.html с нашего Github репозитория — загрузите его в современном браузере (Firefox или Chrome), а также в любимом редакторе кода. Также вы можете посмотреть его вживую.
Вы увидите элемент <header>
с заголовком верхнего уровня внутри, и элемент <section>
содержащий три элемента <article>
. Мы будем использовать их для создания стандартного трехколоночного макета.
Определяем, какие элементы разместить в виде flex блоков
Для начала нам нужно выбрать, какие элементы следует выкладывать в виде flex блоков. Для этого мы устанавливаем специальное значение display
в родительском элементе тех элементов, которые вы хотите оформить. В нашем случае мы хотим расположить элементы <article>
, поэтому мы устанавливаем это значение на <section>
(который становится flex контейнером):
section { display: flex; }
В результате у нас получится вот так:
Так, всего одно объявление делает всё, что нам нужно — здорово, правда? Мы получили 3-х колоночный макет с колонками равных размеров по ширине и высоте. Это связано с тем, что значения по умолчанию, заданные для flex элементов (дочерние элементы flex контейнера), настроены для решения основных задач. Подробнее об этом позже.
Примечание: Вы также можете установить значение display
inline-flex,
если хотите расставить inline элементы как flex блоки.
Внутри flex модели
Когда элементы выложены как flex блоки, они располагаются вдоль двух осей:
- Главная ось (main axis) проходит в том направлении, вдоль которого расположены Flex элементы (например, в строку слева направо или вдоль колонок вниз.) Начало и конец этой оси называются main start и main end.
- Поперечная ось (сross axis) проходит перпендикулярно Flex элементам. Начало и конец этой оси называются cross start and cross end.
- Родительский элемент, на который назначено свойство
display: flex (
<section>
в нашем примере) называется flex container. - Элементы, размещённые в нём как Flex блоки называются flex items (в нашем примере это
<article>
).
Запомните эти термины, они пригодятся вам в последующих разделах.
Столбцы или строки?
В Flexbox есть свойство под названием flex-direction
, которое определяет направление главной оси (в каком направлении располагаются flexbox дети) — по умолчанию ему присваивается значение row
, т.е. располагать дочерние элементы в ряд слева направо (для большинства языков) или справа налево (для арабских языков).
Попробуйте добавить следующую строчку в ваш файл:
flex-direction: column
Вы увидите, что элементы расположились в виде столбцов, также как было до того, как мы добавили CSS код. Прежде чем продолжать, удалите эту строчку из примера.
Примечание: Вы можете также распологать flex элементы в обратном направлении, используя значения row-reverse
и column-reverse
. Попробуйте их тоже!
Перенос строк
Проблема может быть в том, что, если у вас фиксированная ширина или высота макета, ваши flexbox элементы переполнят контейнер и нарушат макет. Посмотрите на этот пример: flexbox-wrap0.html и посмотрите его вживую (сохраните его себе на комьютер, если хотите изучить этот пример):
Мы видим, что дочерние элементы выбиваются из своего родителя-контейнера. Один из способов как это исправить — это добавить следующее свойство:
flex-wrap: wrap
Попробуйте, и вы увидите, что так макет стал выглядеть гораздо лучше:
Теперь у нас в макете несколько рядов— все дети-блоки, которые не помещаются, переносятся на следующую строку, чтобы не было переполнения. Свойство flex: 200px
, установленное на статьях, означает, что каждый блок должен быть минимум 200 пикселей в ширину. Мы обсудим это свойство более подробно позже. Вы также можете заметить, что несколько дочерних блоков в последней строке стали более широкими, так что вся строка стала заполнена.
Но мы можем пойти дальше. Прежде всего, попробуйте изменить значение свойства flex-direction
на row-reverse
— теперь у вас также макет в несколько строк, но он начинается из противоположного угла окна браузера и теперь выстраивается в обратном порядке.
flex-flow сокращение
На этом этапе нужно заметить, что существует сокращение для свойств flex-direction
и flex-wrap
— flex-flow
. Например, вы можете заменить
flex-direction: row; flex-wrap: wrap;
на
flex-flow: row wrap;
Гибкое изменение размеров flex элементов
Теперь давайте вернёмся к нашему первому примеру и посмотрим, как мы можем контролировать, в каких пропорциях flex элементы будут занимать место. Включите свою копию файла flexbox0.html, или скачайте flexbox1.html (просмотр).
Прежде всего, добавим следующее правило в конец вашего CSS кода:
article { flex: 1; }
Это безразмерное значение пропорции, которое указывает, сколько свободного пространства на главной оси (main axis) каждый flex элемент сможет занять. В этом случае, мы даём каждому элементу <article>
значение 1, а это значит, что они будут занимать равное количество свободного места в макете, которое осталось после установки свойств padding и margin.
Теперь добавьте следующее правило в строку после предыдущего:
article:nth-of-type(3) { flex: 2; }
Обновив страницу, вы увидите, что третий элемент <article>
занимает в два раза больше доступной ширины, чем два других — итого теперь доступно 4 единицы пропорции. Первые два flex элемента имеют по одной единице, поэтому берут 1/4 пространства каждый. А у третьего 2 единицы, так что он берёт 2/4 свободного места (или 1/2).
Вы также можете указать минимальный размер внутри значения flex. Попробуйте изменить существующие правила, добавив размеры:
article { flex: 1 200px; } article:nth-of-type(3) { flex: 2 200px; }
Это просто означает, что каждому flex элементу сначала будет дано 200px от свободного места. Потом оставшееся место будет поделено в соответствии с частями пропорций. Обновите страницу, и вы увидите разницу, как пространство поделено теперь.
Настоящая ценность flexbox можно увидеть в его гибкости/отзывчивости — если изменить размер окна или добавить ещё элемент <article>
, макет будет и дальше выглядеть также хорошо.
flex: краткий код против развёрнутого
flex
это сокращённое свойство, в которым можно задать до трёх разных свойств:
- Значение пропорции, которое мы обсуждали выше. Оно может быть установлено отдельно с помощью свойства
flex-grow
. - Следующее значение пропорции —
flex-shrink
— вступает в роль, когда flex элементы переполняют контейнер. Оно указывает, сколько забирается от размера каждого flex элемента, чтобы он перестал переполнять контейнер. Это продвинутая функция flexbox, и в этом параграфе мы не будем её разбирать. - Значение минимального размера, как мы обсуждали ранее. Оно может быть установлено отдельно с помощью свойства
flex-basis
.
Мы не советуем использовать развёрнутые свойства flex, если вам в действительности это не нужно (например, переопределить ранее установленное). Они приводят к написанию большого количества дополнительного кода и могут запутать кого угодно.
Горизонтальное и вертикальное выравнивание
Flexbox также имеет функции для выравнивания flex элементов вдоль основной (main) или поперечной (cross) осей. Рассмотрим их на новом примере — flex-align0.html (просмотр) — который мы превратим в аккуратную, гибкую кнопочную панель инструментов. На данный момент вы видите горизонтальную панель меню, кнопки которой застряли в верхнем левом углу.
Сначала сделайте себе копию этого примера.
Теперь добавьте следующую строку в низ кода CSS:
div { display: flex; align-items: center; justify-content: space-around; }
Обновите страницу, и вы увидите, что кнопки теперь хорошо центрированы, горизонтально и вертикально. Мы сделали это с помощью двух новых свойств.
align-items
контролирует, где на поперечной оси находятся flex элементы.
- По умолчанию стоит значение
stretch
, которое растягивает все flex элементы, чтобы заполнить родителя вдоль поперечной (cross axis) оси. Если у родителя нет фиксированной ширины вдоль поперечной оси, все flex элементы примут длину самого длинного flex элемента. Вот почему наш первый пример по умолчанию получил столбцы с одинаковой высотой. - Значение
center
, которое мы использовали в коде вверху, заставляет элементы сохранять свои собственные размеры, но центрирует их вдоль поперечной оси. Вот почему кнопки текущего примера центрированы по вертикали. - Также есть значения
flex-start
иflex-end
, которые выравнивают все элементы по началу и концу поперечной оси соответственно. См. подробнееalign-items
.
Вы можете переопределить align-items
поведение для отдельных flex элементов, применив свойство align-self
к ним. Например, попробуйте добавить эти строки в код:
button:first-child { align-self: flex-end; }
Посмотрите, что произошло и удалите эти строки.
justify-content
контролирует, где flex элементы располагаются на главной оси.
- По умолчанию стоит значение
flex-start
, которое располагает все элементы в начале главной оси. - Также можно использовать
flex-end,
чтобы расположить их в конце. center
— также одно из значенийjustify-content
, располагает все элементы по центру главной оси.- Значение, которое мы использовали выше,
space-around
, весьма полезно — оно распределяет все элементы равномерно по главной оси, с небольшим количеством свободного места на обоих концах. - И ещё одно значение,
space-between
, которое очень похоже наspace-around,
за исключением того, что оно не оставляет места на обоих концах.
Попробуйте немного поиграть с этими значениями прежде чем продолжить
Порядок элементов flex
В Flexbox также есть возможность менять порядок расположения flex элементов, не влияя на исходный порядок. Это ещё одна вещь, которую невозможно сделать традиционными методами CSS.
Код здесь простой: попробуйте добавить следующий CSS вниз вашего кода примера:
button:first-child { order: 1; }
и теперь вы увидите, что кнопка «Smile» переместилась в конец главной оси. Давайте теперь поговорим подробнее о том, как это работает:
- По умолчанию все элементы flex имеют значение
order
равное 0. - Элементы Flex с установленными на них бОльшими значениями будут отображаться позже в порядке отображения, чем элементы с меньшими значениями порядка.
- Элементы Flex с одинаковым значением порядка будут отображаться в исходном порядке. Так, если у вас есть четыре элемента с порядковыми значениями 2, 1, 1 и 0, установленными на них соответственно, их порядок отображения будет 4-й, 2-й, 3-й, затем 1-й.
- Третий элемент появляется после второго, потому что он имеет то же значение порядка и находится после него в порядке написания.
Вы можете установить отрицательные значения , чтобы элементы отображались раньше, чем элементы с установленным 0. Например, вы можете сделать, чтобы кнопка «Blush» появлялась в начале основной оси, используя следующее правило:
button:last-child { order: -1; }
Вложенные flex блоки
Можно создать несколько довольно сложных макетов с помощью flexbox. Совершенно нормально сделать flex элемент flex контейнером, чтобы его потомки также были flex блоками. Посмотрите на complex-flexbox.html (см. вживую).
HTML для этого довольно простой. У нас есть элемент <section>
, содержащий три <article>
. Третий <article>
содержит ещё три <div>
.
section - article article article - div - button div button div button button button
Давайте посмотрим на код, который мы использовали для макета.
Прежде всего, мы устанавливаем дочерние элементы <section>
в виде flex блоков.
section { display: flex; }
Затем мы устанавливаем несколько значений на самих <article>
. Обратите внимание на второе правило: мы устанавливаем третий <article>
, чтобы его дети были в макете в виде flex блоков, но на этот раз мы располагаем их как столбец.
article { flex: 1 200px; } article:nth-of-type(3) { flex: 3 200px; display: flex; flex-flow: column; }
Затем мы берём первый <div>
. Сначала мы пишем flex: 1 100px; чтобы дать ему минимальную высоту 100px, потом мы устанавливаем его дочерние элементы (элементы <button>
) также в виде flex блоков. Им мы назначаем перенос блоков и выравниваем их по центру доступного пространства, как это было в примере с кнопкой.
article:nth-of-type(3) div:first-child { flex: 1 100px; display: flex; flex-flow: row wrap; align-items: center; justify-content: space-around; }
Наконец, мы устанавливаем размер кнопке, мы даем ему значение flex 1. Это даёт очень интересный эффект, который вы увидите, если попытаетесь изменить размер ширины окна браузера. Кнопки занимают столько места, сколько могут, и сидят на одной линии также, сколько могут. Если же они не могут комфортно расположиться на одной линии, они перепрыгнут на новые строки.
button { flex: 1; margin: 5px; font-size: 18px; line-height: 1.5; }
Совместимость с браузерами
Поддержка Flexbox доступна в большинстве новых браузеров: Firefox, Chrome, Opera, Microsoft Edge и IE 11, более поздних версиях Android / iOS и т. д.. Однако помните, что до сих пор используются более старые браузеры, которые не поддерживают Flexbox ( или поддерживают, но старую версию.)
Пока вы просто учитесь и экспериментируете, это не имеет большого значения. Однако, если вы рассматриваете возможность использования flexbox на реальном веб-сайте, вам необходимо провести тестирование и убедиться, что ваш пользовательский интерфейс по-прежнему приемлем в максимально возможном количестве браузеров.
Flexbox немного сложнее, чем некоторые функции CSS. Например, если в браузере отсутствует поддержка CSS тени, сайт по-прежнему будет можно использовать. А вот неподдерживаемые функции flexbox, возможно, полностью сломают макет, что сделает сайт непригодным.
Мы обсудим возможности преодоления проблем поддержки кросс-браузерности в следующем модуле.
Подытожим
Мы завершаем нашу статью по основам flexbox. Надеемся, что вам понравилось, и вы хорошо развлечётесь, путешествуя дальше и изучая его. Далее мы рассмотрим еще один важный аспект макетов CSS — grid-системы.
У меня не поднялась рука удалить эту статью окончательно, но я рекомендую Вам вместо неё, всё-таки, прочитать ту.
CSS3 Flexible Box, или просто flexbox — это режим разметки, созданный для упорядочения элементов на странице таким образом, чтобы они вели себя предсказуемо в случаях, когда разметка страницы адаптирована под различные размеры экрана и устройства. Во многих случаях флексбоксы лучше блочной модели разметки, поскольку не использует обтекания (floats) и не выполняет схлопывание отступлений flex-контейнера и его содержимого (margin collapse).
Для многих дизайнеров модель использования флексбоксов будет более простой для применения. Дочерние элементы внутри флексбокса могут размещаться в любом направлении и могут менять размер, чтобы адаптироваться к различным размерам дисплея. Позиционирование элементов в таком случае является простым и комплексная разметка достигается значительно легче и с более чистым кодом, поскольку порядок отображения элементов не связан с их порядком в коде. Эта независимость умышленно касается только визуального рендеринга, оставляя порядок интерпретации и навигацию зависимыми от порядка в исходниках.
Внимание: некоторые браузеры все еще могут частично или полностью не поддерживать флексбоксы. Ознакомьтесь с таблицей совместимости.Концепция Flexbox
Главной концепцией Flexbox есть возможность изменения высоты и/или ширины его элементов, чтобы лучше заполнять пространство любого дисплея. Flex-контейнер увеличивает элементы, чтобы заполнить доступное пространство или уменьшает чтобы предотвратить перекрытие.
Алгоритм разметки флексбоксами агностичено направлен в противовес блочной разметке, которая ориентирована строго вертикально, или горизонтально-ориентированной инлайн-разметке. Несмотря на то что разметка блоками хорошо подходит для страницы, ей не хватает объективного механизма для поддержки компонентов, которые должны менять ориентацию, размеры а также растягиваться или сжиматься при изменениях размера экрана, изменении ориентации с вертикальной на горизонтальную и так далее. Разметка флексбоксами наиболее желательна для компонентов приложения и шаблонов, которые мало масштабируются, тогда как grid-разметка создана для больших шаблонов. Обе технологии являются частью разработки CSS Working Group которая должна способствовать совместимости web-приложений с различными браузерами, режимами а также большей гибкости.
Терминология
Поскольку описание флексбоксов не включает таких словосочетаний, как горизонтальная / inline и вертикальная / block оси, объяснение модели предусматривает новую терминологию. Используйте следующую диаграмму при просмотре словаря терминов. Она изображает flex-контейнер, имеющий flex-направление ряда, что означает, что каждый flex item расположен горизонтально, друг за другом по главной оси (main axis) в соответствии с установленным направлением написания текста элемента. Слева направо в данном случае.
- Flex-контейнер
- Родительский элемент, в котором содержатся flex-элементы. Flex-контейнер определяется установкой свойства
display
вflex
илиinline-flex
. - Flex-элемент, flex item
Каждый дочерний элемент flex-контейнера становится flex-элементом. Текст, который напрямую содержится в flex-контейнере, оборачивается анонимным flex-элементом.
- Оси
Каждый flexible-бокс шаблон строится по двум осям. Главная ось (main axis) — это ось, вдоль которой flex-элементы следуют один за другим, а перекрёстная ось (cross axis) перпендикулярна ей.
- Свойство
устанавливает главную ось.flex-direction
- Свойство
определяет расположение элементов вдоль главной оси в текущем ряду.justify-content
- Свойство
align-items
расположение элементов вдоль перекрёстной оси в текущем ряду. - Свойство
align-self
устанавливает, как отдельный flex-элемент выровнен по перекрёстной оси, переопределяя значения, установленные с помощьюalign-items.
- Свойство
- Направления
Главное начало и конец (main) и перекрёстное начало и конец (cross start/end) — это стороны контейнера, определяющие начало и окончание потока flex-элемментов. Они следуют по главной и перекрестной осями flex-контейнера в векторе, установленном режимом написания (
writing-mode
) (слева направо, справа налево и т. д.).- Свойство
order
присваивает элементы порядковым группам и определяет, в каком порядке их показывать. - Свойство
flex-flow
— это короткая форма, состоящая из свойствflex-direction
иflex-wrap
, определяющих расплолжение элементов.
- Свойство
- Линии
Flex-элементы могут размещаться на одной или нескольких линиях в зависимости от значения свойства
flex-wrap
, которое контролирует направление перекрестных линий и направление в котором складываются новые линии.- Размеры
Флекс элементы агностически эквивалентны высоте и ширине главного размера и поперечного размера, которые равны, соответственно, главной оси (main axis) и поперечной оси (cross axis) флекс-контейнера.
Делаем элемент флексбоксом
Чтобы сделать элемент flexible-боксом, укажите значение display
следующим образом:
display: flex
или
display: inline-flex
Таким образом мы определяем элемент как флексбокс, а его дочерниие элементы — как flex-элементы. Значение flex
делает контейнер блочным элементом, а inline-flex
значение превращает его в инлайн-элемент.
Внимание: для указания префикса вендора, добавьте строку в значение атрибута, а не к самому атрибуту. Например, display: -webkit-flex
.
Рассмотрим flex-элементы
Текст, который содержится непосредственно внутри flex-контейнера, автоматически оборачивается анонимным flex-элементом. Однако, анонимный flex-элемент, содержащий только пробелы, не отображается (как будто было указано значение display: none
).
Абсолютно позиционированные дочерние элементы flex-контейнера позиционируются так, что их статическое положение определяется относительно главного начального угла содержащего их flex-контейнера.
Отступы (margin) соседних flex-контейнеров не схлопываются. Установка значений margin: auto
поглощает дополнительное место в вертикальном или горизонтальном направлении и может быть использовано для выравнивания или для разделения соседних flex-элементов. См. Выравнивание при помощи ‘автоматических’ отступов в разделе «Модель расположения при помощи flex-контейнеров» спецификации W3C.
Свойства выравнивания flexbox выполняют «истинное» центрирование в отличие от других способов центрирования в CSS. Это означает, что flex-элементы будут оставаться отцентрированными даже если они переполняют flex-контейнер. Впрочем, это может иногда быть проблематичным, если они вылезают за верхний или левый край страницы (в языках с написанием слева направо; в языках с написанием справа налево, таких как арабский, возникает проблема с правой границей), так как вы не можете прокрутить страницу в данную область даже если там есть содержимое! В будущем релизе свойства выравнивания будут также дополнены «безопасной» опцией. На данный момент, если это проблема, вы можете использовать отступы (margin) для достижения центрирования, так как они сработают «безопасно» и центрирование будет прекращено при переполнении. Вместо использования свойства align-
просто установите автоматические отступы (margin: auto)
для flex-элементов, которые вы хотите отцентрировать. Вместо свойств justify-
установите margin: auto
на внешние края первого и последнего элемента в flex-контейнере. Автоматические отступы будут «подстраиваться» и занимать оставшееся место, центрируя flex-элементы при наличии свободного места и используя стандартное выравнивание при его отсутствии. Тем не менее, если вы пытаетесь заменить justify-content
центрированием, основанным на отступах (margin-based) в многострочном flexbox, вам, видимо, не повезло, так как вам необходимо установить отступы для первого и последнего элемента на каждой строке. Если вы не можете предугадать заранее на какой строке окажется каждый элемент, вы не сможете надежно использовать центрирование, основанное на отступах, на основной оси для замены свойства justify-content
.
Помните, что, несмотря на то, что порядок отображения элементов не зависит от их положения в исходном коде, эта независимость затрагивает только визуальное отображение, оставляя навигацию и голосовую помощь в исходном порядке. Даже свойство order
не влияет на очередность голосовой помощи и навигации. Таким образом, разработчики должны уделять внимание правильному порядку элементов в исходном коде, чтобы не навредить доступности документа.
Свойства Flexbox
Свойства, не влияющие на Flexbox
Так как flexbox используют другой алгоритм расположения, некоторые свойства не имеют смысла для flex-контейнера:
Пример
Типичный пример flex
Типичный пример показывает как применять «flex-эффект» к элементам и как соседние элементы ведут себя в состоянии flex.
<!DOCTYPE html> <html lang="en"> <head> <style> .flex { /* basic styling */ width: 350px; height: 200px; border: 1px solid #555; font: 14px Arial; /* flexbox setup */ display: flex; flex-direction: row; } .flex > div { flex: 1 1 auto; width: 30px; /* To make the transition work nicely. (Transitions to/from "width:auto" are buggy in Gecko and Webkit, at least. See http://bugzil.la/731886 for more info.) */ transition: width 0.7s ease-out; } /* colors */ .flex > div:nth-child(1){ background: #009246; } .flex > div:nth-child(2){ background: #F1F2F1; } .flex > div:nth-child(3){ background: #CE2B37; } .flex > div:hover { width: 200px; } </style> </head> <body> <p>Flexbox nuovo</p> <div> <div>uno</div> <div>due</div> <div>tre</div> </div> </body> </html>
Пример расположения «Священный Грааль»
Данный пример показывает как flexbox предоставляет возможность динамически изменять расположение для различных разрешений экрана. Следующая схема иллюстрирует преобразование.
Здесь изображен случай, когда расположение, подходящее для окна браузера должно быть оптимизировано для экрана смартфона. Не только элементы должны уменьшиться в размере, но и порядок, в котором они отображаются, должен измениться. Flexbox сильно упрощает это.
<!DOCTYPE html> <html lang="en"> <head> <style> body { font: 24px Helvetica; background: #999999; } #main { min-height: 800px; margin: 0px; padding: 0px; display: flex; flex-flow: row; } #main > article { margin: 4px; padding: 5px; border: 1px solid #cccc33; border-radius: 7pt; background: #dddd88; flex: 3 1 60%; order: 2; } #main > nav { margin: 4px; padding: 5px; border: 1px solid #8888bb; border-radius: 7pt; background: #ccccff; flex: 1 6 20%; order: 1; } #main > aside { margin: 4px; padding: 5px; border: 1px solid #8888bb; border-radius: 7pt; background: #ccccff; flex: 1 6 20%; order: 3; } header, footer { display: block; margin: 4px; padding: 5px; min-height: 100px; border: 1px solid #eebb55; border-radius: 7pt; background: #ffeebb; } /* Too narrow to support three columns */ @media all and (max-width: 640px) { #main, #page { flex-direction: column; } #main > article, #main > nav, #main > aside { /* Return them to document order */ order: 0; } #main > nav, #main > aside, header, footer { min-height: 50px; max-height: 50px; } } </style> </head> <body> <header>header</header> <div> <article>article</article> <nav>nav</nav> <aside>aside</aside> </div> <footer>footer</footer> </body> </html>
Песочница
Существует несколько песочниц с flexbox, доступных онлайн для экспериментов:
О чем нужно помнить
Алгоритм, описывающий как flex-элементы располагаются, иногда может быть довольно запутанным. Вот несколько правильных решений, которые позволят избежать неприятных сюрпризов при верстке с использованием flexbox.
Flexbox располагаются в соответствие с направлением письма, что означает, что главное начало и главный конец располагаются в зависимости от положения начала и конца (строки — прим.).
Перекрестное начало и перекрестный конец полагаются на определение позиции начала и конца, которое зависит от значения свойства
.direction
Разрывы страницы допустимы в расположении flex-контейнеров, когда это позволяет свойство break-. Свойства
CSS3 break-after
, break-before
и break-inside
, а также свойства CSS 2.1 page-break-before
, page-break-after
и page-break-inside
работают на flex-контейнере, flex-элементах, а также внутри flex-элементов.
Совместимость с браузерами
Feature | Firefox Mobile (Gecko) | Firefox OS | Android | IE Phone | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support (single-line flexbox) | 18.0 (18.0)-moz[2] 22.0 (22.0) | 1.0-moz[2] | 2.1-webkit[4] 4.4 | 11 | 12.10[5] 15-webkit | 7-webkit[1] |
Multi-line flexbox | 28.0 (28.0) | 1.3 | 2.1-webkit[4] 4.4 | 11 | 12.10[5] 15-webkit | 7-webkit[1] |
[1] Safari до версии 6.0 (iOS.1) поддерживал старую несовместимую черновую версию спецификации. Safari 6.1 (и Safari на iOS 7) был обновлен для поддержки финальной версии.
[2] До Firefox 22, чтобы активировать поддержку flexbox, пользователь должен установить параметр about:config
layout.css.flexbox.enabled
в значение true
. Начиная с Firefox 22 по Firefox 27, параметр установлен в true
по умолчанию, и полностью исключен в Firefox 28.
[3] Internet Explorer 10 поддерживает старую несовместимую черновую версию спецификации; Internet Explorer 11 был обновлен для поддержки финальной версии.
[4] Android browser до версии 4.3 поддерживал старую несовместимую черновую версию спецификации. Android 4.4 был обновлен для поддержки финальной версии.
[5] Хотя изначальная реализация в Opera 12.10 flexbox
была без приставки, она получила приставку -webkit в версиях с 15 по 16 Opera и с 15 по 19 Opera Mobile. Приставка была снова убрана в Opera 17 и Opera Mobile 24.
[6] До Firefox 29, установка visibility: collapse
для flex-элемента заставляет его обрабатываться как display: none
вместо предполагаемого поведения, обрабатывающего его как visibility: hidden
. Предложенное решение — использовать visibility:hidden
для flex-элементов, которые должны вести себя как при установленном visibility:collapse
. Для большей информации, см баг 783470.
См. также
- Проект Flexbugs для информации о багах в браузерных реализациях flexbox.
flex-wrap — Веб-технологии для разработчиков
Этот перевод не завершён. Пожалуйста, помогите перевести эту статью с английского
Свойство CSS flex-wrap
задает правила вывода flex-элементов — в одну строку или в несколько, с переносом блоков. Если перенос разрешен, то возможно задать направление, в котором выводятся блоки.
flex-wrap: nowrap; flex-wrap: wrap; flex-wrap: wrap-reverse; /* Global values */ flex-wrap: inherit; flex-wrap: initial; flex-wrap: unset;
Подробнее по свойствам и общей информации смотрите Using CSS flexible boxes.
Syntax
Свойство flex-wrap
может содержать одно из следующих ниже значений.
Значения
Допускаются следующие значения:
nowrap
- Расположение в одну линию, может привести к переполнению контейнера. Свойсвто cross-start эквивалентно start или before в зависимости от значения
flex-direction
. wrap
- Расположение в несколько линий. Свойство cross-start эквивалентно start или before в зависимости отзначения
flex-direction
и свойство cross-end противоположно cross-start. wrap-reverse
- Ведёт себя так же, как и
wrap
но cross-start и cross-end инвертированы. Formal syntax
nowrap | wrap | wrap-reverse
Examples
HTML
<h5>This is an example for flex-wrap:wrap </h5> <div> <div>1</div> <div>2</div> <div>3</div> </div> <h5>This is an example for flex-wrap:nowrap </h5> <div> <div>1</div> <div>2</div> <div>3</div> </div> <h5>This is an example for flex-wrap:wrap-reverse </h5> <div> <div>1</div> <div>2</div> <div>3</div> </div>
CSS
/* Common Styles */ .content, .content1, .content2 { color: #fff; font: 100 24px/100px sans-serif; height: 150px; text-align: center; } .content div, .content1 div, .content2 div { height: 50%; width: 50%; } .red { background: orangered; } .green { background: yellowgreen; } .blue { background: steelblue; } /* Flexbox Styles */ .content { display: flex; flex-wrap: wrap; } .content1 { display: flex; flex-wrap: nowrap; } .content2 { display: flex; flex-wrap: wrap-reverse; }
Results
Specifications
Browser compatibility
Update compatibility data on GitHubКомпьютеры | Мобильные | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | Android webview | Chrome для Android | Firefox для Android | Opera для Android | Safari on iOS | Samsung Internet | |
flex-wrap | Chrome Полная поддержка 29
| Edge Полная поддержка 12 | Firefox Полная поддержка 28 | IE Частичная поддержка 11
| Opera Полная поддержка 17 | Safari Полная поддержка 9
| WebView Android Полная поддержка 4.4
| Chrome Android Полная поддержка 29
| Firefox Android Полная поддержка 52 | Opera Android Полная поддержка 18 | Safari iOS Полная поддержка 9
| Samsung Internet Android Полная поддержка 2.0
|
Легенда
- Полная поддержка
- Полная поддержка
- Частичная поддержка
- Частичная поддержка
- Смотрите замечания реализации.
- Смотрите замечания реализации.
- Требует вендорный префикс или другое имя для использования.
- Требует вендорный префикс или другое имя для использования.
See also
Верстаем новостной сайт с помощью Flexbox / Хабр
Примечание: этот материал представляет собой свободный перевод статьи Джереми Томаса о том, как просто работать с Flexbox на примере верстки шаблона новостного сайта.
Поверьте, нет никакой необходимости в детальном разборе всех аспектов работы с Flexbox, если вы хотите начать им пользоваться уже сейчас. В этом руководстве автор собирается познакомить вас с некоторыми свойствами Flexbox и сделать «новостной лейаут» наподобие того, который вы могли видеть на сайте The Guardian.
Причина, по которой автор использует Flexbox – это большое количество возможностей, которые он предоставляет:
— легкость в создании адаптивных столбцов;
— создание столбцов одинаковой высоты;
— возможность прижатия содержимого к низу контейнера.
Ну, поехали!
1. Начинаем с создания двух столбцов
Создание столбцов при помощи CSS всегда влекло за собой определенные трудности. На протяжении длительного времени для выполнения данной задачи широко использовались (и используются) float’ы и / или таблицы, но каждый из этих методов имел (и имеет) свои недостатки.
В свою очередь, Flexbox упрощает этот процесс, обладая рядом таких преимуществ, как:
— написание более «чистого» кода: от нас лишь требуется создать контейнер с правилом display: flex;
— гибкость: мы можем изменять размер, растягивать и выравнивать столбцы путем изменения пары строк CSS;
— семантическая разметка;
— кроме того, с использованием Flexbox отпадает необходимость отменять обтекание во избежание непредсказуемого поведения лейаута.
Давайте начнем работу с создания двух столбцов, один из которых будет занимать 2/3 ширины нашего контейнера, а еще один — 1/3 его часть.
<div>
<div>
2/3 column
</div>
<div>
1/3 column
</div>
</div>
Здесь присутствуют два элемента:
— контейнер columns;
— два дочерних элемента column, один из которых имеет дополнительный класс main-column, который мы используем позже для того, чтобы сделать столбец шире.
.columns {
display: flex;
}
.column {
flex: 1;
}
.main-column {
flex: 2;
}
Поскольку main-column имеет значение flex равное 2, то этот столбец займет в два раза больше места, чем второй.
Добавим немного визуального оформления и, в итоге, получим:
Кликните для просмотра в действии
2. Делаем каждый столбец flexbox-контейнером
Каждый из двух столбцов будет содержать несколько вертикально расположенных статей, поэтому из этих двух элементов мы, в свою очередь, также должны сделать flexbox-контейнеры.
Итак, нам необходимо, чтобы статьи:
— располагались вертикально внутри столбца-контейнера;
— занимали все доступное место.
Правило flex-direction: column, указанное для контейнера, вместе с правилом flex: 1, указанным для дочернего элемента, позволяет статье заполнить все свободное место по вертикали, при этом высота первых двух столбцов останется неизменной.
Кликните для просмотра в действии
3. Делаем контейнер из статьи
Теперь, чтобы еще больше расширить наши возможности, давайте представим каждую статью в виде flexbox-контейнера. Каждый такой контейнер будет содержать:
— заголовок;
— параграф;
— информационную панель с именем автора и количеством комментариев;
— какую-нибудь адаптивную картинку.
Здесь мы используем Flexbox для того, чтобы «прижать» информационную панель к низу элемента. Вот, посмотрите, какой результат мы ожидаем получить.
А вот и сам код:
<a>
<figure>
<img src="">
</figure>
<div>
<h3>
<!-- Заголовок -->
</h3>
<p>
<!-- Контент -->
</p>
<footer>
<!-- Информация -->
</footer>
</div>
</a>
.article {
display: flex;
flex-direction: column;
flex-basis: auto; /* Устанавливает начальный размер элемента в зависимости от его содержимого */
}
.article-body {
display: flex;
flex: 1;
flex-direction: column;
}
.article-content {
flex: 1; /* Содержимое заполняет все оставшееся место, тем самым прижимая информационную панель к нижней части */
}
Элементы внутри статьи расположены вертикально благодаря использованию правила flex-direction: column.
Также мы применили свойство flex: 1 к элементу article-content, тем самым растянув его на все свободное место и прижав article-info к низу. Высота столбцов в этом случае не имеет значения.
Кликните для просмотра в действии
4. Добавляем несколько вложенных столбцов
На самом деле, нам нужно, чтобы левый столбец включал в себя еще несколько столбцов. Поэтому нам необходимо заменить второй элемент, отвечающий за статью, контейнером columns, который мы использовали ранее.
<div>
<div>
<a>
<!-- Содержимое статьи -->
</a>
</div>
<div>
<a>
<!-- Содержимое статьи -->
</a>
<a>
<!-- Содержимое статьи -->
</a>
<a>
<!-- Содержимое статьи -->
</a>
</div>
</div>
Поскольку мы хотим, чтобы первый вложенный столбец был шире, добавим к элементу класс nested-column, а в CSS укажем:
.nested-column {
flex: 2;
}
Теперь этот столбец будет вдвое шире второго.
Кликните для просмотра в действии
5. Делаем первую статью с горизонтальным лейаутом
Первая статья у нас на самом деле большая. Дабы эффективно использовать место на экране монитора, давайте изменим ее ориентацию на горизонтальную.
.first-article {
flex-direction: row;
}
.first-article .article-body {
flex: 1;
}
.first-article .article-image {
height: 300px;
order: 2;
padding-top: 0;
width: 400px;
}
Свойство order в данном случае играет большую роль, поскольку оно позволяет изменять очередность HTML-элементов без изменения HTML-разметки. В действительности, article-image в коде идет перед элементом article-body, но ведет себя так, будто стоит после него.
Кликните для просмотра в действии
6. Делаем адаптивный лейаут
Теперь все выглядит так, как мы хотели, хотя и немного сплющено. Давайте исправим это, добавив нашему лейауту гибкости.
Одной из замечательных вещей в Flexbox является то, что достаточно удалить правило display: flex в контейнере для того, чтобы полостью отключить его (Flexbox), в то время, как остальные его свойства (такие, как align-items или flex) останутся рабочими.
В результате, мы можем активировать адаптивный лейаут, задействовав Flexbox только тогда, когда в этом будет необходимость.
Итак, мы собираемся удалить display: flex из селекторов .columns и .column, вместо этого «запаковав» их в медиа-запрос:
@media screen and (min-width: 800px) {
.columns,
.column {
display: flex;
}
}
Вот и все! На экранах с маленьким разрешением все статьи будут располагаться друг над другом, а на экранах с разрешением свыше 800 пикселей — в два столбца.
7. Добавляем завершающие штрихи
Для того, чтобы лейаут выглядел более привлекательно на больших экранах, давайте добавим кое-какие CSS-твики:
@media screen and (min-width: 1000px) {
.first-article {
flex-direction: row;
}
.first-article .article-body {
flex: 1;
}
.first-article .article-image {
height: 300px;
order: 2;
padding-top: 0;
width: 400px;
}
.main-column {
flex: 3;
}
.nested-column {
flex: 2;
}
}
Содержимое первой статьи выровнено по горизонтали: текст расположен по левой стороне, а картинка — по правой. Также, главный столбец теперь стал шире (75%). То же самое касается и вложенного столбца (66%).
А вот и финальный результат!
Кликните для просмотра в действии
Вывод
Теперь вы и сами видите, что использовать Flexbox в своих проектах можно даже не вникая во все его тонкости, и созданный лейаут — наглядный тому пример. По крайней мере, автор очень надеется на это.
flex-basis | Chrome Полная поддержка 29
| Edge Полная поддержка 12
| Firefox Полная поддержка 22
| IE Полная поддержка 11
| Opera Полная поддержка 12.1
| Safari Полная поддержка 9
| WebView Android Полная поддержка 4.4
| Chrome Android Полная поддержка 29
| Firefox Android Полная поддержка 22
| Opera Android Полная поддержка 12.1
| Safari iOS Полная поддержка 9
| Samsung Internet Android Полная поддержка 2.0
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
auto | Chrome Полная поддержка 22 | Edge Полная поддержка 12 | Firefox Полная поддержка 18 | IE Полная поддержка 11 | Opera Полная поддержка 12.1 | Safari Полная поддержка 7
| WebView Android Полная поддержка ≤37 | Chrome Android Полная поддержка 25 | Firefox Android Полная поддержка 18 | Opera Android Полная поддержка 12.1 | Safari iOS Полная поддержка 7
| Samsung Internet Android Полная поддержка 1.5 |
content | Chrome Нет поддержки Нет | Edge Нет поддержки 12 — 79 | Firefox Полная поддержка 61 | IE Нет поддержки Нет | Opera Нет поддержки Нет | Safari Нет поддержки Нет | WebView Android Нет поддержки Нет | Chrome Android Нет поддержки Нет | Firefox Android Полная поддержка 61 | Opera Android Нет поддержки Нет | Safari iOS Нет поддержки Нет | Samsung Internet Android Нет поддержки Нет |
max-content | Chrome Нет поддержки Нет | Edge Нет поддержки Нет | Firefox Полная поддержка 66
| IE Нет поддержки Нет | Opera Нет поддержки Нет | Safari Нет поддержки Нет | WebView Android Нет поддержки Нет | Chrome Android Нет поддержки Нет | Firefox Android Полная поддержка 66
| Opera Android Нет поддержки Нет | Safari iOS Нет поддержки Нет | Samsung Internet Android Нет поддержки Нет |
min-content | Chrome Нет поддержки Нет | Edge Нет поддержки Нет | Firefox Полная поддержка 66
| IE Нет поддержки Нет | Opera Нет поддержки Нет | Safari Нет поддержки Нет | WebView Android Нет поддержки Нет | Chrome Android Нет поддержки Нет | Firefox Android Полная поддержка 66
| Opera Android Нет поддержки Нет | Safari iOS Нет поддержки Нет | Samsung Internet Android Нет поддержки Нет |
flex-wrap | CSS | WebReference
Указывает, следует ли флексам располагаться в одну строку или можно занять несколько строк. Если перенос строк допускается, то свойство также позволяет контролировать направление, в котором выкладываются строки.
Краткая информация
Значение по умолчанию | nowrap |
---|---|
Наследуется | Нет |
Применяется | К флекс-контейнеру |
Анимируется | Нет |
Синтаксис
flex-wrap: nowrap | wrap | wrap-reverse
Обозначения
Описание | Пример | |
---|---|---|
<тип> | Указывает тип значения. | <размер> |
A && B | Значения должны выводиться в указанном порядке. | <размер> && <цвет> |
A | B | Указывает, что надо выбрать только одно значение из предложенных (A или B). | normal | small-caps |
A || B | Каждое значение может использоваться самостоятельно или совместно с другими в произвольном порядке. | width || count |
[ ] | Группирует значения. | [ crop || cross ] |
* | Повторять ноль или больше раз. | [,<время>]* |
+ | Повторять один или больше раз. | <число>+ |
? | Указанный тип, слово или группа не является обязательным. | inset? |
{A, B} | Повторять не менее A, но не более B раз. | <радиус>{1,4} |
# | Повторять один или больше раз через запятую. | <время># |
Значения
- nowrap
- Флексы выстраиваются в одну линию.
- wrap
- Флексы выстраиваются в несколько строк, их направление задаётся свойством flex-direction.
- wrap-reverse
- Флексы выстраиваются в несколько строк, в направлении, противоположном flex-direction.
Пример
<!DOCTYPE html> <html> <head> <meta charset=»utf-8″> <title>flex-wrap</title> <style> .flex-container { padding: 0; margin: 0; list-style: none; display: flex; flex-wrap: wrap; } .flex-item { padding: 20px; background: #f0f0f0; border-radius: 5px; margin: 1rem; text-align: center; } </style> </head> <body> <ul> <li><img src=»image/aquaria1.jpg» alt=»»></li> <li><img src=»image/aquaria2.jpg» alt=»»></li> <li><img src=»image/aquaria3.jpg» alt=»»></li> </ul> </body> </html>
Примечание
Safari до версии 9 поддерживает свойство -webkit-flex-wrap.
Спецификация
Каждая спецификация проходит несколько стадий одобрения.
- Recommendation (Рекомендация) — спецификация одобрена W3C и рекомендована как стандарт.
- Candidate Recommendation (Возможная рекомендация) — группа, отвечающая за стандарт, удовлетворена, как он соответствует своим целям, но требуется помощь сообщества разработчиков по реализации стандарта.
- Proposed Recommendation (Предлагаемая рекомендация) — на этом этапе документ представлен на рассмотрение Консультативного совета W3C для окончательного утверждения.
- Working Draft (Рабочий проект) — более зрелая версия черновика после обсуждения и внесения поправок для рассмотрения сообществом.
- Editor’s draft (Редакторский черновик) — черновая версия стандарта после внесения правок редакторами проекта.
- Draft (Черновик спецификации) — первая черновая версия стандарта.
Браузеры
В таблице браузеров применяются следующие обозначения.
- — свойство полностью поддерживается браузером со всеми допустимыми значениями;
- — свойство браузером не воспринимается и игнорируется;
- — при работе возможно появление различных ошибок, либо свойство поддерживается лишь частично, например, не все допустимые значения действуют или свойство применяется не ко всем элементам, которые указаны в спецификации.
Число указывает версию браузера, начиная с которой свойство поддерживается.
Автор и редакторы
Автор: Влад Мержевич
Последнее изменение: 24.04.2020
Редакторы: Влад Мержевич
CSS Flexbox (Гибкая коробка)
Попробуй сам »
CSS Flexbox Layout Module
До появления модуля Flexbox Layout было четыре режима макета:
- Блок
- , для разделов на веб-странице
- Inline, для текста
- Таблица, для двумерных данных таблицы
- Позиционируется, для явного положения элемента
Модуль гибкой компоновки коробки упрощает проектирование гибкая адаптивная структура макета без использования поплавка или позиционирования.
Поддержка браузера
Свойства flexbox поддерживаются во всех современных браузерах.
Flexbox Elements
Чтобы начать использовать модель Flexbox, сначала необходимо определить контейнер Flex.
Элемент выше представляет гибкий контейнер (синяя область) с тремя гибкими элементами.
Пример
Гибкий контейнер с тремя гибкими предметами:
Попробуй сам »
Родительский элемент (контейнер)
Гибкий контейнер становится гибким, если установить для свойства display
значение flex :
Пример
,флекс-контейнер {
дисплей: гибкий;
}
Свойства гибкого контейнера:
Flex-direction Свойство
Свойство flex-direction
определяет, в каком направлении находится контейнер
хочет складывать гибкие элементы.
Пример
Столбец Значение суммирует элементы Flex по вертикали (сверху вниз):
.flex-контейнер {
дисплей: гибкий;
flex-direction: столбец;
}
Попробуй сам »
Пример
Значение в обратном столбце складывает гибкие элементы вертикально (но снизу вверх):
,флекс-контейнер {
дисплей: гибкий;
направление изгиба: обратный столбец;
}
Попробуй сам »
Пример
В строке значение складывает гибкие элементы по горизонтали (слева направо):
.flex-контейнер {
дисплей: гибкий;
flex-direction: row;
}
Попробуй сам »
Пример
Значение обратного ряда складывает гибкие элементы по горизонтали (но справа налево):
,флекс-контейнер {
дисплей: гибкий;
flex-direction: row-reverse;
}
Попробуй сам »
Свойство flex-wrap
Свойство flex-wrap
указывает, является ли
гибкие предметы должны оборачиваться или нет
В приведенных ниже примерах 12 элементов flex, чтобы лучше продемонстрировать свойство flex-wrap
Пример
Значение намотки указывает, что сгибаемые элементы будут наматываться при необходимости:
,флекс-контейнер {
дисплей: гибкий;
flex-wrap: обертывание;
}
Попробуй сам »
Пример
Значение nowrap указывает, что элементы flex не будут переноситься (это по умолчанию):
.flex-контейнер {
дисплей: гибкий;
flex-wrap: nowrap;
}
Попробуй сам »
Пример
Значение с переворачиванием указывает, что гибкие элементы будут обернуты при необходимости, в обратном порядке:
,флекс-контейнер {
дисплей: гибкий;
гибкая упаковка: обратная упаковка;
}
Попробуй сам »
Свойство flex-flow
Свойство flex-flow
является сокращенным свойством для настройки обоих .
flex-direction
и flex-wrap
свойства.
The justify-content Недвижимость
Свойство justify-content
используется для
выровняйте элементы flex:
Пример
Значение по центру выравнивает гибкие элементы в центре контейнера:
,флекс-контейнер {
дисплей: гибкий;
justify-content: центр;
}
Попробуй сам »
Пример
Значение flex-start выравнивает элементы flex в начале контейнера (по умолчанию):
.flex-контейнер {
дисплей: гибкий;
justify-content: flex-start;
}
Попробуй сам »
Пример
Значение flex-end выравнивает элементы flex на конце контейнера:
,флекс-контейнер {
дисплей: гибкий;
justify-content: flex-end;
}
Попробуй сам »
Пример
Значение — около отображает гибкие элементы с пробелом до, между, и после строк:
.flex-контейнер {
дисплей: гибкий;
justify-content: пространство вокруг;
}
Попробуй сам »
Пример
Значение в интервале между отображает гибкие элементы с пробелом между линии:
,флекс-контейнер {
дисплей: гибкий;
justify-content: пробел между
}
Попробуй сам »
Свойство align-items Property
Свойство align-items
используется для выравнивания
гибкие предметы.
В этих примерах мы используем контейнер высотой 200 пикселей, чтобы лучше продемонстрировать свойство align-items
.
Пример
Значение по центру выравнивает гибкие элементы в середине контейнер:
,флекс-контейнер {
дисплей: гибкий; Высота
: 200 пикселей;
align-items: center;
}
Попробуй сам »
Пример
Значение flex-start выравнивает элементы flex в верхней части контейнера:
.flex-контейнер {
дисплей: гибкий; Высота
: 200 пикселей;
align-items: flex-start;
}
Попробуй сам »
Пример
Значение flex-end выравнивает элементы flex в нижней части контейнера:
,флекс-контейнер {
дисплей: гибкий; Высота
: 200 пикселей;
align-items: flex-end;
}
Попробуй сам »
Пример
Значение stretch растягивает гибкие элементы для заполнения контейнера. (по умолчанию):
.flex-контейнер {
дисплей: гибкий; Высота
: 200 пикселей;
align-items: stretch;
}
Попробуй сам »
Пример
Исходное значение выравнивает элементы flex, такие как их базовые линии:
,флекс-контейнер {
дисплей: гибкий; Высота
: 200 пикселей;
align-items: baseline;
}
Примечание. В примере используется другой размер шрифта, чтобы продемонстрировать выравнивание элементов по базовой линии текста:
Попробуй сам »
Свойство align-content
Свойство align-content
используется для выравнивания гибких линий.
В этих примерах мы используем контейнер высотой 600 пикселей со свойством flex-wrap, установленным на wrap , чтобы лучше продемонстрировать свойство align-content
.
Пример
Значение в интервале между отображает линии сгиба с равным интервалом между ними:
.flex-контейнер {
дисплей: гибкий; Высота
: 600 пикселей;
flex-wrap: обертывание;
выровнять содержание: пространство между;
}
Попробуй сам »
Пример
Значение — около отображает гибкие линии с пробелом ранее, между ними и после них:
,флекс-контейнер {
дисплей: гибкий; Высота
: 600 пикселей;
flex-wrap: обертывание;
выровнять содержание: пространство вокруг;
}
Попробуй сам »
Пример
Значение простирания растягивает линии сгиба, чтобы занять оставшиеся пробел (по умолчанию):
.flex-контейнер {
дисплей: гибкий; Высота
: 600 пикселей;
flex-wrap: обертывание;
align-content: stretch;
}
Попробуй сам »
Пример
На центральных дисплеях значений отображаются гибкие линии в середине контейнера:
,флекс-контейнер {
дисплей: гибкий; Высота
: 600 пикселей;
flex-wrap: обертывание;
выравнивание контента: центр;
}
Попробуй сам »
Пример
Значение flex-start отображает линии сгиба в начале контейнера:
.flex-контейнер {
дисплей: гибкий; Высота
: 600 пикселей;
flex-wrap: обертывание;
align-content: flex-start;
}
Попробуй сам »
Пример
Значение flex-end отображает линии сгиба в конце контейнера:
,флекс-контейнер {
дисплей: гибкий; Высота
: 600 пикселей;
flex-wrap: обертывание;
align-content: flex-end;
}
Попробуй сам »
Идеальное Центрирование
В следующем примере мы решим очень распространенную проблему стиля: perfect центрирования.
РЕШЕНИЕ: Установите свойства justify-content
и align-items
для центр, и гибкий элемент будет идеально отцентрирован:
Пример
,flex-container {
дисплей: flex; Высота
: 300 пикселей;
justify-content:
центр;
предметов выравнивания: центр;
}
Попробуй сам »
Дочерние элементы (Предметы)
Прямые дочерние элементы гибкого контейнера автоматически становятся гибкими (гибкими) элементами.
Элемент выше представляет четыре синих гибких элемента внутри серого гибкого контейнера.
Пример
Попробуй сам »
Свойства гибкого элемента:
Заказ недвижимости
Свойство order
указывает порядок
гибкие предметы.
Первый гибкий элемент в коде не обязательно должен отображаться как первый элемент в макете.
Значение заказа должно быть числом, значение по умолчанию — 0.
Пример
Свойство order может изменить порядок элементов flex:
Попробуй сам »
Flex-Grow Недвижимость
Свойство flex-grow
указывает, насколько гибкий элемент будет расти относительно остальных гибких элементов.
Значение должно быть числом, значение по умолчанию — 0.
Пример
Заставить третий изгибаемый элемент расти в восемь раз быстрее, чем другие изгибаемые элементы:
Попробуй сам »
Свойство flex-shrink
Свойство flex-shrink
указывает, насколько гибкий элемент будет сжиматься по сравнению с остальными гибкими элементами.
Значение должно быть числом, значение по умолчанию — 1.
Пример
Не позволяйте третьему гибкому элементу сжиматься так же сильно, как другие гибкие элементы:
Попробуй сам »
Flex-Базис Недвижимость
Свойство flex-based
указывает начальную длину элемента flex.
Пример
Установите начальную длину третьего элемента flex на 200 пикселей:
Попробуй сам »
Flex Property
Свойство flex
является сокращенным свойством для flex-grow
, flex-shrink
и flex-based
свойства.
Пример
Сделать третий изгибаемый элемент не растяжимым (0), неусадочным (0) и имеющим начальная длина 200 пикселей:
Попробуй сам »
Собственная собственность Собственности
Свойство align-self
определяет
выравнивание для выбранного элемента внутри гибкого контейнера.
Свойство align-self
переопределяет выравнивание по умолчанию, установленное
контейнер свойство align-items
.
В этих примерах мы используем контейнер высотой 200 пикселей, чтобы лучше продемонстрировать свойство align-self
:
Пример
Выровняйте третий гибкий элемент в середине контейнера:
Попробуй сам »
Пример
Совместите второй изгибаемый элемент в верхней части контейнера, а третий изгибающий элемент — с дно контейнера:
Попробуй сам »
Адаптивная Галерея Изображения с использованием Flexbox
Используйте flexbox для создания адаптивной галереи изображений, которая варьируется между четырьмя, два или полная ширина изображения, в зависимости от размера экрана:
Попробуй сам »Отзывчивый веб-сайт с использованием Flexbox
Используйте flexbox для создания адаптивного веб-сайта, содержащего гибкую панель навигации и гибкий контент:
Попробуй сам »CSS Flexbox Свойства
В следующей таблице перечислены свойства CSS, используемые с flexbox:
Недвижимость | Описание |
---|---|
дисплей | Указывает тип поля, используемого для элемента HTML |
flex-direction | Определяет направление гибких элементов внутри гибкого контейнера |
justify-content | Горизонтальное выравнивание гибких элементов, когда элементы не используют все доступное пространство на главной оси |
выровнять позиции | Вертикальное выравнивание изгибаемых элементов, когда элементы не используют все доступное пространство на поперечной оси |
flex-wrap | Указывает, следует ли оборачивать гибкие элементы, если для них недостаточно места на одной линии гибкого трубопровода |
выровнять содержание | Изменяет поведение свойства flex-wrap.Он похож на align-items, но вместо выравнивания flex-элементов он выравнивает flex-линии |
flex-flow | Сокращенное свойство для flex-direction и flex-wrap |
заказ | Определяет порядок гибкого элемента относительно остальных гибких элементов внутри того же контейнера. |
самоустанавливающийся | Используется на гибких предметах.Переопределяет свойство align-items контейнера | .
flex | Сокращенное свойство для flex-grow, flex-shrink и flex-base свойства |
,
CSS flex свойство
Пример
Пусть все гибкие элементы имеют одинаковую длину, независимо от их содержания:
#main div {
-ms-flex: 1; / * IE 10 * /
flex: 1;
}
Определение и использование
Свойство flex
является условным обозначением для:
Свойство flex
устанавливает гибкую длину гибких элементов.
Примечание: Если элемент не является гибким элементом, свойство flex
не действует.
Значение по умолчанию: | 0 1 авто |
---|---|
Наследуется: | нет |
Анимационный: | да, см. Индивидуальные свойства . Читать о Анимация |
Версия: | CSS3 |
Синтаксис JavaScript: | объект .style.flex = «1» Попытайся |
Поддержка браузера
Числа в таблице указывают первую версию браузера, которая полностью поддерживает свойство.
Числа, сопровождаемые -webkit-, -ms- или -moz-, указывают первую версию, которая работала с префиксом.
Недвижимость | |||||
---|---|---|---|---|---|
flex | 29.0 21,0 -webkit- | 11,0 10,0 мс — | 28,0 18,0 -моз- | 9,0 6,1 -webkit- | 17,0 |
Синтаксис CSS
flex: flex-grow flex-shrink flex-based | авто | начальный | наследовать;
Значения недвижимости
Значение | Описание |
---|---|
flex-grow | Число, указывающее, насколько предмет будет расти относительно остальных гибких предметов. |
flex-shrink | Число, указывающее, насколько элемент будет сжиматься относительно остальных гибких элементов. |
flex-based | Длина изделия.Допустимые значения: «авто», «наследовать» или число, за которым следуют «%», «px», «em» или любая другая единица длины |
авто | То же, что 1 1 авто. |
начальный | То же, что 0 1 авто. Читать о начальных |
нет | То же, что 0 0 авто. |
наследуют | Унаследует это свойство от родительского элемента.Читать о наследовать |
Связанные страницы
Учебник CSS: CSS Flexible Box
CSS Ссылка: flex-based свойство
CSS Ссылка: свойство flex-direction
CSS Ссылка: свойство flex-flow
CSS Ссылка: свойство flex-grow
CSS Ссылка: свойство flex-shrink
CSS Ссылка: свойство flex-wrap
HTML DOM ссылка: flex свойство
,
CSS flex-wrap свойство
Пример
При необходимости оберните гибкие элементы:
div {
дисплей: гибкий;
flex-wrap: упаковка;
}
Определение и использование
Свойство flex-wrap
указывает, следует ли переносить гибкие элементы или нет.
Примечание: Если элементы не являются гибкими элементами, свойство flex-wrap
не действует.
Значение по умолчанию: | Nowrap |
---|---|
Наследуется: | нет |
Анимационный: | нет. Читайте о анимации |
Версия: | CSS3 |
Синтаксис JavaScript: | объект .style.flexWrap = «Nowrap» Попытайся |
Поддержка браузера
Числа в таблице указывают первую версию браузера, которая полностью поддерживает свойство.
Числа, сопровождаемые -webkit- или -moz-, указывают первую версию, которая работала с префиксом.
Недвижимость | |||||
---|---|---|---|---|---|
flex-wrap | 29.0 21,0 -webkit- | 11,0 | 28,0 18,0 -моз- | 9,0 6,1 -webkit- | 17,0 |
Синтаксис CSS
flex-wrap: nowrap | wrap | wrap-reverse | начальный | наследовать;
Значения недвижимости
Значение | Описание | Слушать это |
---|---|---|
Nowrap | Значение по умолчанию.Указывает, что гибкие элементы не обернуты | Сыграй » |
упаковка | Указывает, что гибкие элементы будут обернуты при необходимости. | Сыграй » |
обратная упаковка | Указывает, что гибкие элементы будут оборачиваться, если необходимо, в обратном порядке. | Сыграй » |
начальный | Устанавливает для этого свойства значение по умолчанию.Читать о начальных | Сыграй » |
наследуют | Унаследует это свойство от родительского элемента. Читать о наследовать |
Связанные страницы
Учебник CSS: CSS Flexible Box
CSS Ссылка: flex свойство
CSS Ссылка: свойство flex-flow
CSS Ссылка: свойство flex-direction
CSS Ссылка: flex-based свойство
CSS Ссылка: свойство flex-grow
CSS Ссылка: свойство flex-shrink
HTML DOM ссылка: свойство flexWrap
,
Flexbox Учебное пособие | HTML & CSS сложен
Гибкие позиции
Все наши примеры вращаются вокруг предметов с фиксированными или содержание определяемого-ширина. Это позволило нам сосредоточиться на аспектах позиционирования flexbox, но это также означает, что мы игнорировали его одноименный Природа «гибкой коробки». Гибкие элементы гибки : они могут сжать и растянуть, чтобы соответствовать ширине их контейнеров.
Свойство flex
определяет ширину отдельных элементов в
гибкий контейнер.Или, точнее, это позволяет им иметь гибкую ширину. Это
работает как вес, который говорит гибкому контейнеру, как распределить дополнительное пространство
к каждому предмету. Например, элемент со значением flex
2
будет расти в два раза быстрее, чем предметы со значением по умолчанию 1
.
Во-первых, нам нужен эксперимент для колонтитула. Придерживайтесь этого после .photo-grid-container
элемент:
Затем немного CSS:
.нижний колонтитул {
дисплей: гибкий;
justify-content: пробел между
}
.footer-item {
граница: 1px solid #fff;
цвет фона: # D6E9FE;
высота: 200 пикселей;
flex: 1;
}
, что flex: 1; Линия
говорит, что предметы должны растягиваться, чтобы соответствовать
ширина . нижний колонтитул
. Поскольку все они имеют одинаковый вес,
они растянутся одинаково:
Увеличение веса одного из предметов заставляет его расти быстрее, чем
другие. Например, мы можем заставить третий элемент расти в два раза быстрее, чем другой
два со следующим правилом:
.подвал три
flex: 2;
}
Сравните это со свойством justify-content
, которое распределяет
дополнительное пространство между предметами. Это похоже, но теперь мы
распределяя это пространство на сами предметы. Результатом является полный контроль
над тем, как гибкие элементы помещаются в свои контейнеры.
Ширина статического элемента
Мы можем даже комбинировать и комбинировать гибкие коробки с коробками фиксированной ширины. flex:
начальный
возвращается к явной ширине
свойство.Это позволяет нам комбинировать статические и гибкие блоки сложным образом.
Мы собираемся заставить наш нижний колонтитул вести себя так, как показано на рисунке выше.
центральный элемент гибкий, но те, что с обеих сторон, всегда имеют одинаковый размер.
Все, что нам нужно сделать, это добавить следующее правило в нашу таблицу стилей:
. Нижний колонтитул,
.footer-three {
цвет фона: # 5995DA;
flex: начальный;
ширина: 300 пикселей;
}
Без этого flex: начальный; Линия
, изгиб : 1;
декларация будет унаследована от .правило нижнего колонтитула
, вызывающее
ширина
свойства должны быть проигнорированы. исправлений
это, и мы получаем гибкий макет, который также содержит элементы фиксированной ширины. когда
вы измените размер окна браузера, вы увидите, что только средняя
изменение размера нижнего колонтитула
Это довольно распространенная схема, и не только в нижних колонтитулах. Для
Например, многие веб-сайты имеют боковую панель фиксированной ширины (или несколько боковых панелей) и
гибкий блок контента, содержащий основной текст страницы.Это в основном
более высокая версия нижнего колонтитула, который мы только что создали.
,