CSS Grid dla responsywnych kart symulacji

Jedna linia CSS zastępuje osiemnaście linii media queries. grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)) to wzorzec stojący za każdą siatką kart na tej stronie.

Jedna linia, która robi wszystko

Strony indeksujące symulacje wyświetlają dziesiątki kart. Na szerokim monitorze powinny pojawiać się w 4 lub 5 kolumnach; na telefonie w 1 lub 2. Klasyczne podejście wymaga trzech lub czterech punktów przełamania @media. Podejście z CSS Grid wymaga dokładnie tego:

.sim-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 1rem;
}

To wszystko. Żadnych punktów przełamania. Żadnego JavaScriptu. Zmień rozmiar przeglądarki, a siatka przeukłada się automatycznie.

Demo na żywo (przeciągnij róg, aby zmienić rozmiar)

💧 Płyn SPH
☄️ N-ciał
🌌 Galaktyka
🐜 Mrówki
🌀 Lorenz
🧬 Życie
🌊 Ocean
🏔️ Teren

↔ Przeciągnij prawą krawędź ramki demo, aby zobaczyć przeukładanie siatki.

Jak to działa

repeat(auto-fill, …) mówi przeglądarce: „utwórz tyle kolumn, ile się zmieści". minmax(260px, 1fr) oznacza: „każda kolumna ma co najmniej 260px szerokości, ale rośnie równo, aby wypełnić pozostałe miejsce".

Przy szerokości 800px i odstępie 1rem, mieszczą się 2 × 260px + odstęp = ~532px → 3 kolumny prawie się mieszczą → 2 kolumny, każda rosnąca do ~395px. Matematyka rozwiązuje się automatycznie.

auto-fill vs auto-fit

Istnieją dwa słowa kluczowe — różnią się tylko wtedy, gdy elementy nie wypełniają całego wiersza:

Używaj auto-fill, gdy znasz minimalną szerokość karty i nie chcesz, żeby karty rozciągały się zbyt szeroko. Używaj auto-fit, gdy chcesz, żeby karty zawsze wypełniały cały kontener.

Dodanie limitu max-width

/* Zapobiega bardzo szerokim kartom na dużych ekranach */
.sim-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(260px, 100%), 1fr));
  gap: 1rem;
  max-width: 1400px;
  margin-inline: auto;
}

/* Albo ogranicz szerokość karty bezpośrednio: */
.sim-card {
  max-width: 380px;
}

Sama karta

Wzorzec karty używany tutaj: poświata obramowania przy hover, miniatura z aspect-ratio, transformacja skali oraz padding, który mieści tekst bez przepełnienia:

.sim-card {
  background: var(--color-surface-2);
  border: 1px solid var(--color-border);
  border-radius: 14px;
  overflow: hidden;
  text-decoration: none;
  color: var(--color-text);
  transition: border-color 0.15s ease, transform 0.15s ease;
}

.sim-card:hover {
  border-color: var(--color-accent);
  transform: translateY(-2px);
}

.sim-card-thumb {
  aspect-ratio: 16 / 9;
  background: var(--color-surface);
  overflow: hidden;
}

.sim-card-thumb img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}

.sim-card-body {
  padding: 0.9rem 1rem;
}

.sim-card-title {
  font-size: var(--text-sm);
  font-weight: 700;
  margin-bottom: 0.25rem;
}

Uwaga dot. dostępności: Uczyń całą kartę linkiem (<a> opakowującym całą zawartość), a nie przyciskiem. Czytniki ekranu ogłaszają go jako link, a użytkownicy klawiatury mogą naturalnie przejść do niego tabulatorem. Unikaj pointer-events: none na wewnętrznych elementach — to psuje zaznaczanie tekstu.