Как заставить все элементы сжать до самого большого содержимого элемента в двух измерениях? - PullRequest
0 голосов
/ 30 апреля 2018

В приведенном ниже примере я хочу, чтобы все элементы имели ширину наибольшего содержимого (например, элемент 5 ) .

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

  • Ширина содержимого каждого элемента также является динамической.

  • Количество элементов в каждой строке будет варьироваться в зависимости от ширины контейнер.

желаемый выход

enter image description here

Примечание: Медиа-запросы не будут работать для моего сценария.


ИСПОЛЬЗОВАНИЕ CSS FLEX

Flex считается одномерным . Это означает, что он может достичь желаемого результата на одной оси (строке), если содержимое не меньше доступного пространства.

Пример без упаковки (одна строка)

.container {
  display: flex;
}

.item {
  background: #58c;
  text-align: center;
  white-space: nowrap;
  margin: 0 10px 10px 0;
  flex: 1;
}
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5 is longer</div>
  <div class="item">6</div>
  <div class="item">7</div>
  <div class="item">8</div>
</div>

Атрибут Flex flex-wrap можно использовать для создания двумерного макета. Опять же, это хорошо работает, но для расчета ширины каждого элемента требуется фиксированная ширина .

Пример упаковки (несколько строк)

.container {
  display: flex;
  flex-wrap:wrap;
}

.item {
  background: #58c;
  text-align: center;
  white-space: nowrap;
  margin: 0 10px 10px 0;
  flex: 0 1 100px;
}
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5 is longer</div>
  <div class="item">6</div>
  <div class="item">7</div>
  <div class="item">8</div>
  <div class="item">9</div>
  <div class="item">10</div>
</div>

С ИСПОЛЬЗОВАНИЕМ CSS GRID

Для двумерного дизайна рекомендуется CSS Grid , но в приведенном ниже примере используется фиксированная ширина. Похоже, min-content здесь нужно учитывать, но как?

Неудачный пример

grid-template-columns: repeat(auto-fit, min-content);

ФИКСИРОВАННЫЙ ПРИМЕР (несколько строк)

.container {
  display: grid;
  grid-template-columns: repeat(auto-fit, 100px);
  grid-auto-rows: 20px;
  grid-gap: 5px;
}

.item {
  background: #58c;
  text-align: center;
  white-space: nowrap;
}
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5 is longer</div>
  <div class="item">6</div>
  <div class="item">7</div>
  <div class="item">8</div>
  <div class="item">9</div>
  <div class="item">10</div>
</div>

Я не думаю, что это возможно с сеткой из-за следующего примечания W3C :

«Автоматическое повторение (автозаполнение или автоподгонка) нельзя сочетать с внутренние или гибкие размеры. "


Основная информация

По сути, я думаю, что нет никакого способа сделать это с помощью CSS.

Чтобы получить ширину каждого элемента, оно должно быть:

  • предопределено (исправлено).
  • выводится по горизонтали с использованием процента или доли.
  • выводится вертикально из текущего столбца.

Не вижу способа вывести ширину элементов из другой строки И столбца одновременно.

1 Ответ

0 голосов
/ 01 мая 2018

Это похоже на проблему, которую CSS Grid должен уметь обрабатывать. Но я не видел ничего в спецификации, которая обеспечивает решение. Я не говорю, что это не так, ни как простая команда, ни как комбинация правил. Я просто не нашел его (если он существует).

Вот самое близкое, что я смог получить:

.container {
  display: grid;
  grid-auto-columns: min-content; /* max-content works, as well */
  grid-gap: 10px;
}

.item {
  background: #58c;
  text-align: center;
  white-space: nowrap;
}
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5 is longer</div>
  <div class="item">6</div>
  <div class="item">7</div>
  <div class="item">8</div>
  <div class="item">9</div>
  <div class="item">10</div>
</div>

Приведенный выше код решает проблему ширины & mdash; все предметы имеют длину самого длинного предмета. Но нет упаковки. Проблема отражена в примере ниже.

.container {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min-content, 1px));
  grid-gap: 10px;
}

.item {
  background: #58c;
  text-align: center;
  white-space: nowrap;
}
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5 is longer</div>
  <div class="item">6</div>
  <div class="item">7</div>
  <div class="item">8</div>
  <div class="item">9</div>
  <div class="item">10</div>
</div>

Приведенный выше код запускает процесс обтекания и преодолевает ограничение внутреннего размера при использовании repeat(). Однако требование равной длины самого длинного контента не выполняется.

7.2.2.1. Синтаксис repeat()

Автоматические повторы (auto-fill или auto-fit) не могут быть объединены с внутренними или гибкими размерами.

  • встроенная функция определения размера min-content, max-content, auto, fit-content().

  • A гибкая функция определения размера <flex> (fr).

Вы можете обойти ограничение auto примерно так:

repeat(auto-fill, minmax(min-content, 1px))

minmax(min,max)

Определяет диапазон размеров, больший или равный min и меньший или равно макс .

Если max , то max игнорируется и minmax(min,max) обрабатывается как min .

Как максимум, значение <flex> устанавливает коэффициент гибкости дорожки; как минимум, недействителен.

Может быть, кто-то еще может взять его отсюда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...