#html #css #flexbox #css-grid
Вопрос:
Я хочу , чтобы контейнер flex с flex-direction
as column
, чтобы элементы заказа во flexbox динамически занимали пустые места.
У меня есть 2 элемента разных типов в моем массиве:
- Короткий (высота: 100 пикселей, ширина: 100 пикселей)
- длинные (высота: 200 пикселей, ширина: 100 пикселей)
Высота контейнера также фиксирована для размещения двух коротких предметов и одного длинного предмета, т. е. 220 пикселей;
Если в моем массиве есть следующие элементы:
- Короткий, длинный, короткий, длинный, короткий, короткий, длинный
Затем я хочу, чтобы они отображались как:
- Короткий, Короткий, длинный, короткий, короткий, длинный (т. е. два коротких, разделенных длинным, чтобы собраться вместе, чтобы использовать пустое пространство под одним коротким элементом).
Возможно ли это с помощью flex или каковы альтернативы для достижения такого уровня компоновки массива элементов?
Проблема
Комментарии:
1. Это возможно с помощью flex, но вам придется установить
order
его самостоятельно, проверьте это для получения дополнительной информации для заказа MDN2. @Parco спасибо, я подумал о «заказе», но для этого мне нужно написать программную логику в JavaScript, чтобы перебирать элементы, а затем идентифицировать шаблон, находить отдельные короткие элементы в массиве и приближать их, добавляя «заказ». Есть ли какое-либо CSS-решение для этого?
Ответ №1:
Помимо использования оберток для различных элементов, flexbox-не лучший вариант здесь.
CSS-Сетка может управлять этим, но вам придется указать, где вы хотите, чтобы находился каждый элемент.
nth-child
могу помочь здесь, но вкратце это будет выглядеть примерно так:
.wrap {
display: grid;
grid-template-columns: repeat(4, 100px);
grid-template-rows: repeat(2, 100px);
gap: 10px;
}
.item {
border: 1px solid grey;
display: grid;
place-items: center;
}
.tall {
grid-row: span 2;
}
.item:nth-child(4) {
grid-column: 3;
grid-row: 2;
}
.item:nth-child(5) {
grid-column: 1;
grid-row: 2;
}
<div class="wrap">
<div class="item">1</div>
<div class="item tall">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item tall">6</div>
</div>
Комментарии:
1. Спасибо @Paulie_D, но это более статично/жестко закодировано, могу ли я использовать элемент:nth-дочерний элемент(5) динамически ? Как бы я узнал, какой элемент в динамическом массиве должен занимать место в n-м столбце, в котором есть только один элемент
2. Вы все еще можете выбрать каждого 5-го ребенка. Это всего лишь демонстрация.
Ответ №2:
Вот рабочая песочница с решением вашей проблемы с использованием сетки.
Решение требует жесткого кодирования, по крайней мере, некоторых позиций элементов.
Это предполагает использование:
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(2, 1fr);
И установка определенных местоположений для определенных элементов в контейнере:
grid-column: 3 / 4;
Для обработки случая с 3 элементами в контейнере требуются следующие изменения:
grid-template-columns: repeat(4, 1fr);
В … >
grid-template-columns: repeat(2, 1fr);
p.s. согласно CanIUse, grid имеет поддержку 96,22% во всех браузерах.
Комментарии:
1. Если бы вы могли продемонстрировать это, это было бы идеально. Я не думаю, что это так просто, как вы могли бы подумать.
2. Спасибо вам @Dandari , действительно ценю, что вы подготовили песочницу для решения, она выглядит хорошо, однако она все еще не справляется с этим делом — Короткая, Длинная, Короткая -> Ожидалось, что она должна быть короткой, короткой, длинной. [3]: i.stack.imgur.com/O5h5B.png Спасибо
3. Спасибо @user3509547 за ваши отзывы, я обновил свой ответ, включив в него необходимое вам решение. К сожалению, я не смог придумать динамичное решение вашей проблемы.