Dunfey · Hotel WWDC as data, est. 1983
Front desk everything
Years
Topics

2026 DesignSafari & Web

WWDC26 · 10 min · Design / Safari & Web

Learn CSS Grid Lanes

Build adaptive web layouts that embrace content of all shapes and sizes. Explore how Grid Lanes lets you arrange differently-shaped elements into clean, flexible designs with simple CSS. And find out how flow-tolerance helps you refine accessibility while keeping your layouts malleable.

Watch at developer.apple.com ↗

Transcript all transcripts

Chapters

Code shown on screen · 17 snippets

Create a Grid Lanes Container javascript · at 3:58 ↗
.container {
	display: grid-lanes;
}
Create a Grid Lanes Container javascript · at 4:02 ↗
.container {
	display: grid-lanes;
  grid-template-columns: repeat(3, 1fr);
}
Create a Grid Lanes Container javascript · at 4:26 ↗
.container {
	display: grid-lanes;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
}
Implement a Brick Variation javascript · at 4:33 ↗
.container {
	display: grid-lanes;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
}
Implement a Brick Variation javascript · at 4:36 ↗
.container {
	display: grid-lanes;
  grid-template-rows: repeat(3, 1fr);
  gap: 10px;
}
Experiment with different layouts javascript · at 4:58 ↗
.container {
	display: grid-lanes;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 10px;
}
Experiment with different layouts javascript · at 5:02 ↗
.container {
	display: grid-lanes;
  grid-template-columns: 1fr 2fr 1fr;
  gap: 10px;
}
Experiment with different layouts javascript · at 5:10 ↗
.container {
	display: grid-lanes;
  grid-template-columns:
    repeat(auto-fill,
      minmax(200px, 1fr));
  gap: 10px;
}
Experiment with different layouts javascript · at 5:24 ↗
.container {
	display: grid-lanes;
  grid-template-columns:
    repeat(auto-fill,
      minmax(8rem, 1fr)
      minmax(14rem, 2fr);
  gap: 10px;
}
Control Individual Items javascript · at 5:45 ↗
.container {
	display: grid-lanes;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 10px;
}
Control Individual Items javascript · at 5:59 ↗
.container {
	display: grid-lanes;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 10px;
}

.item {
  grid-column: span 2;
}
Control Individual Items javascript · at 6:07 ↗
.container {
	display: grid-lanes;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 10px;
}

.item {
  grid-column: 2 / span 2;
}
Integrate Subgrid javascript · at 6:22 ↗
.container {
	display: grid-lanes;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 10px;
}

.item {
  grid-column: span 2;
}
Integrate Subgrid javascript · at 6:34 ↗
.container {
	display: grid-lanes;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 10px;
}

.item {
  display: grid-lanes;
  grid-template-columns: subgrid;
  grid-column: span 2;
}
Integrate Subgrid javascript · at 6:48 ↗
.container {
	display: grid-lanes;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 10px;
}

.item {
  display: grid;
  grid-template-columns: subgrid;
  grid-column: span 2;
}
Improve item positioning javascript · at 8:37 ↗
.container {
	display: grid-lanes;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
  flow-tolerance: normal;
}
Improve item positioning javascript · at 8:41 ↗
.container {
	display: grid-lanes;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
  flow-tolerance: 2.1em;
}

Resources