CSS Grid Lanes: masonry nativo no Safari
O layout masonry, aquela grade escalonada no estilo Pinterest em que itens de qualquer tamanho fluem para o espaço disponível, já está em produção há mais de uma década apoiado em bibliotecas JavaScript, floats e gambiarras de Flexbox que quase funcionam até que não funcionam mais.1 Na WWDC 2026, a equipe do Safari da Apple deu à web um modo de layout nativo para isso: o CSS Grid Lanes. O padrão masonry é antigo. O que é novo é um tipo de display CSS de primeira classe que o produz em três linhas, mais um controle de flow-tolerance que resolve o crônico problema de ordem de tabulação e acessibilidade do masonry. O Grid Lanes está disponível hoje no Safari 26.4 e atrás de uma flag em outros navegadores.1
TL;DR
- O Grid Lanes é um novo modo de layout CSS que fica entre Grid e Flexbox: ele estrutura um eixo e deixa o outro livre, distribuindo o conteúdo por várias lanes em um layout escalonado e densamente compactado que preserva as proporções naturais de cada item.1
- Tudo se resume a três linhas:
display: grid-lanes,grid-template-columnscom trilhas emfregap. Troquegrid-template-columnsporgrid-template-rowspara transformar uma cascata em uma parede de tijolos. Você escolhe uma direção, não as duas.1 - O dimensionamento de trilhas vem do Grid: proporções
frdesiguais,auto-fillcomminmax()para contagens de colunas responsivas e padrões repetidos de colunas estreitas/largas.1 - Os itens usam propriedades do Grid que você já conhece:
grid-column: span 2para alargar, posicionamento explícito de colunas egrid-template-columns: subgridpara dobrar o conteúdo de um card dentro do layout pai. Você controla o posicionamento das colunas, não das linhas; o Grid Lanes decide a linha.1 - O
flow-toleranceé o diferencial decisivo. O posicionamento puro pela coluna mais curta pode fazer a ordem de tabulação ziguezaguear contra a ordem visual, prejudicando a acessibilidade. Oflow-tolerance(padrão1em) afrouxa a regra da coluna mais curta para que o posicionamento siga mais de perto a ordem de leitura.1 - A disponibilidade é honesta: o Safari 26.4 já o entrega hoje, outros navegadores o mantêm atrás de uma flag. O Grid Lanes ainda não está em GA entre navegadores.1
Onde o Grid Lanes fica entre Grid e Flexbox
Brandon, da equipe do Safari, constrói um layout Grid Lanes do zero, começando em 3:39.
Todo modo de layout responde às mesmas duas perguntas: para onde vão os itens e quanto espaço eles recebem.1 Flexbox e Grid respondem de formas diferentes, e o Grid Lanes fica no meio.
O Flexbox dá a você um eixo e uma única lane de itens fluindo ao longo dele; quando os itens quebram, eles continuam fluindo na direção escolhida, linha ou coluna.1 O Grid dá dois eixos, colunas e linhas, e posiciona os itens em células na interseção dessas trilhas. O problema aparece quando os itens têm proporções diferentes: você acaba com grandes áreas vazias onde itens mais curtos não conseguem preencher suas células.1 Para imagens, isso deixa três opções ruins. Estique cada imagem para preencher sua célula e você a distorce; dê zoom para preencher o espaço e a imagem transborda seu contêiner; recorte-a e você corre o risco de perder informações importantes.1
O Grid Lanes resolve essa tensão. Como a sessão coloca: “Ele fica entre Grid e Flex. Em vez de estruturar em duas dimensões como o Grid, ele estrutura apenas uma e deixa a outra livre. Mas, diferentemente do Flex, onde o conteúdo flui em uma única lane e quebra para baixo na página, o Grid Lanes distribui o conteúdo por várias lanes.”1 Os itens são posicionados um a um, e cada um cai na coluna que o deixa mais próximo do topo, e é por isso que os itens anteriores ficam mais altos e os posteriores preenchem abaixo.1 O layout funciona com qualquer conteúdo, não só imagens: blocos de texto quebram para caber em sua coluna e o navegador dimensiona as alturas, e um título pode se estender por várias colunas para se destacar.1
Masonry nativo em três linhas de CSS
A construção começa com um novo tipo de display e então define as trilhas da mesma forma que o Grid faz:
.gallery {
display: grid-lanes;
grid-template-columns: 1fr 1fr 1fr;
gap: 10px;
}
grid-template-columns define o número de trilhas e a largura de cada uma. A unidade fr (“unidade fracionária”) diz ao navegador para pegar o espaço disponível no contêiner e dividi-lo em frações, então 1fr 1fr 1fr produz três colunas de tamanho igual, e gap adiciona o espaçamento exatamente como faz no Grid.1 Para transformar a cascata em uma parede de tijolos, troque as colunas por linhas: substitua grid-template-columns por grid-template-rows e os itens fluem ao longo em linhas em vez de para baixo em colunas. O único detalhe, nas palavras da sessão: “você escolhe uma direção - não as duas.”1
Essas três linhas dão mais controle do que parecem. As colunas não precisam ser iguais: uma coluna central pode ocupar o dobro do espaço de suas vizinhas. Em vez de fixar você mesmo a contagem de colunas, você pode deixar o navegador decidir, da mesma forma que os layouts Grid responsivos já fazem:
.gallery {
display: grid-lanes;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 10px;
}
auto-fill cria tantas colunas quantas couberem, e minmax() diz que cada uma deve ter pelo menos 200 pixels, mas pode crescer para preencher o espaço.1 Você pode levar a mesma ideia adiante com um padrão repetido de colunas estreitas e largas. O ganho que Brandon ressalta: “o que eu mais amo é o quanto você consegue fazer com só algumas linhas de CSS.”1
Moldando itens individuais com propriedades do Grid que você conhece
O Grid Lanes molda os itens com propriedades que já existem no Grid. Comece a partir de um contêiner grid-lanes com três colunas iguais. Para dar mais espaço a um item, grid-column: span 2 o estica por duas colunas e o resto do layout se ajusta ao redor dele.1 Você também pode posicionar um item com exatidão: defina que ele comece na coluna 2 e se estenda pelas colunas 2 e 3. A restrição é deliberada: “você pode controlar o posicionamento da coluna, mas não da linha. O Grid Lanes decide a linha por você.”1
O subgrid dobra o conteúdo de um componente aninhado dentro do pai. Um card de receita que se estende por duas colunas contém uma imagem e algum texto que, por padrão, não participam do layout Grid Lanes. Adicione display: grid-lanes e grid-template-columns: subgrid ao card, e “seu conteúdo se junta ao layout pai como itens próprios”: a imagem ocupa uma coluna, o texto ocupa a outra, cada um dimensionado conforme seu conteúdo.1 O aninhamento funciona em qualquer direção, uma grade regular dentro de um contêiner Grid Lanes ou o contrário, porque as mesmas ferramentas e a mesma sintaxe se mantêm.1
O controle flow-tolerance: a correção de acessibilidade
Aqui está a parte que faz do Grid Lanes mais do que um masonry mais arrumado. O posicionamento puro pela coluna mais curta fica ótimo na maioria das vezes, mas às vezes não parece exatamente certo, e a razão é a acessibilidade.1
Imagine dois itens em uma linha com quase a mesma altura, onde o item 2 é alguns pixels mais curto que o item 1. A área sob o item 2 fica mais perto do topo, então o navegador posiciona o próximo item ali, e o item 4 preenche a primeira coluna. O resultado visual lê-se da esquerda para a direita na primeira linha e da direita para a esquerda na última. Como a sessão coloca: “A diferença entre a ordem de tabulação e como o conteúdo aparece visualmente vai impactar a acessibilidade para as pessoas e pode criar uma experiência confusa.”1 A ordem de tabulação segue a ordem do código-fonte; o posicionamento visual em ziguezague quebra a correspondência da qual usuários de teclado e leitores de tela dependem.
O flow-tolerance é o controle que afrouxa ou aperta a regra da coluna mais curta.1 Com ele ativado, para cada novo item o navegador pergunta: “a coluna mais alta é menor que a coluna mais curta mais o flow-tolerance?”1 Se a diferença está dentro da tolerância, o item preenche a coluna que mantém o posicionamento alinhado à ordem de leitura; quando a diferença cresce demais para ser ignorada, o item cai na coluna genuinamente mais curta. O valor padrão é 1em:
.gallery {
display: grid-lanes;
grid-template-columns: 1fr 1fr;
flow-tolerance: 1em;
}
A orientação da Apple é “experimentar diferentes valores de flow-tolerance para encontrar o que funciona para o seu conteúdo.”1 O outro lado de dar flexibilidade ao navegador é que o resultado pode ocasionalmente surpreender você, e quando isso acontece, o Web Inspector tem suporte completo para o Grid Lanes: ative a sobreposição e você obtém linhas para colunas e linhas, números de ordem projetados sobre cada item para que você veja exatamente como o posicionamento aconteceu, e os gaps desenhados entre os itens.1
Principais conclusões
Para desenvolvedores frontend:
- Substitua bibliotecas JavaScript de masonry e gambiarras de Flexbox por display: grid-lanes, três trilhas fr e gap; reutilize as ferramentas de dimensionamento de trilhas do Grid (auto-fill, minmax(), fr desiguais) que você já conhece.1
- Recorra a grid-column: span N e ao posicionamento explícito de colunas para destacar itens, e a grid-template-columns: subgrid para dobrar o conteúdo de cards aninhados dentro do layout pai.1
Para equipes atentas à acessibilidade:
- Ajuste o flow-tolerance (padrão 1em) para que o posicionamento visual acompanhe a ordem do código-fonte e a ordem de tabulação, fechando a lacuna que o posicionamento masonry em ziguezague abre para usuários de teclado e leitores de tela.1
- Verifique o posicionamento com a sobreposição Grid Lanes do Web Inspector, que projeta os números de ordem dos itens diretamente sobre o layout.1
Para líderes técnicos planejando a adoção: - Trate o Grid Lanes como disponível-no-Safari-26.4, atrás de flag nos demais, não em GA entre navegadores; entregue-o como um aprimoramento progressivo com um fallback gracioso para navegadores ainda atrás da flag.1
FAQ
O que é o CSS Grid Lanes?
O CSS Grid Lanes é um novo modo de layout que a equipe do Safari apresentou na WWDC 2026 para construir layouts no estilo masonry de forma nativa. Ele fica entre Grid e Flexbox: estrutura um eixo e deixa o outro livre, distribuindo os itens por várias lanes em um layout escalonado e densamente compactado que preserva as proporções naturais de cada item.1
Como eu construo um layout masonry com o Grid Lanes?
Três linhas de CSS: defina display: grid-lanes, defina as trilhas com grid-template-columns usando unidades fr (por exemplo 1fr 1fr 1fr para três colunas iguais) e adicione um gap. Troque grid-template-columns por grid-template-rows para transformar uma cascata vertical em uma parede de tijolos horizontal. Você escolhe uma direção, não as duas.1
O que o flow-tolerance faz?
O flow-tolerance afrouxa ou aperta a regra que posiciona cada item na coluna mais curta. O posicionamento puro pela coluna mais curta pode fazer a ordem visual ziguezaguear para longe da ordem de tabulação, o que prejudica a acessibilidade. Com o flow-tolerance ativado, o navegador verifica se a coluna mais alta é menor que a coluna mais curta mais a tolerância antes de decidir o posicionamento, mantendo os itens alinhados à ordem de leitura até que a diferença de altura cresça demais. O valor padrão é 1em.1
Posso usar o Grid Lanes em produção hoje?
No Safari 26.4 ele já está disponível. Outros navegadores o mantêm atrás de uma flag, então o Grid Lanes ainda não está em GA entre navegadores. Entregue-o como um aprimoramento progressivo com um fallback para navegadores que ainda exigem a flag.1
O Grid Lanes funciona com as propriedades do Grid que eu já conheço?
Sim. O posicionamento no nível do item usa propriedades existentes do Grid: grid-column: span 2 alarga um item, o posicionamento explícito de colunas o posiciona, e grid-template-columns: subgrid dobra o conteúdo de um componente aninhado dentro do layout pai. Você controla o posicionamento das colunas; o Grid Lanes decide a linha.1
Para uma referência prática quando você começar a construir, o WebKit mantém um guia de campo oficial sobre o Grid Lanes em gridlanes.webkit.org. O painel observou que o Grid Lanes compõe com o novo customizable select: um layout masonry funciona dentro de um drop-down ::picker(select).2
O Grid Lanes é o tipo de adição de plataforma que elimina uma dependência em vez de adicionar uma, que é todo o argumento do no-build manifesto e um caminho direto para o tipo de resultado registrado no relato da pontuação perfeita no Lighthouse. Entregar layout nativo e semântico em vez de grades renderizadas por JavaScript também mantém sua marcação legível para máquinas, o argumento defendido em HTML is the format agents want. O hub completo da série é a Apple Ecosystem Series.
Referências
-
Apple, sessão 314 da WWDC 2026, Learn CSS Grid Lanes. Fonte para o modo de layout Grid Lanes e sua posição entre Grid e Flexbox; disponibilidade no Safari 26.4 e atrás de uma flag em outros navegadores; a construção em três linhas (
display: grid-lanes,grid-template-columnscom unidadesfr,gap) e a variante parede-de-tijolos comgrid-template-rowscom a restrição de direção única; dimensionamento de trilhas comfrdesiguais,auto-filleminmax(); moldagem de itens comgrid-column: span 2, posicionamento explícito de colunas (coluna, não linha) egrid-template-columns: subgrid; a regra de posicionamento pela coluna mais curta, o problema de ordem de tabulação/acessibilidade que ela cria, e oflow-tolerance(padrão1em) como o controle que a afrouxa ou aperta; e a sobreposição Grid Lanes do Web Inspector. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Parafraseado a partir de uma gravação transcrita localmente do WWDC 2026 Safari & Web Technologies Group Lab; as legendas oficiais estavam parciais. Apple, WWDC 2026, Safari & Web Technologies Group Lab. Fonte para a observação do painel de que o Grid Lanes compõe com o novo customizable select, então um layout masonry pode rodar dentro de um drop-down
::picker(select). ↩