взаимное расположение крупных блоков страницы.
колонка раз
колонка два
колонка три
колонка раз | колонка два | колонка три |
раз | два | три |
.float-left
{
width: 33%;
float: left;
}
Гибкие раскладки:
display: flex
флекс-контейнер (flex-container)
флекс-элемент (flex-item)
главная ось (main axis)
поперечная ось (cross axis)
Флекс-элементы располагаются вдоль главной оси.
Свойство flex-direction меняет её направление.
flex-direction: row
по умолчанию
flex-direction: row-reverse
flex-direction: column
flex-direction: column-reverse
Свойство justify-content управляет выравниванием флекс-элементов вдоль главной оси.
justify-content: flex-start
по умолчанию
justify-content: flex-end
justify-content: center
justify-content: space-between
justify-content: space-around
Поперечная ось всегда перпендикулярна главной оси.
Направление изменить нельзя.
Свойство align-items управляет выравниванием флекс-элементов вдоль поперечной оси.
align-items: stretch
по умолчанию
align-items: flex-start
align-items: flex-end
align-items: center
align-items: baseline
align-self даёт переопределить выравнивание у флекс-элемента.
Значения те же, что и у align-items.
Что если флекс-элементов
много?
Будут сжиматься до предела.
Выйдут за пределы контейнера, но продолжат располагаться в один ряд.
Переносом элементов управляет свойство flex-wrap, и по умолчанию перенос запрещён.
flex-wrap: nowrap
wrap
flex-wrap: wrap-reverse
Можно комбинировать направление и перенос в свойстве flex-flow:
.container
{
display: flex;
flex-flow: row wrap;
}
Cвойство align-content управляет распределением рядов флекс-элементов вдоль поперечной оси.
align-content: stretch
по умолчанию
align-content: flex-start
align-content: flex-end
align-content: center
align-content: space-between
align-content: space-around
Если активно align-content,
то что с align-items?
align-content: stretch; align-items: center
align-content: stretch; align-items: flex-start
С помощью свойства order можно менять порядок следования флекс-элементов.
order: 0
по умолчанию
order: 1
order: -1
order
Как управлять размерами флекс-элементов?
Cвойство flex-basis задает базовый размер на главной оси.
Возможные значения:
flex-basis: 50%
Почему размер базовый?
Это исходный размер.
Свободное место можно распределять в соответствии с коэффициентом жадности флекс-элемента (flex-grow).
flex-grow: 0
по умолчанию
flex-grow: 1
flex-grow: 2
.box {
padding: 10px;
margin: 10px;
}
.1 {
flex-grow: 1;
}
.2 {
flex-grow: 2;
}
Что если сумма базовых размеров больше, чем свободного места?
Будем делить отрицательное значение свободного места в соответствии с коэффициентами сжатия (flex-shrink).
flex-shrink: 1
по умолчанию
flex-shrink: 0
flex-shrink: 0
Положительное свободное место — увеличиваем размеры в соответствии с flex- grow
Отрицательное свободное место — уменьшаем в соответствии c flex-shrink
С помощью сокращённого свойства flex можно одновременно
задать
флекс-элементу flex-grow, flex-shrink
и flex-basis.
flex: [flex-grow] [flex-shrink] [flex-basis]
.elem
{
flex: initial; /* = 0 1 auto — все по умолчанию */
}
flex: [flex-grow] [flex-shrink] [flex-basis]
.elem
{
flex: initial; /* = 0 1 auto — все по умолчанию */
flex: auto; /* = 1 1 auto */
}
flex: [flex-grow] [flex-shrink] [flex-basis]
.elem
{
flex: initial; /* = 0 1 auto — все по умолчанию */
flex: auto; /* = 1 1 auto */
flex: none; /* = 0 0 auto */
}
flex: [flex-grow] [flex-shrink] [flex-basis]
.elem
{
flex: initial; /* = 0 1 auto — все по умолчанию */
flex: auto; /* = 1 1 auto */
flex: none; /* = 0 0 auto */
flex: 2; /* число -> flex-grow,
= 2 1 auto */
}
flex: [flex-grow] [flex-shrink] [flex-basis]
.elem
{
flex: initial; /* = 0 1 auto — все по умолчанию */
flex: auto; /* = 1 1 auto */
flex: none; /* = 0 0 auto */
flex: 2; /* число -> flex-grow,
= 2 1 auto */
flex: 50%; /* единица измерения длины -> flex-basis = 50%,
= 0 1 50% */
}
flex: [flex-grow] [flex-shrink] [flex-basis]
.elem
{
flex: initial; /* = 0 1 auto — все по умолчанию */
flex: auto; /* = 1 1 auto */
flex: none; /* = 0 0 auto */
flex: 2; /* число -> flex-grow,
= 2 1 auto */
flex: 50%; /* единица измерения длины -> flex-basis = 50%,
= 0 1 50% */
flex: 0px; /* не то же самое, что flex: 0! */
}
flex: [flex-grow] [flex-shrink] [flex-basis]
.elem
{
flex: initial; /* = 0 1 auto — все по умолчанию */
flex: auto; /* = 1 1 auto */
flex: none; /* = 0 0 auto */
flex: 2; /* число -> flex-grow,
= 2 1 auto */
flex: 50%; /* единица измерения длины -> flex-basis = 50%,
= 0 1 50% */
flex: 0px; /* не то же самое, что flex: 0! */
flex: 2 50%; /* flex-grow & flex-basis,
= 2 1 50% */
}
flex: [flex-grow] [flex-shrink] [flex-basis]
.elem
{
flex: initial; /* = 0 1 auto — все по умолчанию */
flex: auto; /* = 1 1 auto */
flex: none; /* = 0 0 auto */
flex: 2; /* число -> flex-grow,
= 2 1 auto */
flex: 50%; /* единица измерения длины -> flex-basis = 50%,
= 0 1 50% */
flex: 0px; /* не то же самое, что flex: 0! */
flex: 2 50%; /* flex-grow & flex-basis,
= 2 1 50% */
flex: 2 0 50%;
}
А теперь немножко магии...
Родителю — display: flex,
ребёнку — margin: auto
grid = сетка
Даёт возможность располагать элементы по сетке!
display: grid
Чтобы наполнить сетку
колонками и рядами
существуют свойства
grid-template-columns
и grid-template-rows.
.container
{
display: grid;
grid-template-columns: 100px auto 100px; /* ширины столбцов */
grid-template-rows: 100px 100px 100px; /* высоты рядов */
}
.container
{
display: grid;
grid-template-columns: 100px auto 100px; /* ширины столбцов */
grid-template-rows: 100px 100px 100px; /* высоты рядов */
}
.container
{
display: grid;
grid-template-columns: 100px auto 100px; /* ширины столбцов */
grid-template-rows: 100px 100px 100px; /* высоты рядов */
}
.container
{
display: grid;
grid-template-columns: 100px auto 100px; /* ширины столбцов */
grid-template-rows: 100px 100px 100px; /* высоты рядов */
}
.container
{
display: grid;
grid-template-columns: 100px auto 100px; /* ширины столбцов */
grid-template-rows: 100px 100px 100px; /* высоты рядов */
}
.container
{
display: grid;
grid-template-columns: 100px auto 100px; /* ширины столбцов */
grid-template-rows: 100px 100px 100px; /* высоты рядов */
}
.a
{
grid-row: 1 / 2;
grid-column: 1 / 4;
}
.a
{
grid-row: 1 / 2;
grid-column: 1 / 4;
}
.b
{
grid-row: 2 / 4;
grid-column: 1 / 2;
}
.a
{
grid-row: 1 / 2;
grid-column: 1 / 4;
}
.b
{
grid-row: ➩ 1 / 4;
grid-column: 1 / 2;
}
.a
{
grid-row: 1 / 2;
grid-column: 1 / 4;
➩ z-index: 1;
}
.b
{
grid-row: 1 / 4;
grid-column: 1 / 2;
}
Размер дорожки можно указывать в fr – долях свободного места.
Свободное место вычисляется после расположения всех элементов фиксированных размеров.
.container
{
display: grid;
grid-template-columns: 100px 1fr 1fr;
grid-template-rows: 100px 100px 100px;
}
.a
{
grid-column: span 3;
}
.a
{
grid-column: span 3;
}
.b
{
grid-row: span 2;
}
В контейнере можно создавать именованные области с помощью свойства grid-template-areas.
Поместить элемент в область можно свойством grid-area.
.beach {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 100px 100px 100px;
grid-template-areas: 'sand water'
'sand water'
'grass grass';
}
.a {
grid-area: grass;
}
.b {
grid-area: sand;
}
.c {
grid-area: water;
}
.beach {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 100px 100px 100px;
grid-template-areas: 'sand water'
'sand water'
'. grass';
}
.a {
grid-area: grass;
}
.b {
grid-area: sand;
}
.c {
grid-area: water;
}
Свойство grid-template:
.container
{
display: grid;
grid-template: 'header header' 100px
'sidebar content' 100px
'footer content' 100px
/ 100px auto;
}
Используя свойство grid-gap, можно управлять размером интервалов между линиями.
Интервал только между рядами — grid-row-gap, только между столбцами — grid-column-gap.
.container
{
grid-column-gap: 1%;
grid-row-gap: 16px;
}
12 колонок!
Писать руками?
.container
{
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr...;
}
НЕТ. Есть функция repeat()
.container
{
grid-template-columns: repeat(12, 1fr);
}
.container
{
display: flex;
}
.column-i
{
flex: auto;
}
.container
{
display: grid;
grid-template-columns:
1fr 1fr 1fr;
}
Home
Search
Logout
.header
{
display: flex;
align-items: center;
}
.logout
{
margin-left: auto;
}
.header
{
display: grid;
grid-template-columns:
repeat(10, 1fr);
}
.logout
{
grid-column: 10;
}
HEADER
CONTENT
.container
{
display: grid;
grid-template-columns: repeat(12, 1fr);
grid-template-rows: 50px 350px 50px;
}
.header
{
display: flex;
align-items: center;
}
.logout
{
margin-left: auto;
}
.header,
.footer
{
grid-column: span 12;
}
.menu
{
grid-column: span 2;
}
.content
{
grid-column: span 10;
}
условное применение CSS-правил.
Одна разметка, разные наборы стилей.
/* для мобильных */
body {
background: red;
}
/* для планшетов */
@media screen and (min-width: 768px) {
body {
background: yellow;
}
}
/* для десктопов */
@media screen and (min-width: 1280px) {
body {
background: blue;
}
}