Patrón
Ritmo visual
Una tarjeta breve abre la composición.
Crea layouts tipo masonry con CSS nativo: cambia entre waterfall y brick, combina patrones de lanes, controla la tolerancia del flujo y prueba una mejora progresiva en navegadores sin soporte.
Usa Tab para comprobar que el foco conserva el orden del DOM aunque cambie la colocación visual.
<ul class="lanes">
<li id="lane-1" class="lane-card">
<article>
<p class="eyebrow">Patrón</p>
<h2>Ritmo visual</h2>
<p>Una tarjeta breve abre la composición.</p>
<a href="#lane-1" aria-label="Abrir tarjeta: Ritmo visual">01</a>
</article>
</li>
<li id="lane-2" class="lane-card">
<article>
<p class="eyebrow">CSS</p>
<h2>Sin JavaScript</h2>
<p>Los elementos se reparten entre lanes y se acercan al inicio del contenedor de forma nativa.</p>
<a href="#lane-2" aria-label="Abrir tarjeta: Sin JavaScript">02</a>
</article>
</li>
<li id="lane-3" class="lane-card">
<article>
<p class="eyebrow">Layout</p>
<h2>Tracks flexibles</h2>
<p>Combina repeat(), minmax() y unidades fr.</p>
<a href="#lane-3" aria-label="Abrir tarjeta: Tracks flexibles">03</a>
</article>
</li>
<li id="lane-4" class="lane-card">
<article>
<p class="eyebrow">Orden</p>
<h2>El DOM permanece intacto</h2>
<p>La lectura y el foco siguen el orden de origen aunque cambie la colocación visual.</p>
<a href="#lane-4" aria-label="Abrir tarjeta: El DOM permanece intacto">04</a>
</article>
</li>
<li id="lane-5" class="lane-card">
<article>
<p class="eyebrow">Detalle</p>
<h2>Tolerancia</h2>
<p>flow-tolerance decide cuándo dos posiciones se consideran equivalentes.</p>
<a href="#lane-5" aria-label="Abrir tarjeta: Tolerancia">05</a>
</article>
</li>
<li id="lane-6" class="lane-card">
<article>
<p class="eyebrow">Responsive</p>
<h2>Sin media queries</h2>
<p>auto-fit puede añadir o retirar lanes según el espacio disponible.</p>
<a href="#lane-6" aria-label="Abrir tarjeta: Sin media queries">06</a>
</article>
</li>
<li id="lane-7" class="lane-card">
<article>
<p class="eyebrow">Ejes</p>
<h2>Waterfall o brick</h2>
<p>Define columnas o filas para cambiar la dirección.</p>
<a href="#lane-7" aria-label="Abrir tarjeta: Waterfall o brick">07</a>
</article>
</li>
<li id="lane-8" class="lane-card">
<article>
<p class="eyebrow">Contenido</p>
<h2>Alturas distintas</h2>
<p>Textos, imágenes y componentes pueden conservar su tamaño intrínseco.</p>
<a href="#lane-8" aria-label="Abrir tarjeta: Alturas distintas">08</a>
</article>
</li>
<li id="lane-9" class="lane-card">
<article>
<p class="eyebrow">Grid</p>
<h2>Spans y colocación</h2>
<p>Cada ítem puede ocupar varias lanes o empezar en una línea concreta.</p>
<a href="#lane-9" aria-label="Abrir tarjeta: Spans y colocación">09</a>
</article>
</li>
</ul><ul class="columns-4 [column-gap:16px] supports-[display:grid-lanes]:columns-auto supports-[display:grid-lanes]:[display:grid-lanes] supports-[display:grid-lanes]:[grid-template-columns:repeat(auto-fit,_minmax(min(12rem,_100%),_1fr))] supports-[display:grid-lanes]:gap-y-[16px] supports-[display:grid-lanes]:gap-x-[16px]">
<li id="lane-1" class="inline-block w-full align-top mb-[16px] supports-[display:grid-lanes]:block supports-[display:grid-lanes]:mb-0 break-inside-avoid rounded-2xl border border-slate-300 bg-slate-50 p-4 text-slate-900">
<article>
<p class="eyebrow">Patrón</p>
<h2>Ritmo visual</h2>
<p>Una tarjeta breve abre la composición.</p>
<a href="#lane-1" aria-label="Abrir tarjeta: Ritmo visual">01</a>
</article>
</li>
<li id="lane-2" class="inline-block w-full align-top mb-[16px] supports-[display:grid-lanes]:block supports-[display:grid-lanes]:mb-0 break-inside-avoid rounded-2xl border border-slate-300 bg-slate-50 p-4 text-slate-900">
<article>
<p class="eyebrow">CSS</p>
<h2>Sin JavaScript</h2>
<p>Los elementos se reparten entre lanes y se acercan al inicio del contenedor de forma nativa.</p>
<a href="#lane-2" aria-label="Abrir tarjeta: Sin JavaScript">02</a>
</article>
</li>
<li id="lane-3" class="inline-block w-full align-top mb-[16px] supports-[display:grid-lanes]:block supports-[display:grid-lanes]:mb-0 break-inside-avoid rounded-2xl border border-slate-300 bg-slate-50 p-4 text-slate-900">
<article>
<p class="eyebrow">Layout</p>
<h2>Tracks flexibles</h2>
<p>Combina repeat(), minmax() y unidades fr.</p>
<a href="#lane-3" aria-label="Abrir tarjeta: Tracks flexibles">03</a>
</article>
</li>
<li id="lane-4" class="inline-block w-full align-top mb-[16px] supports-[display:grid-lanes]:block supports-[display:grid-lanes]:mb-0 break-inside-avoid rounded-2xl border border-slate-300 bg-slate-50 p-4 text-slate-900">
<article>
<p class="eyebrow">Orden</p>
<h2>El DOM permanece intacto</h2>
<p>La lectura y el foco siguen el orden de origen aunque cambie la colocación visual.</p>
<a href="#lane-4" aria-label="Abrir tarjeta: El DOM permanece intacto">04</a>
</article>
</li>
<li id="lane-5" class="inline-block w-full align-top mb-[16px] supports-[display:grid-lanes]:block supports-[display:grid-lanes]:mb-0 break-inside-avoid rounded-2xl border border-slate-300 bg-slate-50 p-4 text-slate-900">
<article>
<p class="eyebrow">Detalle</p>
<h2>Tolerancia</h2>
<p>flow-tolerance decide cuándo dos posiciones se consideran equivalentes.</p>
<a href="#lane-5" aria-label="Abrir tarjeta: Tolerancia">05</a>
</article>
</li>
<li id="lane-6" class="inline-block w-full align-top mb-[16px] supports-[display:grid-lanes]:block supports-[display:grid-lanes]:mb-0 break-inside-avoid rounded-2xl border border-slate-300 bg-slate-50 p-4 text-slate-900">
<article>
<p class="eyebrow">Responsive</p>
<h2>Sin media queries</h2>
<p>auto-fit puede añadir o retirar lanes según el espacio disponible.</p>
<a href="#lane-6" aria-label="Abrir tarjeta: Sin media queries">06</a>
</article>
</li>
<li id="lane-7" class="inline-block w-full align-top mb-[16px] supports-[display:grid-lanes]:block supports-[display:grid-lanes]:mb-0 break-inside-avoid rounded-2xl border border-slate-300 bg-slate-50 p-4 text-slate-900">
<article>
<p class="eyebrow">Ejes</p>
<h2>Waterfall o brick</h2>
<p>Define columnas o filas para cambiar la dirección.</p>
<a href="#lane-7" aria-label="Abrir tarjeta: Waterfall o brick">07</a>
</article>
</li>
<li id="lane-8" class="inline-block w-full align-top mb-[16px] supports-[display:grid-lanes]:block supports-[display:grid-lanes]:mb-0 break-inside-avoid rounded-2xl border border-slate-300 bg-slate-50 p-4 text-slate-900">
<article>
<p class="eyebrow">Contenido</p>
<h2>Alturas distintas</h2>
<p>Textos, imágenes y componentes pueden conservar su tamaño intrínseco.</p>
<a href="#lane-8" aria-label="Abrir tarjeta: Alturas distintas">08</a>
</article>
</li>
<li id="lane-9" class="inline-block w-full align-top mb-[16px] supports-[display:grid-lanes]:block supports-[display:grid-lanes]:mb-0 break-inside-avoid rounded-2xl border border-slate-300 bg-slate-50 p-4 text-slate-900">
<article>
<p class="eyebrow">Grid</p>
<h2>Spans y colocación</h2>
<p>Cada ítem puede ocupar varias lanes o empezar en una línea concreta.</p>
<a href="#lane-9" aria-label="Abrir tarjeta: Spans y colocación">09</a>
</article>
</li>
</ul>@supports (display: grid-lanes) {
.lanes {
display: grid-lanes;
grid-template-columns: repeat(auto-fit, minmax(min(12rem, 100%), 1fr));
gap: 16px;
}
}
.lanes {
margin: 0;
padding: 0;
list-style: none;
}
.lane-card {
padding: 1rem;
border: 1px solid #cbd5e1;
border-radius: 1rem;
background: #f8fafc;
color: #0f172a;
}
@supports not (display: grid-lanes) {
.lanes {
columns: 4;
column-gap: 16px;
}
.lane-card {
display: inline-block;
inline-size: 100%;
break-inside: avoid;
margin-block-end: 16px;
vertical-align: top;
}
}.lanes {
@supports (display: grid-lanes) {
display: grid-lanes;
grid-template-columns: repeat(auto-fit, minmax(min(12rem, 100%), 1fr));
gap: 16px;
}
margin: 0;
padding: 0;
list-style: none;
> .lane-card {
padding: 1rem;
border: 1px solid #cbd5e1;
border-radius: 1rem;
background: #f8fafc;
color: #0f172a;
}
@supports not (display: grid-lanes) {
columns: 4;
column-gap: 16px;
> .lane-card {
display: inline-block;
inline-size: 100%;
break-inside: avoid;
margin-block-end: 16px;
vertical-align: top;
}
}
}