Haz que tus componentes respondan a su contenedor en lugar de al viewport, y estructura tus hojas de estilos con anidamiento nativo.
Abrir esta lección en KodokonLas media queries miden el viewport: una tarjeta mostrada tanto en una barra lateral estrecha como en una cuadrícula principal no puede adaptarse correctamente con ellas, porque el mismo ancho de pantalla corresponde a dos contextos distintos. Las container queries resuelven este desacoplamiento: el componente consulta el tamaño de su contenedor. Requisito previo: designar explícitamente un contenedor con container-type (inline-size para medir solo el eje horizontal, el caso común), opcionalmente nombrado mediante container-name.
.sidebar {
container-type: inline-size;
container-name: sidebar;
}
@container sidebar (min-width: 400px) {
.widget {
display: grid;
grid-template-columns: 80px 1fr;
gap: 12px;
}
}Las unidades de contenedor completan el panorama: 1cqi equivale al 1% del tamaño inline del contenedor consultado (también existen cqw, cqh, cqb, cqmin, cqmax). Combinadas con clamp(), producen tipografía fluida por componente: la misma tarjeta obtiene un título proporcionado a su columna, esté donde esté colocada.
.card-slot {
container-type: inline-size;
}
.card h2 {
font-size: clamp(1rem, 5cqi, 1.75rem);
}
@container (max-width: 300px) {
.card .meta {
display: none;
}
}El anidamiento nativo por fin trae el anidamiento sin preprocesador. El selector & hace referencia al contexto padre; las media queries y @container se anidan directamente dentro de una regla. Una diferencia crucial respecto a Sass: el padre anidado se trata como si estuviera envuelto en :is(). Dos consecuencias: la especificidad del padre es la del más fuerte de sus selectores si es una lista, y & .child no realiza concatenación de cadenas - el patrón &__element de Sass para generar nombres BEM no existe de forma nativa.
.menu {
display: flex;
gap: 8px;
& > li {
list-style: none;
&:hover {
background: #f3f4f6;
}
}
@media (min-width: 768px) {
gap: 16px;
}
}5cqi?