Давайте сейчас научимся делать плиточку на флексбоксах. Для начала расположим флекс-блоки в несколько рядов, по три блок в ряд.
Для этого родителю флексов установим ширину
в 300px
и flex-wrap
в значении
wrap
, а потомкам ширину в 100px
:
<div class="parent">
<div class="child">1</div>
<div class="child">2</div>
<div class="child">3</div>
<div class="child">4</div>
<div class="child">5</div>
<div class="child">6</div>
<div class="child">7</div>
<div class="child">8</div>
<div class="child">9</div>
</div>
.parent {
display: flex;
flex-wrap: wrap;
width: 300px;
border: 1px solid red;
}
.child {
box-sizing: border-box;
width: 100px;
height: 100px;
border: 1px solid green;
}
:
Давайте теперь сделаем расстояние между нашими блоками по горизонтали. Для этого увеличим ширину родителя, чтобы дать дополнительное место для отступов.
Так как у нас три блока в ряд, получается
что между ними по два промежутка. Пусть мы
хотим, чтобы каждый промежуток имел ширину
10px
. Получится, что ширину родителя
нужно увеличить на 20px
, то есть сделать
не 300px
, а 320px
.
Давайте теперь родителю блоков зададим justify-content
в значение space-between
и получим
желаемое расстояние между блоками:
<div class="parent">
<div class="child">1</div>
<div class="child">2</div>
<div class="child">3</div>
<div class="child">4</div>
<div class="child">5</div>
<div class="child">6</div>
<div class="child">7</div>
<div class="child">8</div>
<div class="child">9</div>
</div>
.parent {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
width: 320px;
border: 1px solid red;
}
.child {
box-sizing: border-box;
width: 100px;
height: 100px;
border: 1px solid green;
}
:
Давайте теперь добавим такое же расстояние
между блоками и по вертикали. Для этого можно
задать свойство align-content
в значении
space-between
.
Для этого, однако, нужно задать высоту родителю,
иначе align-content
не будет работать.
Давайте установим высоту в 320px
.
В этом случае у нас как раз поместятся три
ряда блоков по 100px
высотой плюс
два отступа между рядами в 10px
.
Давайте запустим:
<div class="parent">
<div class="child">1</div>
<div class="child">2</div>
<div class="child">3</div>
<div class="child">4</div>
<div class="child">5</div>
<div class="child">6</div>
<div class="child">7</div>
<div class="child">8</div>
<div class="child">9</div>
</div>
.parent {
display: flex;
flex-direction: row;
justify-content: space-between;
align-content: space-between;
flex-wrap: wrap;
width: 320px;
height: 320px;
border: 1px solid red;
}
.child {
box-sizing: border-box;
width: 100px;
height: 100px;
border: 1px solid green;
}
:
Все работает замечательно, но есть некоторые проблемы.
Проблемы плитки
Первая проблема в общем-то очевидна сразу
- очень не удобно то, что родителю приходится
явно задавать высоту. Ведь у нас вполне может
быть такое, что количество блоков будет меняться
динамически и их количество будет то меньше,
то больше, чем 9
.
А вот вторая проблема возникнет, если количество блоков такое, что в последнем ряду будет недостаточное количество блоков. В этом случае последний ряд будет выглядеть отвратительно:
<div class="parent">
<div class="child">1</div>
<div class="child">2</div>
<div class="child">3</div>
<div class="child">4</div>
<div class="child">5</div>
<div class="child">6</div>
<div class="child">7</div>
<div class="child">8</div>
</div>
.parent {
display: flex;
flex-direction: row;
justify-content: space-between;
flex-wrap: wrap;
width: 320px;
border: 1px solid red;
}
.child {
box-sizing: border-box;
width: 100px;
height: 100px;
border: 1px solid green;
}
:
Получается, что даже по горизонтали значение
space-between
работает плохо в нашем
случае.
Резюмируем: если количество ваших потомков
всегда постоянно и нормально помещается в
родителя, то плиточка на space-between
достаточно удобная вещь. В противном случае
придется придумывать что-то еще.
Практические задачи
Даны 12
элементов. Сделайте из них
плиточку по 4
элемента в ряд с шириной
каждого элемента в 100px
и расстоянием
между ними в 20px
.
Даны 12
элементов. Сделайте из них
плиточку по 3
элемента в ряд с шириной
каждого элемента в 150px
и расстоянием
между ними в 10px
.