Как заставить flexbox использовать пустое пространство при использовании flex-direction в качестве столбца

#html #css #flexbox #css-grid

Вопрос:

Я хочу , чтобы контейнер flex с flex-direction as column , чтобы элементы заказа во flexbox динамически занимали пустые места.

У меня есть 2 элемента разных типов в моем массиве:

  1. Короткий (высота: 100 пикселей, ширина: 100 пикселей)
  2. длинные (высота: 200 пикселей, ширина: 100 пикселей)

Высота контейнера также фиксирована для размещения двух коротких предметов и одного длинного предмета, т. е. 220 пикселей;

Если в моем массиве есть следующие элементы:

  • Короткий, длинный, короткий, длинный, короткий, короткий, длинный

Затем я хочу, чтобы они отображались как:

  • Короткий, Короткий, длинный, короткий, короткий, длинный (т. е. два коротких, разделенных длинным, чтобы собраться вместе, чтобы использовать пустое пространство под одним коротким элементом).

Возможно ли это с помощью flex или каковы альтернативы для достижения такого уровня компоновки массива элементов?

Проблема

Проблема

Ожидаемый

Комментарии:

1. Это возможно с помощью flex, но вам придется установить order его самостоятельно, проверьте это для получения дополнительной информации для заказа MDN

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