Резиновая грид-раскладка

Минимальная ширина карточки - 360px.

Максимальная - 100%.

Отступ между колонками - 20px.

Если в контейнере нет места для двух колонок (КОНТЕЙНЕР<740px(360+360+20)), то карточки располагаются в одну колонку.

Если влезает две колонки, но не влезает три (740px<=КОНТЕЙНЕР<1140px(360+360+360+20+20)), то отображаются две колонки. Если количество карточек нечетное. При этом:

  1. Если количество карточек нечетное, то последняя карточка растягивается на две колонки.

Если влезает три колонки (КОНТЕЙНЕР>=1140px), отображаются три колонки. При этом:

  1. Если в списке одна карточка - она растягивается на три колонки.
  2. Если в списке 2 или 4 карточки - отображаются две колонки.
  3. Если количество карточек четное трем - отображаются три колонки.
  4. Если количество карточек четное трем + 1 карточка (7, 10, 13, 16) - последняя карточка растягивается на три колонки.
  5. Если количество карточек четное трем + 2 карточки (8, 11, 15, 17) - последние две карточки отображаются в две колонки.

На странице с демо можно изменить количество карточек и посмотреть, как они себя ведут. Ссылка на демо - под кодом.

.categories__list {
    max-width: 1110px;
    margin: 0 auto;
    display: grid;
    gap: 20px;
    grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));
}

@media (min-width: 1150px) {
    .categories__list:has(.categories__item:nth-child(3n+3)) {
        grid-template-columns: 2fr 1fr 1fr 2fr;
    }

    .categories__list:has(.categories__item:nth-child(3n+3)) .categories__item:nth-child(3n+2) {
        grid-column: span 2;
    }

    .categories__list:has(.categories__item:nth-child(3n+3)) .categories__item:nth-last-child(1),
    .categories__list:has(.categories__item:nth-child(3n+3)) .categories__item:nth-last-child(2) {
        grid-column: span 2;
    }

    .categories__list:has(.categories__item:nth-child(3n):last-child) {
        grid-template-columns: 1fr 1fr 1fr;
    }

    .categories__list:has(.categories__item:nth-child(3n):last-child) .categories__item {
        grid-column: span 1;
    }

    .categories__list:has(.categories__item:nth-child(2):last-child),
    .categories__list:has(.categories__item:nth-child(4):last-child) {
        grid-template-columns: 1fr 1fr;
    }

    .categories__list:has(.categories__item:nth-child(2):last-child) .categories__item,
    .categories__list:has(.categories__item:nth-child(4):last-child) .categories__item {
        grid-column: span 1;
    }

    .categories__list:has(.categories__item:first-child:last-child) {
        grid-template-columns: 1fr;
    }

    .categories__list:has(.categories__item:first-child:last-child) .categories__item {
        grid-column: span 1;
    }

    .categories__list:has(.categories__item:nth-child(3n+7):last-child) {
        grid-template-columns: 2fr 1fr 1fr 2fr;
    }

    .categories__list:has(.categories__item:nth-child(3n+7):last-child) .categories__item {
        grid-column: span 1;
    }

    .categories__list:has(.categories__item:nth-child(3n+7):last-child) .categories__item:nth-child(3n+2) {
        grid-column: span 2;
    }

    .categories__list:has(.categories__item:nth-child(3n+7):last-child) .categories__item:nth-child(3n+7):last-child {
        grid-column: 1/-1;
    }
}

@media (max-width: 1149px) {
    .categories__list:has(.categories__item:nth-child(2n)) {
        grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));
    }

    .categories__list:has(.categories__item:nth-child(odd):last-child) .categories__item:nth-child(odd):last-child {
        grid-column: 1/-1;
    }

    .categories__list:has(.categories__item:first-child:last-child) {
        grid-template-columns: 1fr;
    }

    .categories__list:has(.categories__item:first-child:last-child) .categories__item {
        grid-column: span 1;
    }
}
Комментариев ещё нет. Оставьте первый!