Css флекс: наглядное введение в систему компоновки элементов на веб-странице

Основные понятия Flexbox - Веб-технологии для разработчиков

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, то есть в начальное значение, то элементы ужмутся так, чтобы все элементы поместились на одной строке, потому что у них установлено значение, позволяющее им ужиматься при необходимости. Если им запретить ужиматься, или если они не смогут ужаться достаточно сильно, то при установленном значении

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 свойства.

Свойство 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 flex-shrink 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-wrapflex-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-системы.

Используем CSS Flexible Boxes - Веб-технологии для разработчиков
Эта статья устарела и удалена из английской версии. Вместо неё идёт перенаправление на статью:

У меня не поднялась рука удалить эту статью окончательно, но я рекомендую Вам вместо неё, всё-таки, прочитать ту.

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]
1.1

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
КомпьютерыМобильные
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome для AndroidFirefox для AndroidOpera для AndroidSafari on iOSSamsung Internet
flex-wrapChrome Полная поддержка 29
Полная поддержка 29
Полная поддержка 21
С префиксом Требует вендорный префикс: -webkit-
Edge Полная поддержка 12Firefox Полная поддержка 28IE Частичная поддержка 11
Частичная поддержка 11
Замечания Partial support due to large number of bugs present. See Flexbugs.
Opera Полная поддержка 17Safari Полная поддержка 9
Полная поддержка 9
Полная поддержка 6.1
С префиксом Требует вендорный префикс: -webkit-
WebView Android Полная поддержка 4.4
Полная поддержка 4.4
Полная поддержка ≤37
С префиксом Требует вендорный префикс: -webkit-
Chrome Android Полная поддержка 29
Полная поддержка 29
Полная поддержка 25
С префиксом Требует вендорный префикс: -webkit-
Firefox Android Полная поддержка 52Opera Android Полная поддержка 18Safari iOS Полная поддержка 9
Полная поддержка 9
Полная поддержка 6.1
С префиксом Требует вендорный префикс: -webkit-
Samsung Internet Android Полная поддержка 2.0
Полная поддержка 2.0
Полная поддержка 1.5
С префиксом Требует вендорный префикс: -webkit-

Легенда

Полная поддержка  
Полная поддержка
Частичная поддержка  
Частичная поддержка
Смотрите замечания реализации.
Смотрите замечания реализации.
Требует вендорный префикс или другое имя для использования.
Требует вендорный префикс или другое имя для использования.

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 - Веб-технологии для разработчиков

flex-basisChrome Полная поддержка 29
Полная поддержка 29
Полная поддержка 22
С префиксом Требует вендорный префикс: -webkit-
Edge Полная поддержка 12
Полная поддержка 12
Полная поддержка 12
С префиксом Требует вендорный префикс: -webkit-
Firefox Полная поддержка 22
Полная поддержка 22
Замечания Since Firefox 28, multi-line flexbox is supported.
Полная поддержка 49
С префиксом Требует вендорный префикс: -webkit-
Полная поддержка 44С префиксом Отключено
С префиксом Требует вендорный префикс: -webkit-
Отключено From version 44: this feature is behind the layout.css.prefixes.webkit preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Нет поддержки 18 — 28
Отключено From version 18 until version 28 (exclusive): this feature is behind the layout.css.flexbox.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
IE Полная поддержка 11
Полная поддержка 11
Замечания When a non-auto flex-basis is specified, Internet Explorer 10 and 11 always uses a content-box box model to calculate the size of a flex item, even if box-sizing: border-box is applied to the element. See Flexbug #7 for more info.
Opera Полная поддержка 12.1
Полная поддержка 12.1
Полная поддержка 15
С префиксом Требует вендорный префикс: -webkit-
Safari Полная поддержка 9
Полная поддержка 9
Полная поддержка 7
С префиксом Требует вендорный префикс: -webkit-
WebView Android Полная поддержка 4.4
Полная поддержка 4.4
Полная поддержка ≤37
С префиксом Требует вендорный префикс: -webkit-
Chrome Android Полная поддержка 29
Полная поддержка 29
Полная поддержка 25
С префиксом Требует вендорный префикс: -webkit-
Firefox Android Полная поддержка 22
Полная поддержка 22
Замечания Since Firefox 28, multi-line flexbox is supported.
Полная поддержка 49
С префиксом Требует вендорный префикс: -webkit-
Полная поддержка 44С префиксом Отключено
С префиксом Требует вендорный префикс: -webkit-
Отключено From version 44: this feature is behind the layout.css.prefixes.webkit preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Нет поддержки 18 — 28
Отключено From version 18 until version 28 (exclusive): this feature is behind the layout.css.flexbox.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Opera Android Полная поддержка 12.1
Полная поддержка 12.1
Полная поддержка 14
С префиксом Требует вендорный префикс: -webkit-
Safari iOS Полная поддержка 9
Полная поддержка 9
Полная поддержка 7
С префиксом Требует вендорный префикс: -webkit-
Samsung Internet Android Полная поддержка 2.0
Полная поддержка 2.0
Полная поддержка 1.5
С префиксом Требует вендорный префикс: -webkit-
autoChrome Полная поддержка 22Edge Полная поддержка 12Firefox Полная поддержка 18IE Полная поддержка 11Opera Полная поддержка 12.1Safari Полная поддержка 7
Полная поддержка 7
С префиксом Требует вендорный префикс: -webkit-
WebView Android Полная поддержка ≤37Chrome Android Полная поддержка 25Firefox Android Полная поддержка 18Opera Android Полная поддержка 12.1Safari iOS Полная поддержка 7
Полная поддержка 7
С префиксом Требует вендорный префикс: -webkit-
Samsung Internet Android Полная поддержка 1.5
contentChrome Нет поддержки НетEdge Нет поддержки 12 — 79Firefox Полная поддержка 61IE Нет поддержки НетOpera Нет поддержки НетSafari Нет поддержки НетWebView Android Нет поддержки НетChrome Android Нет поддержки НетFirefox Android Полная поддержка 61Opera Android Нет поддержки НетSafari iOS Нет поддержки НетSamsung Internet Android Нет поддержки Нет
max-contentChrome Нет поддержки НетEdge Нет поддержки НетFirefox Полная поддержка 66
Полная поддержка 66
Полная поддержка 22
С префиксом Требует вендорный префикс: -moz-
IE Нет поддержки НетOpera Нет поддержки НетSafari Нет поддержки НетWebView Android Нет поддержки НетChrome Android Нет поддержки НетFirefox Android Полная поддержка 66
Полная поддержка 66
Полная поддержка 22
С префиксом Требует вендорный префикс: -moz-
Opera Android Нет поддержки НетSafari iOS Нет поддержки НетSamsung Internet Android Нет поддержки Нет
min-contentChrome Нет поддержки НетEdge Нет поддержки НетFirefox Полная поддержка 66
Полная поддержка 66
Полная поддержка 22
С префиксом Требует вендорный префикс: -moz-
IE Нет поддержки НетOpera Нет поддержки НетSafari Нет поддержки НетWebView Android Нет поддержки НетChrome Android Нет поддержки НетFirefox Android Полная поддержка 66
Полная поддержка 66
Полная поддержка 22
С префиксом Требует вендорный префикс: -moz-
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.

Элемент выше представляет гибкий контейнер (синяя область) с тремя гибкими элементами.

Пример

Гибкий контейнер с тремя гибкими предметами:


1
2
3

Попробуй сам "


Родительский элемент (контейнер)

Гибкий контейнер становится гибким, если установить для свойства 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: центр;
предметов выравнивания: центр;
}

Попробуй сам "


Дочерние элементы (Предметы)

Прямые дочерние элементы гибкого контейнера автоматически становятся гибкими (гибкими) элементами.

Элемент выше представляет четыре синих гибких элемента внутри серого гибкого контейнера.

Пример


1
2
3
4

Попробуй сам "

Свойства гибкого элемента:


Заказ недвижимости

Свойство order указывает порядок гибкие предметы.

Первый гибкий элемент в коде не обязательно должен отображаться как первый элемент в макете.

Значение заказа должно быть числом, значение по умолчанию - 0.

Пример

Свойство order может изменить порядок элементов flex:


1
2
3
4

Попробуй сам "


Flex-Grow Недвижимость

Свойство flex-grow указывает, насколько гибкий элемент будет расти относительно остальных гибких элементов.

Значение должно быть числом, значение по умолчанию - 0.

Пример

Заставить третий изгибаемый элемент расти в восемь раз быстрее, чем другие изгибаемые элементы:


1
2
3

Попробуй сам "


Свойство flex-shrink

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

Значение должно быть числом, значение по умолчанию - 1.

Пример

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


1
2
3
4
5
6
7
8
9
10

Попробуй сам "


Flex-Базис Недвижимость

Свойство flex-based указывает начальную длину элемента flex.

Пример

Установите начальную длину третьего элемента flex на 200 пикселей:


1
2
3
4

Попробуй сам "


Flex Property

Свойство flex является сокращенным свойством для flex-grow , flex-shrink и flex-based свойства.

Пример

Сделать третий изгибаемый элемент не растяжимым (0), неусадочным (0) и имеющим начальная длина 200 пикселей:


1
2
3
4

Попробуй сам "


Собственная собственность Собственности

Свойство align-self определяет выравнивание для выбранного элемента внутри гибкого контейнера.

Свойство align-self переопределяет выравнивание по умолчанию, установленное контейнер свойство align-items .

В этих примерах мы используем контейнер высотой 200 пикселей, чтобы лучше продемонстрировать свойство align-self :

Пример

Выровняйте третий гибкий элемент в середине контейнера:


1
2
3
4

Попробуй сам "

Пример

Совместите второй изгибаемый элемент в верхней части контейнера, а третий изгибающий элемент - с дно контейнера:


1
2
3
4

Попробуй сам "


Адаптивная Галерея Изображения с использованием 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 .

Diagram: no flex (3 square boxes), equal flex (3 rectangle boxes), unequal flex (2 smaller boxes, one stretched out box)

Во-первых, нам нужен эксперимент для колонтитула. Придерживайтесь этого после .photo-grid-container элемент:

  

Затем немного CSS:

 .нижний колонтитул {
  дисплей: гибкий;
  justify-content: пробел между
}

.footer-item {
  граница: 1px solid #fff;
  цвет фона: # D6E9FE;
  высота: 200 пикселей;
  flex: 1;
}
  

, что flex: 1; Линия говорит, что предметы должны растягиваться, чтобы соответствовать ширина . нижний колонтитул . Поскольку все они имеют одинаковый вес, они растянутся одинаково:

Web page with three equal boxes that stretch to fill the footer

Увеличение веса одного из предметов заставляет его расти быстрее, чем другие. Например, мы можем заставить третий элемент расти в два раза быстрее, чем другой два со следующим правилом:

 .подвал три
  flex: 2;
}
  

Сравните это со свойством justify-content , которое распределяет дополнительное пространство между предметами. Это похоже, но теперь мы распределяя это пространство на сами предметы. Результатом является полный контроль над тем, как гибкие элементы помещаются в свои контейнеры.

Ширина статического элемента

Мы можем даже комбинировать и комбинировать гибкие коробки с коробками фиксированной ширины. flex: начальный возвращается к явной ширине свойство.Это позволяет нам комбинировать статические и гибкие блоки сложным образом.

Diagram: fixed-width box (flex: initial), flexible box (flex: 1)

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

 . Нижний колонтитул,
.footer-three {
  цвет фона: # 5995DA;
  flex: начальный;
  ширина: 300 пикселей;
}
  

Без этого flex: начальный; Линия , изгиб : 1; декларация будет унаследована от .правило нижнего колонтитула , вызывающее ширина свойства должны быть проигнорированы. исправлений это, и мы получаем гибкий макет, который также содержит элементы фиксированной ширины. когда вы измените размер окна браузера, вы увидите, что только средняя изменение размера нижнего колонтитула

Web page with two static-width boxes on either side of a flexible box stretching to fill the footer

Это довольно распространенная схема, и не только в нижних колонтитулах. Для Например, многие веб-сайты имеют боковую панель фиксированной ширины (или несколько боковых панелей) и гибкий блок контента, содержащий основной текст страницы.Это в основном более высокая версия нижнего колонтитула, который мы только что создали.

,

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *