Макет строки flexbox с порядком столбцов - невозможно?

У меня проблема с макетом, и я не могу придумать решение.

Это часть формы и в основном это динамический список флажков и их меток. В зависимости от ширины экрана он может быть в 1, 2 или 3 столбца.

Располагаем по столбцам, как по 3 столбцам:

1  5  9
2  6  10
3  7
4  8

Если бы они были статичными, это было бы легко сделать с помощью столбцов css ... но проблема в том, что они являются частью древовидной структуры, где каждый элемент может расширяться, чтобы показать больше элементов:

Макет строки flexbox с порядком столбцов - невозможно?Макет строки flexbox с порядком столбцов - невозможно?

В столбцах CSS (или столбцах flexbox с заданной высотой), если вы расширяете, скажем, «2017», даты, расположенные под ним, переносятся в следующий столбец, что, как мне кажется, может сбить с толку конечного пользователя. Так что в идеале, когда 2017 расширен, он будет перемещать все, что ниже, а не в следующий столбец.

Этого можно почти достичь, используя flexbox и flex-wrap ... но единственная проблема - это порядок.

Поэтому мне в основном нужна функциональность строк flexbox с упорядочением, как столбцы. Я плохо разбираюсь в математике, поэтому мне было интересно, можно ли что-то сделать исключительно с помощью CSS ... но в остальном я также открыт для решений javascript, хотя они должны быть доступны.

А идеи? Спасибо.

Не обошлось и без фиксированной высоты.

Paulie_D 31.03.2021 09:28

Я мог бы использовать js для определения и установки высоты, но казалось, что даже при этом у меня будет проблема, когда нижние элементы будут перенесены в следующий столбец.

fallenturtle 31.03.2021 18:30

Что значит «единственная проблема - это заказ»? Мол, как бы гибкие элементы вышли из строя?

dgrogan 31.03.2021 22:38

@dgrogan Я плохо сформулировал это, я должен был сказать, что проблема связана с flexbox, использующим flex-direction: row, поскольку при установке его в столбец по-прежнему будет проблема с содержимым, превышающим заданную высоту, помещаемую в следующий столбец, но я хотел, чтобы порядок был как в столбцах, а не слева направо.

fallenturtle 01.04.2021 01:45
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
4
43
1

Ответы 1

Я нашел решение, используя сетки CSS, grid-auto-flow: column; и используя Javascript для подсчета элементов, которые мне нужно разложить, и внедрения их в некоторый CSS в документ.

   function injectStyles(rule) {
      var reviewCount = document.querySelector("#tree-case-review-date .fancytree-container").childElementCount;
      var reviewCountTwo = Math.ceil(reviewCount / 2);
      var reviewCountThree = Math.ceil(reviewCount / 3);
      var purCount = document.querySelector("#tree-pur .fancytree-container").childElementCount;
      var purCountTwo = Math.ceil(purCount / 2);
      var purCountThree = Math.ceil(purCount / 3);
      var div = $("<div />", {
        html: '&shy;<style>@media only screen and (min-width:700px) { #tree-case-review-date .fancytree-container { grid-template-rows: repeat(' + reviewCountTwo + ', auto);} #tree-pur .fancytree-container { grid-template-rows: repeat(' + purCountTwo + ', auto);}}@media only screen and (min-width:1000px) { #tree-case-review-date .fancytree-container { grid-template-rows: repeat(' + reviewCountThree + ', auto);}#tree-pur .fancytree-container {grid-template-rows: repeat(' + purCountThree + ', auto);}}</style>'
      }).appendTo("body");   
    }

    window.onload = function() {
      injectStyles();
    };

Я думаю, что это нечестивое несоответствие jquery и нормального javascript, поэтому мне нужно узнать, как это исправить.

Другие вопросы по теме