Вертикальное выравнивание flexbox: Разбираемся с обёртыванием Flex элементов — Веб-технологии для разработчиков
Разбираемся с обёртыванием Flex элементов — Веб-технологии для разработчиков
Flexbox был разработан как однонаправленный макет, то есть он подразумевает укладывание элементов либо в строчку, либо в столбец, но не одновременно и то и другое. Тем не менее, есть возможность завернуть элементы в несколько строк, создавая новые строки. Это делается с помощью установки свойства flex-direction
(flex-направление) в значение row
(строки) или создавая новые столбцы, устанавливая свойство flex-direction
в значение column
(столбец). В этой статье я объясню, как это работает, зачем это придумали и в каких случаях лучше использовать технологию CSS Grid Layout вместо флекс-боксов.
Делаем вещи завёрнутыми
Значение по умолчанию свойства flex-wrap
равняется nowrap
. Это обозначает, что если у вас есть набор флекс-элементов, которые слишком широки для их контейнера, то они будут его переполнять. Если вы хотите, чтобы они переносились на следующую строку (или столбец, если у вас вертикально расположена основная ось) при переполнении, вы должны добавить свойство flex-wrap
и установить ему значение wrap
, или использовать сокращённую запись свойства flex-flow
со значениями row wrap
или column wrap
соответственно для строк и столбцов.
Тогда элементы будут переноситься внутри контейнера. В следующем примере у нас есть 10 элементов с flex-basis
равным 160px
и способностью расти и сжиматься. Как только в первой строке мы попадаем в то место, когда нет возможности поместить ещё один элемент с размером 160 px, создаётся новая строка для этого элемента и так будет повторяться, пока не поместятся все элементы.Так как элементы могут расти, то их размер станет больше, чем 160px в том случае, когда все строки полностью заполнятся. Если на последней строке останется только один элемент, то он расширится до ширины всей строки.
То же самое будет происходить с колонками. Содержащему контейнеру надо задать высоту, чтобы элементы начали переноситься в следующую колонку. И высота элементов тоже будет увеличиваться, чтобы заполнить колонку по высоте полностью.
Перенос и направление (flex-direction)
Перенос работает, что логично ожидать, и в паре со свойством flex-direction
. Если flex-direction
установлен в row-reverse
, тогда элементы начнут укладываться с конечного края контейнера и будут идти в обратном порядке.
Обратите внимание, что обратный порядок относится только к строке (в случае построчного заполнения). Элементы начнут заполнять справа налево, затем перейдут на вторую строку и опять начнут справа. Не будет реверса сразу по обеим осям — строки не будут заполняться вверх!
Объяснение одномерного макета
Как мы уже видели в предыдущих примерах, если нашим элементам разрешено расти и сжиматься, то появляются несколько элементов в последней строке или столбце, которые расширяются, чтобы заполнить всё оставшееся пространство.
В технологии флексбоксов нет методов, которые позволили бы сказать элементам в одной строке выстроиться так же, как в строке выше — каждая флекс-строка ведёт себя как новый флекс-контейнер. Это так же касается распределения пространства по главной оси. Если есть только один элемент и ему разрешено расти, то он будет расти и заполнять главную ось направления, так же, как будто бы он был единственным элементов в контейнере.
Если вы хотите макет в двух измерениях, то вы, вероятно, хотите макет сетки — Grid Layout. Мы можем сравнить наш пример переноса строк выше с версией, сделанной на технологии CSS Grid, чтобы увидеть разницу. Следующий живой пример использует технологию CSS Grid Layout для создания макета с несколькими колонками, каждая из которых имеет установленный минимумальный размер в 160 px и соответственно распределяя дополнительное пространство между всеми стоблцами. Однако в этом случае элементы остаются в своей сетке и не растягиваются, если их в последнем ряду меньше.
В этом разница между одно- и двух -мерной компоновкой. В одномерном методе, таком как флексбокс, мы контролируем только одно измерение — либо строки, либо столбцы. В двумерном макете, таком как grid, мы контролируем сразу оба измерения. Если вы хотите распределение пространства построчно, используйте flexbox. Если не хотите — используйте Grid.
Как работают грид-системы на основе flexbox?
Как правило, grid системы на основе flexbox работают, возвращая flexbox к привычному миру разметок на основе float. Если вы назначите процентную ширину для элементов Flex — либо задав значение параметру flex-basis
, либо добавив ширину к самому элементу, при этом оставив значение flex-basis
как auto
— вы можете создать впечатление двухмерного макета. Вы можете посмотреть, как это работает на примере ниже.
Здесь я установил flex-grow
и flex-shrink
на 0
, чтобы запретить flex элементам расти и сжиматься, а затем контролирую их размер с помощью процентов, как мы это делали в макетах с float.
Если вам нужно, чтобы flex элементы выровнялись по поперечной оси, такой способ управления шириной позволит этого добиться. Тем не менее, в большинстве случаев, добавление параметра ширины непосредственно в сам flex элемент говорит о том, что возможно будет лучше, если вы переключитесь на технологию grid layout для этого компонента макета.
Создание промежутков между элементами
При размещении flex элементов периодически возникает необходимость их разнести между собой. На данный момент у нас нет никакого решения задачи создания промежутков между элементами flexbox в пределах спецификации Box Alignment module. В будущем мы сможем просто использовать row-gap
и column-gap
для флексбоксов так же, как мы это делаем для CSS Grid макетов. Но пока всё что мы можем сделать — это использовать margin для достижения этой цели.
Как вы можете видеть на живом примере ниже, попытки создать промежутки между элементами, при этом не создавая промежутки с границами содержащего контейнера, приводят к тому, что нам приходится использовать отрицательные маржины для самого контейнера. Любая граница в flex контейнере затем перемещается во вторую оболочку, чтобы отрицательное поле могло вытянуть элементы до этого элемента оболочки.
Вот поэтому, когда всё-таки реализуют свойство gap, это решит проблему с промежутками. Потому что это свойство будет действовать только на промежутки между элементами, не затрагивая промежутки между элементом и содержащим контейнером.
Сворачивание элементов
В спецификации флексбоксов подробно рассказано, что должно происходить, когда элементы должны сворачиваться при установке параметра visibility: collapse
на элементе. Смотрим документацию MDN для параметра visibility
. Спецификация описывает поведение так:
“Установка visibility:collapse на flex элементе должна сворачивать этот flex элемент. Этот эффект должен быть таким же, как при установке свойства visibility:collapse на элементе table-row или table-column: свёрнутый flex элемент полностью удаляется из процесса рендеринга, но оставляет за собой некую «распорку», которая сохраняет стабильным поперечный размер flex-строки. Таким образом, если флекс-контейнер имеет только одну строку, динамическое сворачивание или разворачивание элементов может изменять основной размер флекс-контейнера, но должно быть гарантированно, что не будет изменяться поперечный размер и не будет приводить к эффекту «виляния» всего макета страницы. Однако процесс обертывания flex-строки выполняется после процедуры сворачивания, поэтому поперечный размер flex-контейнера с несколькими строками может и изменяться.” — Сворачивание элементов
Понимание этого поведения полезно, если вы планируете использовать яваскрипт на флекс-элементах и с его помощью прятать или показывать контент. Пример в спецификации демонстрирует один такой шаблон.
В следующем живом примере у нас показан флекс-контейнер со параметров «перенос» в состоянии «не переносить». Третий элемент имеет контента больше, чем другие элементы. И у него установлен параметр visibility: collapse
. Следовательно он имеет некую «распорку», которая удерживает ту высоту, которая позволит показать этот элемент. Если Вы удалите visibility: collapse
из CSS или измените значение на visible
, то вы увидите, что элемент исчезнет, а пространство перераспределится между не свернутыми элементами; высота флекс-контейнера при этом не изменится.
Примечание. Используйте Firefox для двух приведенных ниже примеров, поскольку Chrome и Safari рассматривают свёрнутый элемент как скрытый.
Когда Вы работаете с многострочным флекс-контейнером, Вы должны помнить, что процесс обёртывания происходит после сворачивания. Таким образом, браузер должен повторно выполнить процедуру оборачивания, чтобы учесть новое пространство, оставленное свернутым элементом в главной оси.
Это значит, что элементы могут оказаться на строке, отличной от той, на которой они начинались. В случае, если какой-то элемент отображается и скрывается, это может привести к тому, что элементы окажутся в другом ряду.
Я создал пример такого поведения в следующем живом примере. Вы можете увидеть, как растяжение меняет строку в зависимости от расположения свернутого элемента. Если вы добавите больше контента ко второму элементу, он изменит строку, как только станет достаточно длинным. Эта верхняя строка становится такой же высокой, как одна строка текста.
Если это вызывает проблемы для вашего макета, возможно Вам стоит задуматься над переделкой структуры, например, поместить каждую строку в отдельный флекс-контейнер, чтобы они не могли смещать строки.
Когда Вы устанавливаете элементу display: none
чтобы его спрятать, то этот элемент удаляется из структуры страницы. На практике это означает, что счетчики игнорируют его, а такие вещи, как transitions (переходы), не запускаются. Использование visibility: hidden
сохраняет элемент в структуре форматирования, что полезно, поскольку он по-прежнему ведет себя так, как если бы он был частью макета, даже если пользователь не может его увидеть.
Всё, что нужно знать о выравнивании во Flexbox / Хабр
Об авторе
: Рэйчел Эндрю — не только главный редактор журнала Smashing Magazine, но и веб-разработчик, писатель и спикер. Она автор ряда книг, в том числе
The New CSS Layout
, один из разработчиков системы управления контентом
Perch
. Пишет о бизнесе и технологиях на своём сайте
rachelandrew.co.uk
.
Краткое содержание: в этой статье мы рассмотрим свойства выравнивания во Flexbox и некоторые основные правила, как работает выравнивание по основной и поперечной осям.
В первой статье этого цикла я рассказала, что происходит при объявлении свойства display: flex
для элемента. Сейчас рассмотрим свойства выравнивания и как они работают с Flexbox. Если вы когда-либо приходили в замешательство, применить align
или justify
, надеюсь, эта статья многое прояснит!
История выравнивания во Flexbox
За всю историю CSS правильное выравнивание по обеим осям казалось самой сложной проблемой. Появление этой функции во Flexbox для многих стало главным преимуществом этой технологии. Выравнивание свелось к
двум строчкам CSS
.
Свойства выравнивания теперь полностью определены в
спецификации Box Alignment
. Она детализирует, как работает выравнивание в различных макетах. Это означает, что в CSS Grid можно использовать те же свойства, что и в Flexbox — а в будущем в других макетах тоже. Поэтому любая новая функция выравнивания Flexbox будет подробно описана в спецификации Box Alignment, а не в следующей версии Flexbox.
Свойства
Многим трудно запомнить, следует ли использовать свойства, которые начинаются с
align-
или с
justify-
. Важно помнить следующее:
justify-
выполняет выравнивание по главной оси в том же направлении, что иflex-direction
;align-
выполняет выравнивание по оси поперёк направлениюflex-direction
.
Здесь действительно помогает мышление с точки зрения главной и поперечной осей, а не горизонтальной и вертикальной. Не имеет значения, как физически направлена ось.
Выравнивание главной оси с помощью justify-content
Начнём с выравнивания по главной оси. Оно осуществляется с помощью свойства
justify-content
. Данное свойство обрабатывает все элементы как группу и управляет распределением пространства между ними.
Изначальное значение justify-content
равняется flex-start
. Вот почему при объявлении display: flex
все элементы flex выстраиваются в начале строки. В письменности слева направо элементы группируются слева.
Обратите внимание, что свойство justify-content
производит видимый эффект только при наличии свободного места. Поэтому если у вас набор элементов занимает всё пространство на главной оси, justify-content
ничего не даст.
Если указать для justify-content
значение flex-end
, то все элементы переместятся в конец строки. Свободное место теперь находится в начале.
С этим пространством можно делать и другие вещи. Например, распределить его между нашими элементами, используя justify-content: space-between
. В этом случае первый и последний элемент разместятся на концах контейнера, а всё пространство поровну поделится между элементами.
Мы можем распределить пространство с помощью justify-content: space-around
. В этом случае доступное пространство делится на равные части и помещается с каждой стороны элемента.
Новое значение justify-content
можно найти в спецификации Box Alignment; оно не указано в спецификации Flexbox. Это значение space-evenly
. В этом случае элементы равномерно распределяются в контейнере, а дополнительное пространство поровну распределяется между элементами и с обеих сторон.
Вы можете поиграться со всеми значениями в демо.
Значения точно так же работают по вертикали, то есть если flex-direction
применяется для column
. Правда, у вас в столбце может не оказаться свободного места для распределения, если не добавить высоту или block-size контейнера, как в этом демо.
Выравнивание по осям с помощью align-content
Если в контейнере несколько осей и указано
flex-wrap: wrap
, то можно использовать
align-content
для выравнивания строк на поперечной оси. Но требуется дополнительное пространство. В
этой демонстрации
поперечная ось работает в направлении колонки, и я указала высоту контейнера
60vh
. Поскольку это больше, чем необходимо для отображения всех элементов, то появляется свободное пространство по вертикали.
Затем я могу применить align-content
с любым из значений.
Если в качестве flex-direction
указано column
, то align-content
работает как в следующем примере.
Как и в случае с justify-content
, мы работаем с группой строк и распределяем свободное пространство.
Свойство по place-content
В спецификации Box Alignment можно найти свойство
place-content
. Использование этого свойства означает, что вы одновременно устанавливаете
justify-content
и
align-content
. Первое значение — для
align-content
, второе для
justify-content
. Если задано только одно значение, то оно применяется к обоим свойствам:
.container {
place-content: space-between stretch;
}
Соответствует этому:
.container {
align-content: space-between;
justify-content: stretch;
}
А такой код:
.container {
place-content: space-between;
}
Равноценен следующему:
.container {
align-content: space-between;
justify-content: space-between;
}
Выравнивание по осям с помощью align-items
Теперь мы знаем, что можно выровнять набор элементов или строки как группу. Тем не менее, есть ещё один способ выровнять элементы по отношению друг к другу на поперечной оси. У контейнера есть высота, которая определяется высотой самого высокого элемента.
Как вариант, её можно определить свойством height
в контейнере:
Почему элементы растягиваются до размера самого высокого элемента — это потому что начальным значением параметра align-items
является stretch
. Элементы растягиваются по поперечной оси до размера контейнера в этом направлении.
Обратите внимание, что в многострочном контейнере каждая строка действует как новый контейнер. Самый высокий элемент в этой строке будет определять размер всех элементов в этой строке.
Кроме начального значения stretch
, можно присвоить элементам align-items
значение flex-start
, в этом случае они выравниваются по началу контейнера и больше не растягиваются по высоте.
Значение flex-end
перемещает их в конец контейнера по поперечной оси.
Если вы используете значение center
, то элементы центрируются относительно друг друга:
Мы также можем выровнять их по базовой линии. Это гарантирует выравнивание текста по одному основанию, в отличие от выравнивания полей вокруг текста.
Все эти варианты можно попробовать в демо.
Индивидуальное выравнивание с помощью align-self
Свойство
align-items
задаёт выравнивание всех элементов одновременно. В действительности оно устанавливает значения
align-self
для всех элементов группы. Можно также использовать свойство
align-self
для любого отдельного элемента, чтобы выровнять его внутри строки и относительно других элементов.
В следующем примере в контейнере используется align-items
для выравнивания всей группы по центру, но также align-self
для первого и последнего элементов.
Почему нет justify-self
?
Часто возникает вопрос, почему невозможно выровнять один элемент или группу элементов по главной оси. Почему во Flexbox нет свойства
-self
для выравнивания по главной оси? Если вы представите
justify-content
и
align-content
как способ распределения пространства, то ответ становится более очевидным. Мы имеем дело с элементами как с группой и размещаем свободное пространство определённым образом: либо в начале, либо в конце группы, либо между элементами.
Также может быть полезно подумать, как justify-content
и align-content
работают в CSS Grid Layout. В Grid эти свойства используются для распределения свободного пространства в grid-контейнере между grid-дорожками. Здесь тоже мы берём группу дорожек — и с помощью этих свойств распределяем между ними свободное пространство. Поскольку мы оперируем в группе и в Grid, и во Flexbox, то не можем взять отдельный элемент и сделать с ним что-то другое. Тем не менее, есть способ получить оформление макета, которое хотят верстальщики, когда говорят о свойстве self
на главной оси. Это использование автоматических полей.
Использование автоматических полей на основной оси
Если вы когда-нибудь центрировали блок в CSS (например, враппер для контента главной страницы, установив поля слева и справа в
auto
), то у вас уже есть некоторый опыт работы с автоматическими полями. Значение
auto
для полей заполняет максимальное пространство в установленном направлении. Для центрирования блока мы устанавливаем и левое, и правое поля в
auto
: каждое из них пытается занять как можно больше места, и поэтому помещает наш блок в центр.
Автоматические поля очень хорошо работают во Flexbox для выравнивания отдельных элементов или групп элементов на главной оси. В следующем примере показан типичный случай. Есть панель навигации, элементы отображаются в виде строки и используют начальное значение justify-content: start
. Я хочу, чтобы последний пункт отображался отдельно от других в конце строки — при условии, что в строке достаточно места для этого.
Берём этот элемент и указываем для свойства margin-left
значение auto
. Это значит, что поле пытается получить как можно больше места слева от элемента, то есть элемент выталкивается к правой границе.
Если вы используете автоматические поля на главной оси, то justify-content
перестанет действовать, так как автоматические поля займут всё пространство, которое в противном случае распределялось бы с помощью justify-content
.
Запасное выравнивание
Для каждого метода выравнивания описан запасной вариант — что произойдёт, если заданное выравнивание невозможно. Например, если у вас есть только один элемент в контейнере, а вы указали
justify-content: space-between
, что должно произойти? В этом случае применяется запасное выравнивание
flex-start
— один элемент будет выровнен по началу контейнера. В случае
justify-content: space-around
Вертикальное центрирование блока с помощью flex
При верстки часто часто возникает надобность вертикально выравнять какой-либо блок, не зная его фиксированного размера. Для этих целей отличным решением будет использование свойств flex.
HTML разметка
<div>
<div>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae repellendus earum ipsam dolor repellat eligendi, distinctio, et nemo obcaecati deleniti aperiam porro! Aspernatur dolore numquam quod nesciunt dicta fugiat, minus nihil assumenda? Quo laborum amet fuga, maxime est consequuntur commodi ex, aperiam dolorem aspernatur earum veritatis dolores minus dignissimos ullam.
</div>
</div>
| <div> <div> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae repellendus earum ipsam dolor repellat eligendi, distinctio, et nemo obcaecati deleniti aperiam porro! Aspernatur dolore numquam quod nesciunt dicta fugiat, minus nihil assumenda? Quo laborum amet fuga, maxime est consequuntur commodi ex, aperiam dolorem aspernatur earum veritatis dolores minus dignissimos ullam. </div> </div> |
CSS
align-items: center — выравнивает дочерние элементы контейнера с одинаковым отступом или без.
.main-block {
background-color: #549150;
width: 100%;
height: 100%;
display: flex;
align-items: center;
}
.block {
background-color: #506791;
color: #fff;
max-width: 500px;
padding: 50px 100px;
font-size: 18px;
}
| . main-block { background-color: #549150; width: 100%; height: 100%; display: flex; align-items: center; } .block { background-color: #506791; color: #fff; max-width: 500px; padding: 50px 100px; font-size: 18px; } |
Результат:
Не всё о Flexbox
Свойство display
Устанавливает отображение flexbox для дочерних элементов.
.container{
display:flex;
}
flex-direction
Определяет направление, в котором расположатся дочерние элементы (в вертикальном или горизонтальном). Префикс -reverse меняет порядок расположения элементов на обратный.
- row (по умолчанию) слева направо
- row-reverse справа налево
- column сверху вниз
- column-reverse снизу вверх
. container{
flex-direction:row| row-reverse| column| row| column-reverse;
}
justify-content
Устанавливает выравнивание дочерних элементов по горизонтали (если flex-direction: row) или вертикали (если flex-direction: column).
- flex-start (по умолчанию) выравнивание по левому краю
- flex-end по правому краю
- center по середине
- space-between расширяет пространство между элементами так, чтобы первый элемент касался левого края, а последний – правого
- space-around расстояние между элементами одинаково, а расстояние между крайними элементами и границами родителя равно половине расстояния между элементами
- space-evenly расстояния между элементами и границами родителя равны
. container{
justify-content:flex-start| flex-end| center| space-between| space-around| space-evenly;
}
align-items
Устанавливает выравнивание дочерних элементов по вертикали (если flex-direction: row) или по горизонтали (если flex-direction: column).
- stretch (по умолчанию) растянуть элементы так, чтобы заполнить родительский блок
- flex-start выравнивание по верхнему краю
- flex-end по нижнему краю
- center по центру
- baseline по первой строке текста
.container{
align-items:stretch| flex-start| flex-end| center| baseline;
}
flex-wrap
Разрешает перенос элементов на новую строку. По умолчанию перенос запрещён.
- nowrap (по умолчанию) все элементы выстроены одной строкой
- wrap элементы могут переноситься на следующую строку
- wrap-reverse строки расположены в обратном порядке
.container{
flex-wrap:nowrap| wrap| wrap-reverse;
}
flex-flow
Сокращённая запись двух свойств flex-direction и flex-wrap.
По умолчанию row nowrap
.container{
flex-flow:|| ;
}
align-content
Если дочерние элементы flexbox не помещаются в ширину блока и разрешён перенос элементов на новую строку (flex-wrap: wrap), то при помощи align-content можно настроить выравнивание этих строк.
Выравнивание может выполняться относительно горизонтали или вертикали в зависимости от значения свойства flex-direction.
- stretch (по умолчанию) растягивает высоту строк настолько, чтобы заполнить блок
- flex-start выравнивание относительно начала блока
- flex-end относительно конца
- center относительно центра
- space-between первая строка в начале блока, последняя в конце. Расстояние между всеми строками равно
- space-around аналогично space-between, но расстояние между первой строкой и началом блока и последней строкой и концом блока равно половине расстояния между строками
.container{
align-items:stretch| flex-start| flex-end| center| space-between| space-around;
}
Выравнивание боксов в Flexbox — веб-технологии для разработчиков
Спецификация выравнивания бокса подробно описывает, как выравнивание работает при различных методах компоновки; на этой странице мы исследуем, как выравнивание блока работает в контексте Flexbox. Поскольку эта страница нацелена на подробное описание особенностей Flexbox и выравнивания блоков, ее следует читать вместе с основной страницей Box Alignment, на которой подробно описаны общие особенности выравнивания блоков для разных методов компоновки.
Базовый пример
В этом примере три гибких элемента выровнены по главной оси с помощью justify-content
и по поперечной оси с помощью align-items
.Первый элемент переопределяет align-items
значений, установленных для группы, путем установки align-self
на center
.
Оси и направление изгиба
Flexbox соблюдает режим записи документа, поэтому, если вы работаете на английском языке и установите justify-content
на flex-end
, это приведет к выравниванию элементов по концу гибкого контейнера. Если вы работаете с flex-direction
, установленным на row
, это выравнивание будет во внутреннем направлении.
Однако во Flexbox вы можете изменить основную ось, установив flex-direction
на столбец
. В этом случае justify-content
будет выравнивать элементы в направлении блока. Поэтому проще всего думать о главной и поперечной оси при работе во Flexbox так:
- Главная ось = направление, заданное параметром
flex-direction
= выравнивание черезjustify-content
- Поперечная ось = проходит по главной оси = выравнивание с помощью
align-content
,align-self
/align-items
Выравнивание главной оси
Поперечное выравнивание оси
В Flexbox
нет justify-self
На главной оси Flexbox работает с нашим контентом как с группой.Объем пространства, необходимого для размещения элементов, рассчитывается, а оставшееся пространство становится доступным для распределения. Свойство justify-content
определяет, как используется оставшееся пространство. Установите justify-content: flex-end
, и дополнительное пространство помещается перед элементами, justify-content: space-around
, и оно размещается по обе стороны от элемента в этом измерении и т. Д.
Это означает, что свойство justify-self
не имеет смысла во Flexbox, поскольку мы всегда имеем дело с перемещением всей группы элементов.
На поперечной оси align-self
имеет смысл, поскольку у нас потенциально есть дополнительное пространство в гибком контейнере в этом измерении, в котором один элемент может быть перемещен в начало и конец.
Выравнивание и автоматические поля
Существует особый вариант использования Flexbox, когда мы можем подумать, что свойство justify-self
— это то, что нам нужно, и это когда мы хотим разделить набор гибких элементов, возможно, для создания разделенного шаблона навигации. В этом случае мы можем использовать маржу auto
.Поле, установленное на auto
поглотит все доступное пространство в своем измерении. Вот как работает центрирование блока с автоматическими полями. Установив для левого и правого поля значение , авто
, обе стороны нашего блока пытаются занять все доступное пространство и, таким образом, толкают поле в центр.
Установив поле
из auto
для одного элемента в наборе гибких элементов, все выровнены по началу, мы можем создать разделенную навигацию. Это хорошо работает с Flexbox и свойствами выравнивания.Как только для автоматического поля не остается места, элемент ведет себя так же, как и все другие гибкие элементы, и сжимается, пытаясь уместиться в пространстве.
Разрыв
объектов недвижимости
Создание промежутков фиксированного размера между элементами
На главной оси свойство column-gap
будет создавать промежутки фиксированного размера между соседними элементами.
На поперечной оси свойство row-gap
создаст интервал между соседними гибкими линиями, поэтому flex-wrap
также должен быть установлен на wrap
, чтобы это имело какой-либо эффект.
Номер ссылки
Свойства CSS
Глоссарий
Направляющие
Внешние ресурсы
CSS Flexbox Контейнер
Родительский элемент (контейнер)
Как мы указали в предыдущей главе, это контейнер flex
(синяя область) с тремя элементами гибкости :
Гибкий контейнер становится гибким, если для свойства display
установлено значение flex :
Свойства гибкого контейнера:
Свойство flex-direction
Свойство flex-direction
определяет, в каком направлении контейнер
хочет сложить гибкие элементы.
Пример
Столбец Значение складывает элементы гибкости вертикально (сверху вниз):
.flex-контейнер {
дисплей: гибкий;
flex-direction: столбец;
}
Попробуй сам »
Пример
Значение column-reverse складывает гибкие элементы вертикально (но снизу вверх):
. flex-контейнер {
дисплей: гибкий;
flex-direction: обратный столбец;
}
Попробуй сам »
Пример
Значение строки складывает элементы гибкости горизонтально (слева направо):
.гибкий контейнер {
дисплей: гибкий;
flex-direction: ряд;
}
Попробуй сам »
Пример
Значение row-reverse складывает элементы гибкости по горизонтали (но справа налево):
.flex-контейнер {
дисплей: гибкий;
направление гибкости: обратный ряд;
}
Попробуй сам »
Свойство гибкой упаковки
Свойство flex-wrap
указывает,
гибкие элементы следует оборачивать или нет.
В приведенных ниже примерах есть 12 гибких элементов, чтобы лучше продемонстрировать .
недвижимость.
flex-wrap
Пример
Значение wrap указывает, что гибкие элементы будут переноситься при необходимости:
. flex-контейнер {
дисплей: гибкий;
flex-wrap: обертка;
}
Попробуй сам »
Пример
Значение nowrap указывает, что элементы гибкости не будут переноситься (это
по умолчанию):
.гибкий контейнер {
дисплей: гибкий;
гибкая упаковка: nowrap;
}
Попробуй сам »
Пример
Значение wrap-reverse указывает, что гибкие элементы будут
при необходимости в обратном порядке:
.flex-контейнер {
дисплей: гибкий;
flex-wrap: накрутка-реверс;
}
Попробуй сам »
Свойство гибкости потока
Свойство flex-flow
— это сокращенное свойство для установки как
и
flex-direction
flex-wrap
объектов.
Свойство justify-content
Свойство justify-content
используется для
выровняйте элементы гибкости:
Пример
Значение center выравнивает гибкие элементы в центре контейнера:
. flex-контейнер {
дисплей: гибкий;
justify-content: center;
}
Попробуй сам »
Пример
Значение flex-start выравнивает гибкие элементы в начале контейнера
(по умолчанию):
.гибкий контейнер {
дисплей: гибкий;
justify-content: гибкий старт;
}
Попробуй сам »
Пример
Значение flex-end выравнивает гибкие элементы в конце контейнера:
.flex-контейнер {
дисплей: гибкий;
justify-content: гибкий конец;
}
Попробуй сам »
Пример
Значение вокруг пробела отображает элементы гибкости с пробелом перед, между,
и после строк:
.гибкий контейнер {
дисплей: гибкий;
justify-content: пространство вокруг;
}
Попробуй сам »
Пример
Значение space-between отображает гибкие элементы с пробелом между
линии:
. flex-контейнер {
дисплей: гибкий;
justify-content: пробел между;
}
Попробуй сам »
Свойство align-items
Свойство align-items
используется для выравнивания
гибкие элементы.
В этих примерах мы используем контейнер высотой 200 пикселей, чтобы лучше продемонстрировать
свойство.
align-items
Пример
Значение center выравнивает гибкие элементы в середине
контейнер:
.flex-контейнер {
дисплей: гибкий;
высота: 200 пикселей;
align-items: center;
}
Попробуй сам »
Пример
Значение flex-start выравнивает гибкие элементы в верхней части контейнера:
.гибкий контейнер {
дисплей: гибкий;
высота: 200 пикселей;
выровнять элементы: гибкий старт;
}
Попробуй сам »
Пример
Значение flex-end выравнивает гибкие элементы в нижней части контейнера:
. flex-контейнер {
дисплей: гибкий;
высота: 200 пикселей;
выровнять элементы: гибкий конец;
}
Попробуй сам »
Пример
Значение stretch растягивает гибкие элементы для заполнения контейнера
(по умолчанию):
.гибкий контейнер {
дисплей: гибкий;
высота: 200 пикселей;
align-items: stretch;
}
Попробуй сам »
Пример
Значение baseline выравнивает гибкие элементы, например выравнивает их базовые линии:
.flex-контейнер {
дисплей: гибкий;
высота: 200 пикселей;
align-items: baseline;
}
Примечание: в примере используется другой размер шрифта, чтобы продемонстрировать выравнивание элементов по базовой линии текста:
Попробуй сам »
Свойство align-content
Свойство align-content
используется для выравнивания гибких линий.
В этих примерах мы используем контейнер высотой 600 пикселей со свойством flex-wrap, установленным на wrap , чтобы лучше продемонстрировать свойство align-content
.
Пример
Значение между отображает линии гибкости с равным интервалом между ними:
.flex-контейнер {
дисплей: гибкий;
высота: 600 пикселей;
flex-wrap: обертка;
выровнять контент: пробел между;
}
Попробуй сам »
Пример
Значение вокруг пробела отображает гибкие линии с пробелом перед,
между ними и после них:
.гибкий контейнер {
дисплей: гибкий;
высота: 600 пикселей;
flex-wrap: обертка;
выровнять контент: пространство вокруг;
}
Попробуй сам »
Пример
Значение stretch растягивает гибкие линии, чтобы занять оставшиеся
пробел (по умолчанию):
.flex-контейнер {
дисплей: гибкий;
высота: 600 пикселей;
flex-wrap: обертка;
выровнять контент: растянуть;
}
Попробуй сам »
Пример
Отображает значение center , отображая гибкие линии в середине контейнера:
. гибкий контейнер {
дисплей: гибкий;
высота: 600 пикселей;
flex-wrap: обертка;
выровнять контент: центр;
}
Попробуй сам »
Пример
Значение flex-start отображает гибкие линии в начале контейнера:
.flex-контейнер {
дисплей: гибкий;
высота: 600 пикселей;
flex-wrap: обертка;
выровнять контент: гибкий старт;
}
Попробуй сам »
Пример
Значение flex-end отображает гибкие линии в конце контейнера:
.гибкий контейнер {
дисплей: гибкий;
высота: 600 пикселей;
flex-wrap: обертка;
выровнять контент: гибкий конец;
}
Попробуй сам »
Идеальное центрирование
В следующем примере мы решим очень распространенную проблему стиля: perfect
центрирование.
РЕШЕНИЕ: Установите для свойств justify-content
и align-items
значение
по центру, и гибкий элемент будут точно по центру:
Пример
. гибкий контейнер {
дисплей: гибкий;
высота: 300 пикселей;
justify-content:
центр;
align-items: center;
}
Попробуй сам »
CSS Flexbox Items
Дочерние элементы (элементы)
Прямые дочерние элементы гибкого контейнера автоматически становятся гибкими (гибкими) элементами.
Элемент выше представляет четыре синих гибких элемента внутри серого гибкого контейнера.
Пример
Попробуй сам »
Свойства гибкого элемента:
Порядок собственности
Свойство order
определяет порядок
гибкие элементы.
Первый гибкий элемент в коде не обязательно должен отображаться как первый элемент в макете.
Значение заказа должно быть числом, значение по умолчанию — 0.
Пример
Свойство order может изменять порядок элементов гибкости:
Попробуй сам »
Свойство гибкого роста
Свойство flex-grow
указывает, насколько гибкий элемент будет расти относительно остальных гибких элементов.
Значение должно быть числом, значение по умолчанию — 0.
Пример
Заставить третий гибкий элемент расти в восемь раз быстрее, чем другие гибкие элементы:
Попробуй сам »
Свойство гибкости и усадки
Свойство flex-shrink
указывает, насколько гибкий элемент будет сжиматься по сравнению с остальными гибкими элементами.
Значение должно быть числом, значение по умолчанию — 1.
Пример
Не позволяйте третьему гибкому элементу сжиматься так же сильно, как другим гибким элементам:
Попробуй сам »
Гибкое основание Свойство
Свойство flex-base
определяет начальную длину гибкого элемента.
Пример
Установите начальную длину третьего гибкого элемента на 200 пикселей:
Попробуй сам »
Свойство гибкости
Свойство flex
является сокращенным свойством
,
свойства flex-grow flex-shrink
и flex-base
.
Пример
Сделайте третий гибкий элемент нерастяжимым (0), не усаживаемым (0) и с
начальная длина 200 пикселей:
Попробуй сам »
Свойство align-self
Свойство align-self
определяет
выравнивание выбранного элемента внутри гибкого контейнера.
Свойство align-self
отменяет выравнивание по умолчанию, установленное
свойство контейнера align-items
.
В этих примерах мы используем контейнер высотой 200 пикселей, чтобы лучше продемонстрировать
недвижимость:
align-self
Пример
Выровняйте третий гибкий элемент в середине контейнера:
Попробуй сам »
Пример
Выровняйте второй гибкий элемент по верхней части контейнера, а третий гибкий элемент по
дно контейнера:
Попробуй сам »
Как вертикально выровнять плавающие элементы по центру с помощью Flexbox
Недавно я обнаружил очень простое решение проблемы на основе Flexbox, которая годами создавала проблемы веб-дизайнерам и разработчикам.
Рассмотрим следующую ситуацию:
- Вы работаете с сеткой, в которой для создания столбцов используются числа с плавающей запятой. Подумайте о Bootstrap, Foundation, Skeleton, Susy или о любом другом.
- У вас есть два столбца с динамическим содержимым, смежные друг с другом, и вы не знаете размер содержимого столбца или какой столбец будет выше.
- Вам необходимо выровнять два столбца по центру по вертикали.
Наш желаемый макет будет выглядеть так:
Но по умолчанию два столбца выравниваются по верхнему краю внутри контейнера следующим образом:
Итак, как мы можем выровнять наши столбцы по центру, не нарушая наш макет на основе float? До недавнего времени эту, казалось бы, простую проблему было на удивление трудно решить.
Могу я просто использовать «vertical-align: middle»?
К сожалению, нет, по нескольким причинам.
Во-первых, как указано в документации CSS: « Свойство CSS vertical-align определяет вертикальное выравнивание встроенного поля или поля таблицы-ячейки. ”Наши элементы не являются встроенными, встроенными блоками или ячейками таблицы, поэтому это правило не будет работать без изменения наших стилей отображения.
Во-вторых, наша структура сетки использует « float: right
» для позиционирования двух наших элементов столбца.Правила CSS гласят: « Плавающий прямоугольник должен быть размещен как можно выше. ”Это означает, что плавающий элемент всегда будет выровнен по верхнему краю.
Хотя первую проблему можно решить, изменив правило « display
», сделав столбцы « inline-block
» или « table-cell
», не существует метода CSS, решающего вторую проблему. Нам нужно будет удалить правила с плавающей запятой, которые будут мешать работе базовой сетки.
Flexbox спешит на помощь
Как обычно, у Flexbox есть простое решение нашей проблемы.Вот это в два простых шага:
- Добавьте «
display: flex
» к нашему элементу контейнера. - Добавьте ‘
align-items: center
’ к нашему элементу контейнера.
Вот и все! Вот как могут выглядеть HTML и CSS для нашего упрощенного примера:
|
.