stackoverflow.com/q/42176419/3597276

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

Большинство реализаций адаптивной сетки используют что-то, связывающее это:

grid-template-colums: repeat(auto-fill, minmax(120px, 1fr));

Это работает нормально, за исключением того, что в качестве размера изображения по умолчанию используется минимальное значение, что приводит к интерполяции изображений внутри сетки. Я хочу сделать наоборот - установить максимальную ширину и уменьшить изображения при необходимости.

Допустим, мои элементы сетки должны иметь максимальную ширину 400 пикселей. Вот некоторые значения, которые я хочу получить:

400px available space: One image with a width of 400px
402px available space: Two images with a width of 201px
800px available space: Two images with a width of 400px
and so on …

По сути, я хочу сжать мое изображение между 200px и 400px и всегда использовать максимально возможное значение. Я думаю, мне нужно что-то вроде этого:

min(max(200px, 1fr), 400px)

Единственный способ, которым я смог достичь этого, - это генерировать некоторые медиа-запросы.

/* This example adjusts items to a max-width of 400px with a 10px grid-gap.*/

@media (min-width: 401px) {
  .grid {
    grid-template-columns: repeat(auto-fill, calc((100% - 10px) / 2));
  }
}
@media (min-width: 811px) {
  .grid {
    grid-template-columns: repeat(auto-fill, calc((100% - 20px) / 3));
  }
}

Я написалSass Mixin чтобы сделать этот процесс более гибким, но это решение имеет некоторые недостатки:

Вы должны сгенерировать произвольное количество запросов для обработки экрана нескольких размеров, что, вероятно, приводит к мертвому кодуВы должны знать доступное пространство контейнера сетки для медиа-запросов (или используемое пространство для расчета доступного пространства)

Я ищу способ, который не имеет этих недостатков.

Редактировать:

Вот CodePen моего текущего кода. Должно быть легче понять, что я хочу сделать, если вы поиграете с этим.

Ответы на вопрос(1)

Ваш ответ на вопрос