Отзывчивый многоколоночный список с порядком столбцов

Я пытаюсь создать упорядоченный список из нескольких столбцов, но борюсь с правилами макета CSS Grid.

Желаемый результат должен быть отзывчивым. На маленьких экранах 2 столбца сетки, на больших экранах до 4, все с сохранением порядка столбцов.

Вместо того, чтобы заказывать так:

1  2  3  4
5  6  7  8
9  10 11 12
13 14 15

Они должны быть заказаны следующим образом:

1 5 9  13
2 6 10 14
3 7 11 15
4 8 12

Я чувствую, что близок к этой скрипке.

ol {
  margin: 0;
  padding: 0;
  list-style: none;
  background-color: grey;
  
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(33.333%, 50%));
  grid-auto-flow: column;
  grid-template-rows: repeat(5, 1em);
}

li {
  outline: 1px solid orange;
}
<ol>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li>Item 4</li>
  <li>Item 5</li>
  <li>Item 6</li>
  <li>Item 7</li>
  <li>Item 8</li>
  <li>Item 9</li>
  <li>Item 10</li>
  <li>Item 11</li>
  <li>Item 12</li>
  <li>Item 13</li>
  <li>Item 14</li>
  <li>Item 15</li>
</ol>

В частности, я борюсь с этими моментами:

a) grid-auto-flow: column требуется, чтобы перенос столбцов работал, но также вынуждает меня добавлять grid-template-rows: repeat(5, 1em), чтобы указать количество строк, что нарушает отзывчивость. Есть ли способ автоматически рассчитать количество строк на основе содержимого и количества столбцов?

б) Почему ширина столбцов распределена неравномерно и почему они не адаптируются к размеру экрана? Разве не для этого предназначен minmax?


person Sven    schedule 02.07.2017    source источник
comment
По какой-то причине использование grid-auto-flow: column, похоже, нарушает механизм автозаполнения строк. Единственный способ, которым мне удалось это осуществить, - это медиа-запросы. codepen.io/danield770/pen/JJLpgR/?editors=1100 — но я думаю, что это обман :)   -  person Danield    schedule 02.07.2017


Ответы (2)


Настройте количество столбцов, чтобы изменить количество столбцов :)

ol {
  margin: 0;
  padding: 0;
  list-style: none;
  /*---*/
  column-count: 4;
  column-gap: 0;
  width: 100%;
}

li {
  background-color: grey;
  outline: 1px solid orange;
}
<ol>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li>Item 4</li>
  <li>Item 5</li>
  <li>Item 6</li>
  <li>Item 7</li>
  <li>Item 8</li>
  <li>Item 9</li>
  <li>Item 10</li>
  <li>Item 11</li>
  <li>Item 12</li>
  <li>Item 13</li>
  <li>Item 14</li>
  <li>Item 15</li>
</ol>

person Community    schedule 02.07.2017

Давайте пройдемся по двум вашим камням преткновения.

  1. #P2#

grid-auto-flow: column не работает перенос столбцов. На самом деле, он делает прямо противоположное. Правило создает новые столбцы для размещения дополнительных элементов сетки.

Вот как это работает (из спецификации):

7.7. Автоматическое размещение: свойство grid-auto-flow

Элементы сетки, которые не размещены явно, автоматически помещаются в незанятое пространство в контейнере сетки с помощью алгоритма автоматического размещения.

grid-auto-flow управляет работой алгоритма автоматического размещения, точно определяя, как автоматически размещенные элементы попадают в сетку.

column

Алгоритм автоматического размещения размещает элементы, заполняя каждый столбец по очереди, добавляя новые столбцы по мере необходимости.

row

Алгоритм автоматического размещения размещает элементы, заполняя каждую строку по очереди, добавляя новые строки по мере необходимости. Если ни row, ни column не указаны, предполагается row.

Что касается вашего вопроса:

Есть ли способ автоматически рассчитать количество строк на основе содержимого и количества столбцов?

Только с CSS Grid я в это не верю. Как сказано в спецификации, grid-auto-flow предназначен для добавления новых треков в заданном направлении (column/row).

Если это можно сделать с помощью Grid, то это не будет полностью автоматическим. Вам понадобится хотя бы какое-то определенное размещение и, я думаю, медиа-запросы.

Наконец, что касается переноса столбцов, это зависит от значений auto-fit или auto-fill в свойствах grid-template-columns и grid-template-rows.


  1. #P17#

Это восходит к разделу спецификаций, выделенному выше.

Это ваш код размера столбца:

grid-template-columns: repeat(auto-fill, minmax(33.333%, 50%));

Это означает: Ширина каждого явного столбца должна быть не менее 33,333 % и не более 50 %.

Проблема в том, что третий столбец не является явным. Он неявный, так как добавляется в сетку алгоритмом автоматического размещения под руководством grid-auto-flow: column. Таким образом, этот столбец не подпадает под действие grid-template-columns, которое касается исключительно явный размер трека.

Свойства для неявного определения размера дорожки это grid-auto-columns и grid-auto-rows. Их значение по умолчанию — auto, что вы и видите в своем макете: Третий столбец — это ширина его содержимого.

ol {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(33.333%, 50%));
  grid-auto-flow: column;
  grid-template-rows: repeat(5, 1em);

  margin: 0;
  padding: 0;
  list-style: none;
  background-color: grey;
}

li {
  outline: 1px solid orange;
}
<ol>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li>Item 4</li>
  <li>Item 5</li>
  <li>Item 6</li>
  <li>Item 7</li>
  <li>Item 8</li>
  <li>Item 9</li>
  <li>Item 10</li>
  <li>Item 11</li>
  <li>Item 12</li>
  <li>Item 13</li>
  <li>Item 14</li>
  <li>Item 15</li>
</ol>

Как только вы установите значение grid-auto-columns, размер третьего столбца будет правильным.

ol {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(33.333%, 50%));
  grid-auto-flow: column;
  grid-template-rows: repeat(5, 1em);
  grid-auto-columns: 33.333%; /* NEW */

  margin: 0;
  padding: 0;
  list-style: none;
  background-color: grey;
}

li {
  outline: 1px solid orange;
}
<ol>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li>Item 4</li>
  <li>Item 5</li>
  <li>Item 6</li>
  <li>Item 7</li>
  <li>Item 8</li>
  <li>Item 9</li>
  <li>Item 10</li>
  <li>Item 11</li>
  <li>Item 12</li>
  <li>Item 13</li>
  <li>Item 14</li>
  <li>Item 15</li>
</ol>


Конечно, приведенная выше информация предназначена для объяснения, а не для решения основной проблемы, поскольку я не верю, что CSS Grid предоставляет ее.

person Michael Benjamin    schedule 02.07.2017
comment
В частности, примечание auto-fill будет использовать размер max для расчета количества создаваемых дорожек, если это возможно. В данном случае 50% совместимо с этим, поэтому получится два столбца. (Нет причин использовать автозаполнение процентами, поскольку вы тривиально знаете, сколько столбцов поместится, просто из простого деления.) - person Xanthir; 18.09.2018
comment
Кроме того, что касается вопроса в этом посте, он более подробно рассматривается здесь: Заставьте контейнер сетки заполнять столбцы, а не строки. Если на самом деле у Grid есть способ автоматически добавлять столбцы после заполнения всего вертикального пространства (например, столбцы CSS), вы можете упомянуть об этом там. @Ксантир - person Michael Benjamin; 23.09.2018