Я не знаю ни о каких медиа-запросах ... это странное требование, поскольку они поддерживаются на 97,97% согласно caniuse . Но вы можете сделать все это с помощью одного правила медиа-запроса или пропустить его и иметь 3 действительно сжатых поля в строке.
Для вашего родительского элемента вам нужны только два правила:
.cont {
display: flex;
flex-wrap: wrap;
}
И Для детей вам понадобится немного математики: поле (сколько вам нужно расстояния между карточками) плюс горизонтальное отступление внутри карточек, умноженное на 2, - это конечное значение изгиба в вашем большем экране медиазапроса, например:
.child {
margin: .5rem; /* This value plus the left to right padding * 2 == final flex value */
padding: 2rem .25rem; /* Padding given for example on inner element */
flex: 100%;
display: flex;
}
@media (min-width: 640px) { /* Or whatever breakpoint makes your content not look janky */
.child {
flex: 0 1 calc(33.33333% - 1.5rem); /* (.5 + .25)*2 = 1.5rem this is the final flex value */
}
}
Почему это работает хорошо: на небольших экранах (по умолчанию) настройка flex: 100%
эквивалентна установке flex-based на 100% (так как мы предоставляем единицу), которая заполняет ширину, когда мы хотим сложить элементы.
На больших экранах основание flex (последнее число в свойстве flex) явно задается как 1/3 ширины экрана минус сумма горизонтального поля и отступа элемента внутри контейнера, который вызывает каждое один занимает 1/3 экрана, в то время как flex-grow (первое число в свойстве flex) устанавливается в 0, в противном случае строки с менее чем тремя будут увеличиваться для распределения доступного пространства.
Вот рабочий пример Я сделал с Svelte на основе вашего изображения, но концепция CSS идентична, поэтому не должно иметь значения, какую платформу вы используете.