CSS Grid Lanes: natywny układ masonry w Safari
Układ masonry, czyli pinterestowa siatka z przesunięciami, w której elementy dowolnego rozmiaru wpływają w dostępną przestrzeń, jest stosowany w środowisku produkcyjnym od ponad dekady, w oparciu o biblioteki JavaScript, właściwości float oraz sztuczki na Flexboksie, które niemal działają, dopóki nie zawiodą.1 Na konferencji WWDC 2026 zespół Safari w firmie Apple dał sieci natywny tryb układu właśnie do tego celu: CSS Grid Lanes. Sam wzorzec masonry jest stary. Nowością jest pełnoprawny display type w CSS, który tworzy go w trzech liniach, a do tego regulator flow-tolerance, rozwiązujący przewlekły problem kolejności tabulacji i dostępności w układach masonry. Grid Lanes jest dostępny już dziś w Safari 26.4, a w pozostałych przeglądarkach kryje się za flagą.1
TL;DR
- Grid Lanes to nowy tryb układu w CSS, który plasuje się między Grid a Flexboksem: strukturyzuje tylko jedną oś, drugą pozostawiając swobodną, i rozdziela zawartość na wiele lanes, tworząc ciasno upakowany układ z przesunięciami, który zachowuje naturalne proporcje każdego elementu.1
- Całość mieści się w trzech liniach:
display: grid-lanes,grid-template-columnsze ścieżkami w jednostkachfrorazgap. Zamianagrid-template-columnsnagrid-template-rowsprzekształca wodospad w mur z cegieł. Wybiera się jeden kierunek, nie oba.1 - Wymiarowanie ścieżek przenosi się wprost z Grid: nierówne proporcje
fr,auto-fillzminmax()dla responsywnej liczby kolumn oraz powtarzające się wzory wąskich i szerokich kolumn.1 - Elementy korzystają z właściwości Grid, które są już znane:
grid-column: span 2do poszerzenia, jawne umieszczanie kolumn orazgrid-template-columns: subgrid, który włącza zawartość karty do układu nadrzędnego. Można sterować umieszczeniem kolumn, lecz nie wierszy; to Grid Lanes decyduje o wierszu.1 flow-toleranceto czynnik, który naprawdę odróżnia ten tryb. Umieszczanie wyłącznie według najkrótszej kolumny potrafi sprawić, że kolejność tabulacji zacznie zygzakować względem porządku wizualnego, co szkodzi dostępności.flow-tolerance(wartość domyślna1em) rozluźnia regułę najkrótszej kolumny, aby umieszczanie ściślej podążało za kolejnością czytania.1- Informacja o dostępności jest podana uczciwie: Safari 26.4 zawiera ten tryb już dziś, pozostałe przeglądarki blokują go za flagą. Grid Lanes nie jest jeszcze ogólnie dostępny we wszystkich przeglądarkach.1
Gdzie Grid Lanes plasuje się między Grid a Flexboksem
Brandon z zespołu Safari buduje układ Grid Lanes od zera, zaczynając od 3:39.
Każdy tryb układu odpowiada na te same dwa pytania: gdzie trafiają elementy i ile przestrzeni otrzymują.1 Flexbox i Grid odpowiadają na nie odmiennie, a Grid Lanes ląduje pośrodku.
Flexbox daje jedną oś i pojedynczy lane elementów płynących wzdłuż niej; gdy elementy się zawijają, nadal płyną w wybranym kierunku, w wierszu lub w kolumnie.1 Grid daje dwie osie, kolumny i wiersze, i umieszcza elementy w komórkach na przecięciu tych ścieżek. Problem ujawnia się, gdy elementy mają różne proporcje: powstają duże puste obszary tam, gdzie krótszym elementom nie udaje się wypełnić swoich komórek.1 W przypadku obrazów pozostają wówczas trzy złe opcje. Rozciągnięcie obrazu, by wypełnił komórkę, zniekształca go; powiększenie, by zająć przestrzeń, sprawia, że obraz wylewa się poza kontener; a przycięcie grozi utratą istotnych informacji.1
Grid Lanes rozwiązuje to napięcie. Jak ujmuje to prezentacja: „Plasuje się między Grid a Flex. Zamiast strukturyzować w dwóch wymiarach jak Grid, strukturyzuje tylko jeden, a drugi pozostawia swobodny. W przeciwieństwie jednak do Flex, gdzie zawartość płynie w pojedynczym lane i zawija się w dół strony, Grid Lanes rozdziela zawartość na wiele lanes”.1 Elementy są umieszczane jeden po drugim, a każdy trafia do tej kolumny, która pozostawia go najbliżej góry, dlatego wcześniejsze elementy znajdują się wyżej, a późniejsze wypełniają miejsce poniżej.1 Układ działa z dowolną zawartością, nie tylko z obrazami: bloki tekstu zawijają się do swojej kolumny, a przeglądarka wylicza ich wysokości, nagłówek zaś może rozciągać się na wiele kolumn, aby się wyróżnić.1
Natywny masonry w trzech liniach CSS
Budowa zaczyna się od nowego display type, a następnie definiuje ścieżki dokładnie tak, jak robi to Grid:
.gallery {
display: grid-lanes;
grid-template-columns: 1fr 1fr 1fr;
gap: 10px;
}
grid-template-columns ustala liczbę ścieżek i szerokość każdej z nich. Jednostka fr („fractional unit”) nakazuje przeglądarce wziąć dostępną przestrzeń w kontenerze i podzielić ją na ułamki, dlatego 1fr 1fr 1fr daje trzy kolumny o równej wielkości, a gap dodaje odstęp dokładnie tak samo jak w Grid.1 Aby zamienić wodospad w mur z cegieł, należy zamienić kolumny na wiersze: w miejsce grid-template-columns wstawia się grid-template-rows, a wtedy elementy płyną w poprzek, w wierszach, zamiast schodzić w dół w kolumnach. Jedyne zastrzeżenie, słowami z prezentacji: „wybiera się jeden kierunek — nie oba”.1
Te trzy linie dają więcej kontroli, niż się wydaje. Kolumny nie muszą być równe: środkowa kolumna może zajmować dwukrotnie więcej miejsca niż sąsiednie. Zamiast samodzielnie ustalać liczbę kolumn, można pozwolić zdecydować przeglądarce, tak jak czynią to już responsywne układy Grid:
.gallery {
display: grid-lanes;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 10px;
}
auto-fill tworzy tyle kolumn, ile się zmieści, a minmax() mówi, że każda powinna mieć co najmniej 200 pikseli, lecz może urosnąć, aby wypełnić przestrzeń.1 Tę samą myśl można rozwinąć jeszcze dalej, stosując powtarzający się wzór wąskich i szerokich kolumn. Korzyść, którą podkreśla Brandon: „najbardziej podoba mi się to, jak wiele można osiągnąć zaledwie kilkoma liniami CSS”.1
Kształtowanie poszczególnych elementów znanymi właściwościami Grid
Grid Lanes kształtuje elementy za pomocą właściwości, które już istnieją w Grid. Punktem wyjścia niech będzie kontener grid-lanes z trzema równymi kolumnami. Aby dać elementowi więcej miejsca, grid-column: span 2 rozciąga go na dwie kolumny, a reszta układu dopasowuje się wokół niego.1 Można też umieścić element dokładnie: ustawić, by zaczynał się w kolumnie 2 i rozciągał na kolumny 2 oraz 3. Ograniczenie jest celowe: „można sterować umieszczeniem kolumn, ale nie wierszy. Grid Lanes decyduje o wierszu za użytkownika”.1
subgrid włącza zawartość zagnieżdżonego komponentu do elementu nadrzędnego. Karta przepisu rozciągnięta na dwie kolumny zawiera obraz i nieco tekstu, które domyślnie nie uczestniczą w układzie Grid Lanes. Po dodaniu do karty display: grid-lanes oraz grid-template-columns: subgrid „jej zawartość dołącza do układu nadrzędnego jako samodzielne elementy”: obraz zajmuje jedną kolumnę, tekst drugą, a każde z nich jest dopasowane wymiarem do swojej zawartości.1 Zagnieżdżanie działa w obu kierunkach — zwykła siatka wewnątrz kontenera Grid Lanes lub odwrotnie — ponieważ te same narzędzia i ta sama składnia przenoszą się bez zmian.1
Regulator flow-tolerance: rozwiązanie kwestii dostępności
Oto część, dzięki której Grid Lanes jest czymś więcej niż schludniejszym masonry. Umieszczanie wyłącznie według najkrótszej kolumny wygląda świetnie przez większość czasu, ale czasem coś nie wydaje się do końca w porządku, a powodem jest dostępność.1
Wyobraźmy sobie dwa elementy w jednym rzędzie o niemal identycznej wysokości, gdzie element 2 jest o kilka pikseli niższy od elementu 1. Obszar pod elementem 2 znajduje się bliżej góry, więc przeglądarka umieszcza tam kolejny element, a element 4 wypełnia pierwszą kolumnę. Wizualny efekt czyta się od lewej do prawej w pierwszym rzędzie i od prawej do lewej w ostatnim. Jak ujmuje to prezentacja: „Rozbieżność między kolejnością tabulacji a tym, jak zawartość pojawia się wizualnie, wpłynie na dostępność dla osób korzystających z niej i może stworzyć mylące doświadczenie”.1 Kolejność tabulacji podąża za kolejnością w źródle; zygzakowate rozmieszczenie wizualne zrywa zaś odpowiedniość, na której polegają użytkownicy klawiatury i czytnika ekranu.
flow-tolerance to regulator, który rozluźnia lub zacieśnia regułę najkrótszej kolumny.1 Po jego włączeniu przeglądarka pyta o każdy nowy element: „czy wyższa kolumna jest niższa niż krótsza kolumna powiększona o flow-tolerance?”.1 Jeśli różnica mieści się w tolerancji, element wypełnia tę kolumnę, która utrzymuje rozmieszczenie zgodne z kolejnością czytania; gdy różnica staje się zbyt duża, by ją zignorować, element trafia do faktycznie krótszej kolumny. Wartość domyślna to 1em:
.gallery {
display: grid-lanes;
grid-template-columns: 1fr 1fr;
flow-tolerance: 1em;
}
Apple zaleca, by „wypróbować różne wartości flow-tolerance i znaleźć tę, która sprawdza się dla danej zawartości”.1 Odwrotną stroną dania przeglądarce swobody jest to, że wynik potrafi czasem zaskoczyć, a gdy tak się dzieje, Web Inspector w pełni obsługuje Grid Lanes: po włączeniu nakładki dostępne są linie kolumn i wierszy, numery kolejności rzutowane na każdy element, dzięki czemu widać dokładnie, jak doszło do rozmieszczenia, oraz odstępy narysowane między elementami.1
Najważniejsze wnioski
Dla programistów frontendu:
- Warto zastąpić javascriptowe biblioteki masonry i sztuczki na Flexboksie przez display: grid-lanes, trzy ścieżki fr oraz gap; znane już narzędzia wymiarowania ścieżek z Grid (auto-fill, minmax(), nierówne fr) można wykorzystać ponownie.1
- Aby wyróżnić elementy, należy sięgnąć po grid-column: span N oraz jawne umieszczanie kolumn, a po grid-template-columns: subgrid, aby włączyć zawartość zagnieżdżonych kart do układu nadrzędnego.1
Dla zespołów dbających o dostępność:
- Warto dostroić flow-tolerance (wartość domyślna 1em), aby rozmieszczenie wizualne podążało za kolejnością w źródle i kolejnością tabulacji, zamykając lukę, jaką zygzakowate rozmieszczenie masonry otwiera dla użytkowników klawiatury i czytnika ekranu.1
- Rozmieszczenie warto sprawdzić za pomocą nakładki Grid Lanes w Web Inspectorze, która rzutuje numery kolejności elementów bezpośrednio na układ.1
Dla liderów technicznych planujących wdrożenie: - Grid Lanes należy traktować jako „dostępny w Safari 26.4, za flagą gdzie indziej, niedostępny ogólnie we wszystkich przeglądarkach”; warto wdrożyć go jako progresywne ulepszenie z eleganckim mechanizmem awaryjnym dla przeglądarek wciąż ukrywających go za flagą.1
FAQ
Czym jest CSS Grid Lanes?
CSS Grid Lanes to nowy tryb układu, który zespół Safari przedstawił na WWDC 2026 do natywnego budowania układów w stylu masonry. Plasuje się między Grid a Flexboksem: strukturyzuje jedną oś, drugą pozostawiając swobodną, i rozdziela elementy na wiele lanes, tworząc ciasno upakowany układ z przesunięciami, który zachowuje naturalne proporcje każdego elementu.1
Jak zbudować układ masonry za pomocą Grid Lanes?
Trzy linie CSS: należy ustawić display: grid-lanes, zdefiniować ścieżki przez grid-template-columns w jednostkach fr (na przykład 1fr 1fr 1fr dla trzech równych kolumn) i dodać gap. Zamiana grid-template-columns na grid-template-rows przekształca pionowy wodospad w poziomy mur z cegieł. Wybiera się jeden kierunek, nie oba.1
Co robi flow-tolerance?
flow-tolerance rozluźnia lub zacieśnia regułę, która umieszcza każdy element w najkrótszej kolumnie. Umieszczanie wyłącznie według najkrótszej kolumny potrafi sprawić, że porządek wizualny zacznie zygzakować względem kolejności tabulacji, co szkodzi dostępności. Po włączeniu flow-tolerance przeglądarka, zanim zdecyduje o rozmieszczeniu, sprawdza, czy wyższa kolumna jest niższa niż krótsza kolumna powiększona o tolerancję, i utrzymuje elementy zgodnie z kolejnością czytania, dopóki różnica wysokości nie stanie się zbyt duża. Wartość domyślna to 1em.1
Czy mogę używać Grid Lanes w środowisku produkcyjnym już dziś?
W Safari 26.4 jest dostępny od teraz. Inne przeglądarki blokują go za flagą, więc Grid Lanes nie jest jeszcze ogólnie dostępny we wszystkich przeglądarkach. Warto wdrożyć go jako progresywne ulepszenie z mechanizmem awaryjnym dla przeglądarek, które wciąż wymagają flagi.1
Czy Grid Lanes działa z właściwościami Grid, które już znam?
Tak. Rozmieszczanie na poziomie elementu korzysta z istniejących właściwości Grid: grid-column: span 2 poszerza element, jawne umieszczanie kolumn ustala jego pozycję, a grid-template-columns: subgrid włącza zawartość zagnieżdżonego komponentu do układu nadrzędnego. Można sterować umieszczeniem kolumn; o wierszu decyduje Grid Lanes.1
Gdy zacznie się budowanie i przyda się praktyczne źródło, WebKit utrzymuje oficjalny przewodnik terenowy po Grid Lanes pod adresem gridlanes.webkit.org. Panel zauważył, że Grid Lanes komponuje się z nowym customizable select: układ masonry działa wewnątrz listy rozwijanej ::picker(select).2
Grid Lanes to taki rodzaj rozszerzenia platformy, które usuwa zależność, zamiast ją dodawać, co jest całą tezą manifestu no-build i prostą drogą do rezultatu opisanego w relacji o idealnym wyniku w Lighthouse. Dostarczanie natywnego, semantycznego układu zamiast siatek renderowanych w JavaScript utrzymuje też kod znaczników czytelnym dla maszyn — argument przedstawiony w tekście HTML to format, którego chcą agenci. Pełnym centrum serii jest seria Apple Ecosystem.
Bibliografia
-
Apple, WWDC 2026 session 314, Learn CSS Grid Lanes. Źródło dla trybu układu Grid Lanes i jego pozycji między Grid a Flexboksem; dostępności w Safari 26.4 oraz za flagą w pozostałych przeglądarkach; budowy w trzech liniach (
display: grid-lanes,grid-template-columnsz jednostkamifr,gap) i wariantu „mur z cegieł” zgrid-template-rowswraz z ograniczeniem do jednego kierunku; wymiarowania ścieżek z nierównymfr,auto-filliminmax(); kształtowania elementów przezgrid-column: span 2, jawne umieszczanie kolumn (kolumna, nie wiersz) orazgrid-template-columns: subgrid; reguły umieszczania według najkrótszej kolumny, tworzonego przez nią problemu kolejności tabulacji i dostępności orazflow-tolerance(wartość domyślna1em) jako regulatora, który ją rozluźnia lub zacieśnia; a także nakładki Grid Lanes w Web Inspectorze. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Parafraza na podstawie lokalnie transkrybowanego nagrania z WWDC 2026 Safari & Web Technologies Group Lab; oficjalne napisy były częściowe. Apple, WWDC 2026, Safari & Web Technologies Group Lab. Źródło dla uwagi panelu, że Grid Lanes komponuje się z nowym customizable select, więc układ masonry może działać wewnątrz listy rozwijanej
::picker(select). ↩