Chuleta de Tailwind CSS v4 (con buscador)

Una chuleta de Tailwind CSS v4 con buscador: escribe cualquier clase o palabra y verás el CSS exacto que genera v4, desde múltiplos de var(--spacing) hasta tokens de color en OKLCH. También cubre los tokens de @theme, los breakpoints, las container queries, cajas flex y grid en vivo, la paleta de colores completa, el modo oscuro y los cambios de nombre de v3 a v4.

Esta chuleta cubre Tailwind CSS v4 (v4.3 es la versión actual en el momento de escribir esto, octubre de 2026). Para cada clase muestra el CSS que v4 escribe de verdad, algo importante porque v4 cambió la forma de producir los valores: el espaciado es un múltiplo de una única variable --spacing , los colores son variables --color-* definidas en OKLCH, y tamaños como el radio, la sombra y el texto salen de variables de tema con nombre. Escribe en la caja para filtrar. La búsqueda funciona con nombres de clase, con el CSS que generan y con palabras sencillas como "center", "gradient" o "sticky".

Se muestran las 243

ClaseCSS que genera en v4
Layout y display
blockdisplay: block;
inline-blockdisplay: inline-block;
inlinedisplay: inline;
flexdisplay: flex;
inline-flexdisplay: inline-flex;
griddisplay: grid;
inline-griddisplay: inline-grid;
contentsdisplay: contents;
hiddendisplay: none;
containerwidth: 100%; plus max-width: var(--breakpoint-sm) at sm, and so on for each breakpoint
box-borderbox-sizing: border-box;
box-contentbox-sizing: content-box;
staticposition: static;
relativeposition: relative;
absoluteposition: absolute;
fixedposition: fixed;
stickyposition: sticky;
inset-0inset: calc(var(--spacing) * 0);
inset-x-0inset-inline: calc(var(--spacing) * 0);
top-4top: calc(var(--spacing) * 4); /* 1rem */
-top-2top: calc(var(--spacing) * -2);
left-1/2left: calc(1/2 * 100%);
z-10z-index: 10;
z-50z-index: 50;
isolateisolation: isolate;
overflow-hiddenoverflow: hidden;
overflow-autooverflow: auto;
overflow-x-autooverflow-x: auto;
aspect-videoaspect-ratio: var(--aspect-video); /* 16 / 9 */
aspect-squareaspect-ratio: 1 / 1;
object-coverobject-fit: cover;
object-containobject-fit: contain;
visiblevisibility: visible;
invisiblevisibility: hidden;
sr-onlyposition: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border-width: 0;
Flexbox
flex-rowflex-direction: row;
flex-colflex-direction: column;
flex-row-reverseflex-direction: row-reverse;
flex-wrapflex-wrap: wrap;
flex-nowrapflex-wrap: nowrap;
flex-1flex: 1;
flex-autoflex: auto;
flex-initialflex: 0 auto;
flex-noneflex: none;
growflex-grow: 1;
grow-0flex-grow: 0;
shrink-0flex-shrink: 0;
basis-64flex-basis: calc(var(--spacing) * 64);
basis-1/3flex-basis: calc(1/3 * 100%);
order-2order: 2;
order-firstorder: -9999;
order-lastorder: 9999;
Alineación y gap
justify-startjustify-content: flex-start;
justify-centerjustify-content: center;
justify-endjustify-content: flex-end;
justify-betweenjustify-content: space-between;
justify-aroundjustify-content: space-around;
justify-evenlyjustify-content: space-evenly;
items-startalign-items: flex-start;
items-centeralign-items: center;
items-endalign-items: flex-end;
items-baselinealign-items: baseline;
items-stretchalign-items: stretch;
self-centeralign-self: center;
self-endalign-self: flex-end;
content-centeralign-content: center;
place-items-centerplace-items: center;
place-content-centerplace-content: center;
justify-items-centerjustify-items: center;
gap-4gap: calc(var(--spacing) * 4); /* 1rem */
gap-x-6column-gap: calc(var(--spacing) * 6);
gap-y-2row-gap: calc(var(--spacing) * 2);
Grid
grid-cols-3grid-template-columns: repeat(3, minmax(0, 1fr));
grid-cols-12grid-template-columns: repeat(12, minmax(0, 1fr));
grid-cols-[200px_1fr]grid-template-columns: 200px 1fr;
grid-cols-subgridgrid-template-columns: subgrid;
grid-rows-3grid-template-rows: repeat(3, minmax(0, 1fr));
col-span-2grid-column: span 2 / span 2;
col-span-fullgrid-column: 1 / -1;
col-start-2grid-column-start: 2;
row-span-2grid-row: span 2 / span 2;
grid-flow-colgrid-auto-flow: column;
grid-flow-densegrid-auto-flow: dense;
auto-rows-frgrid-auto-rows: minmax(0, 1fr);
auto-cols-maxgrid-auto-columns: max-content;
Espaciado
p-4padding: calc(var(--spacing) * 4); /* 1rem */
p-pxpadding: 1px;
p-[13px]padding: 13px;
p-(--card-pad)padding: var(--card-pad);
px-6padding-inline: calc(var(--spacing) * 6);
py-2padding-block: calc(var(--spacing) * 2);
pt-8padding-top: calc(var(--spacing) * 8);
ps-4padding-inline-start: calc(var(--spacing) * 4);
m-0margin: calc(var(--spacing) * 0);
mx-automargin-inline: auto;
mt-6margin-top: calc(var(--spacing) * 6);
-mt-2margin-top: calc(var(--spacing) * -2);
ms-automargin-inline-start: auto;
space-y-4margin-block-end: calc(var(--spacing) * 4) on every child except the last (selector: > :not(:last-child))
space-x-2margin-inline-end: calc(var(--spacing) * 2) on every child except the last
Tamaño
w-64width: calc(var(--spacing) * 64); /* 16rem */
w-fullwidth: 100%;
w-1/2width: calc(1/2 * 100%);
w-screenwidth: 100vw;
w-fitwidth: fit-content;
w-autowidth: auto;
size-10width: calc(var(--spacing) * 10); height: calc(var(--spacing) * 10);
h-12height: calc(var(--spacing) * 12);
h-dvhheight: 100dvh;
h-screenheight: 100vh;
min-h-screenmin-height: 100vh;
min-w-0min-width: calc(var(--spacing) * 0);
max-w-mdmax-width: var(--container-md); /* 28rem */
max-w-7xlmax-width: var(--container-7xl); /* 80rem */
max-w-prosemax-width: 65ch;
max-w-screen-lgmax-width: var(--breakpoint-lg);
Tipografía
text-xsfont-size: var(--text-xs); /* 0.75rem */ line-height: var(--tw-leading, var(--text-xs--line-height));
text-smfont-size: var(--text-sm); /* 0.875rem */ line-height: var(--tw-leading, var(--text-sm--line-height));
text-basefont-size: var(--text-base); /* 1rem */ line-height: var(--tw-leading, var(--text-base--line-height));
text-xlfont-size: var(--text-xl); /* 1.25rem */ line-height: var(--tw-leading, var(--text-xl--line-height));
text-4xlfont-size: var(--text-4xl); /* 2.25rem */ line-height: var(--tw-leading, var(--text-4xl--line-height));
text-sm/6font-size: var(--text-sm); line-height: calc(var(--spacing) * 6);
font-sansfont-family: var(--font-sans);
font-monofont-family: var(--font-mono);
font-mediumfont-weight: var(--font-weight-medium); /* 500 */
font-semiboldfont-weight: var(--font-weight-semibold); /* 600 */
font-boldfont-weight: var(--font-weight-bold); /* 700 */
leading-tightline-height: var(--leading-tight); /* 1.25 */
leading-6line-height: calc(var(--spacing) * 6);
tracking-tightletter-spacing: var(--tracking-tight); /* -0.025em */
tracking-wideletter-spacing: var(--tracking-wide);
text-lefttext-align: left;
text-centertext-align: center;
text-righttext-align: right;
uppercasetext-transform: uppercase;
capitalizetext-transform: capitalize;
italicfont-style: italic;
underlinetext-decoration-line: underline;
no-underlinetext-decoration-line: none;
underline-offset-4text-underline-offset: 4px;
decoration-2text-decoration-thickness: 2px;
truncateoverflow: hidden; text-overflow: ellipsis; white-space: nowrap;
line-clamp-3overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3;
text-balancetext-wrap: balance;
text-prettytext-wrap: pretty;
whitespace-nowrapwhite-space: nowrap;
wrap-break-wordoverflow-wrap: break-word; /* added in v4.1 */
tabular-numsfont-variant-numeric: tabular-nums;
antialiased-webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
Color y fondos
text-blue-600color: var(--color-blue-600); /* oklch(54.6% 0.245 262.881) */
bg-whitebackground-color: var(--color-white); /* #fff */
bg-slate-900background-color: var(--color-slate-900);
bg-black/50background-color: color-mix(in oklab, var(--color-black) 50%, transparent);
bg-[#4f98fb]background-color: #4f98fb;
bg-(--brand)background-color: var(--brand);
text-currentcolor: currentColor;
bg-transparentbackground-color: transparent;
border-gray-200border-color: var(--color-gray-200);
fill-currentfill: currentColor;
accent-blue-600accent-color: var(--color-blue-600);
caret-pink-500caret-color: var(--color-pink-500);
bg-linear-to-rbackground-image: linear-gradient(to right in oklab, var(--tw-gradient-stops)); /* simplified */
from-blue-500--tw-gradient-from: var(--color-blue-500); /* first stop */
to-violet-500--tw-gradient-to: var(--color-violet-500);
bg-radialbackground-image: radial-gradient(...stops); /* new in v4 */
bg-coverbackground-size: cover;
bg-centerbackground-position: center;
bg-no-repeatbackground-repeat: no-repeat;
bg-clip-textbackground-clip: text;
Bordes, radios, rings y outlines
borderborder-style: var(--tw-border-style); border-width: 1px; /* color is currentColor in v4 */
border-2border-style: var(--tw-border-style); border-width: 2px;
border-tborder-top-style: var(--tw-border-style); border-top-width: 1px;
border-dashed--tw-border-style: dashed; border-style: dashed;
rounded-xsborder-radius: var(--radius-xs); /* 0.125rem */
rounded-smborder-radius: var(--radius-sm); /* 0.25rem */
rounded-mdborder-radius: var(--radius-md); /* 0.375rem */
rounded-lgborder-radius: var(--radius-lg); /* 0.5rem */
rounded-2xlborder-radius: var(--radius-2xl); /* 1rem */
rounded-fullborder-radius: calc(infinity * 1px);
rounded-t-lgborder-top-left-radius: var(--radius-lg); border-top-right-radius: var(--radius-lg);
divide-yborder-bottom-width: 1px on every child except the last (selector: > :not(:last-child))
ring-1box-shadow: 0 0 0 1px currentColor; /* simplified; v4 default ring width is 1px */
ring-3box-shadow: 0 0 0 3px currentColor; /* the old v3 ring */
ring-blue-500--tw-ring-color: var(--color-blue-500);
ring-offset-2--tw-ring-offset-width: 2px;
outlineoutline-style: var(--tw-outline-style); outline-width: 1px;
outline-2outline-style: var(--tw-outline-style); outline-width: 2px;
outline-offset-2outline-offset: 2px;
outline-hiddenoutline: 2px solid transparent; outline-offset: 2px; /* still visible in forced colors */
outline-none--tw-outline-style: none; outline-style: none;
Efectos y filtros
shadow-2xsbox-shadow: 0 1px rgb(0 0 0 / 0.05);
shadow-xsbox-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
shadow-smbox-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
shadow-mdbox-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
shadow-lgbox-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
shadow-2xlbox-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
shadow-nonebox-shadow: 0 0 #0000;
inset-shadow-smbox-shadow: inset 0 2px 4px rgb(0 0 0 / 0.05); /* new in v4 */
opacity-50opacity: 50%;
mix-blend-multiplymix-blend-mode: multiply;
blur-smfilter: blur(var(--blur-sm)); /* 8px */
blur-xsfilter: blur(var(--blur-xs)); /* 4px */
backdrop-blur-mdbackdrop-filter: blur(var(--blur-md)); /* 12px, frosted glass */
grayscalefilter: grayscale(100%);
Transiciones, animación y transformaciones
transitiontransition-property: color, background-color, border-color, outline-color, opacity, box-shadow, transform, translate, scale, rotate, filter and more; transition-duration: 150ms;
transition-colorstransition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke and gradient stops; 150ms
duration-200transition-duration: 200ms;
ease-outtransition-timing-function: var(--ease-out); /* cubic-bezier(0, 0, 0.2, 1) */
animate-spinanimation: var(--animate-spin); /* spin 1s linear infinite */
animate-pulseanimation: var(--animate-pulse);
motion-reduce:animate-none@media (prefers-reduced-motion: reduce) { animation: none; }
scale-95--tw-scale-x: 95%; --tw-scale-y: 95%; scale: var(--tw-scale-x) var(--tw-scale-y);
rotate-45rotate: 45deg;
translate-x-4--tw-translate-x: calc(var(--spacing) * 4); translate: var(--tw-translate-x) var(--tw-translate-y);
-translate-y-1/2--tw-translate-y: calc(calc(1/2 * 100%) * -1); translate: var(--tw-translate-x) var(--tw-translate-y);
Interactividad
cursor-pointercursor: pointer; /* v4 buttons default to cursor: default */
cursor-not-allowedcursor: not-allowed;
pointer-events-nonepointer-events: none;
select-noneuser-select: none;
appearance-noneappearance: none;
scroll-smoothscroll-behavior: smooth;
snap-xscroll-snap-type: x var(--tw-scroll-snap-strictness);
snap-startscroll-snap-align: start;
scroll-mt-20scroll-margin-top: calc(var(--spacing) * 20);
resize-yresize: vertical;
touch-manipulationtouch-action: manipulation;
Variantes de estado y de media
hover:bg-blue-700@media (hover: hover) { &:hover { background-color: var(--color-blue-700); } }
focus-visible:outline-2&:focus-visible { outline-width: 2px; ... }
active:scale-95&:active { scale: 95%; }
disabled:opacity-50&:disabled { opacity: 50%; }
aria-disabled:opacity-50&[aria-disabled="true"] { opacity: 50%; }
group-hover:underline.group:hover & { text-decoration-line: underline; } (inside @media (hover: hover))
peer-checked:bg-blue-600.peer:checked ~ & { background-color: var(--color-blue-600); }
md:flex@media (width >= 48rem) { display: flex; }
max-md:hidden@media (width < 48rem) { display: none; }
@md:flex-row@container (width >= 28rem) { flex-direction: row; }
dark:bg-slate-900@media (prefers-color-scheme: dark) { background-color: var(--color-slate-900); }
print:hidden@media print { display: none; }
motion-safe:animate-spin@media (prefers-reduced-motion: no-preference) { ... }
*:p-2:where(& > *) { padding: calc(var(--spacing) * 2); }
not-last:mb-2&:not(:last-child) { margin-bottom: ... }
supports-[display:grid]:grid@supports (display: grid) { display: grid; }
bg-red-500!background-color: var(--color-red-500) !important;

Cómo leer la tabla: calc(var(--spacing) * 4) equivale a 1rem porque el valor por defecto de --spacing es 0.25rem. Cambia esa única variable en @theme y todos los padding, margin, gap, width y height que usan la escala numérica cambian con ella. Cuando el CSS generado es largo (degradados, rings, transiciones), la tabla muestra una versión simplificada y lo indica.

Cómo convierte v4 una clase en un valor

En v4 hay cuatro formas de dar un valor a una utilidad, y saber cuál estás usando explica la mayoría de las sorpresas:

Las fracciones como w-1/2 se convierten en calc(1/2 * 100%), y un sufijo de opacidad como bg-black/50 se convierte en un color-mix() con transparente, así que funciona con cualquier formato de color.

Tokens de @theme (lo que sustituye a tailwind.config.js en v4)

En v4 el sistema de diseño se configura en CSS. Las variables declaradas dentro de @theme se convierten a la vez en propiedades personalizadas de CSS en :root y en el origen de las clases de utilidad. El prefijo de la variable decide a qué utilidades alimenta:

@import "tailwindcss";

@theme {
  --font-display: "Satoshi", sans-serif;   /* font-display */
  --color-brand-500: oklch(65% 0.17 255);  /* bg-brand-500, text-brand-500 ... */
  --breakpoint-3xl: 120rem;                /* 3xl: variant */
  --spacing: 0.25rem;                      /* p-4 = 1rem */
  --radius-card: 0.875rem;                 /* rounded-card */
}
Espacio de nombresAlimenta aEjemplo
--color-*todas las utilidades de color (bg, text, border, fill, ring, color de sombra...)bg-red-500
--spacingpadding, margin, gap, width, height, inset, translatepx-4
--font-*familia tipográficafont-sans
--text-*tamaño de fuente (más el opcional --text-*--line-height)text-xl
--font-weight-*peso de fuentefont-bold
--tracking-* / --leading-*espaciado entre letras / interlineadotracking-wide
--breakpoint-*variantes responsivesm:*
--container-*variantes de container query y max-w-*@sm:*, max-w-md
--radius-*radio del borderounded-sm
--shadow-*, --inset-shadow-*, --drop-shadow-*sombrasshadow-md
--blur-*desenfoque y desenfoque de fondoblur-md
--ease-* / --animate-*funciones de temporización / animacionesease-out, animate-spin
--perspective-* / --aspect-*perspectiva 3D / relación de aspectoperspective-near, aspect-video

Para quitar un espacio de nombres completo por defecto, ponlo primero en initial , por ejemplo --color-*: initial;, y después declara solo tus propios colores. Si todavía tienes una configuración en JavaScript, v4 puede cargarla con @config "./tailwind.config.js";, pero las opciones corePlugins, safelist y separator no son compatibles.

Breakpoints

Los breakpoints son mobile first: una clase sin prefijo se aplica en cualquier ancho, y md:flex se aplica a partir de 48rem. v4 los escribe con la sintaxis de rango width >= ....

PrefijoAncho mínimoCSSPor debajo (max-*)
sm:40rem (640px)@media (width >= 40rem)max-sm: = @media (width < 40rem)
md:48rem (768px)@media (width >= 48rem)max-md:
lg:64rem (1024px)@media (width >= 64rem)max-lg:
xl:80rem (1280px)@media (width >= 80rem)max-xl:
2xl:96rem (1536px)@media (width >= 96rem)max-2xl:

Combínalos para apuntar a un rango: md:max-xl:flex solo se aplica desde 48rem hasta 80rem (sin incluirlo). Para un breakpoint puntual usa min-[900px]:grid o max-[600px]:hidden. Añade o cambia breakpoints con --breakpoint-* en @theme, y mantenlos todos en rem para que se ordenen correctamente.

Container queries

Las container queries vienen integradas en v4 (en v3 necesitaban un plugin). Marca un elemento padre con @containery después da estilo a los hijos con @sm:, @md: y similares. Reaccionan al ancho del padre en lugar del de la ventana, que es justo lo que necesitas para una tarjeta que aparece tanto en una barra lateral como en una columna principal ancha.

<div class="@container">
  <article class="flex flex-col @md:flex-row gap-4">
    <img class="w-full @md:w-48 rounded-lg" src="..." alt="">
    <div>...</div>
  </article>
</div>
VarianteAncho del contenedorVarianteAncho del contenedor
@3xs16rem (256px)@2xl42rem (672px)
@2xs18rem (288px)@3xl48rem (768px)
@xs20rem (320px)@4xl56rem (896px)
@sm24rem (384px)@5xl64rem (1024px)
@md28rem (448px)@6xl72rem (1152px)
@lg32rem (512px)@7xl80rem (1280px)
@xl36rem (576px)

Cada una se compila a @container (width >= ...). Usa @max-md: para "por debajo", combina @sm:@max-md: para un rango, pon nombre a los contenedores con @container/sidebar y apúntalos con @md/sidebar:, y usa tamaños arbitrarios como @min-[475px]:. Ojo: los tamaños de contenedor no coinciden con los de los breakpoints: @md es 28rem mientras que md: es 48rem.

Referencia rápida de flex y grid

Elige un layout aquí abajo y mira cómo se mueven las cajas. La cadena de clases se actualiza al hacer clic, así que puedes copiarla directamente en tu marcado.

Los patrones que más vas a usar:

flex items-center justify-between: fila de barra de navegación
flex items-center justify-center (o grid place-items-center): centrar un elemento
grid grid-cols-3 gap-2 con col-span-2
shrink-0 en el elemento fijo, flex-1 en el elemento que ocupa el resto
ObjetivoClases
Cuadrícula de tarjetas responsive sin breakpointsgrid grid-cols-[repeat(auto-fill,minmax(16rem,1fr))] gap-6
Barra lateral más contenidogrid md:grid-cols-[16rem_1fr] gap-8
Footer fijado al fondo de una página cortaflex min-h-dvh flex-col en el contenedor, flex-1 en main
Texto que se trunca dentro de una fila flexmin-w-0 en el hijo flex, truncate en el texto
Apilado en móvil, en fila en escritorioflex flex-col md:flex-row gap-4
Empujar el último elemento a la derechams-auto (o ml-auto) en ese elemento

Paleta de colores por defecto (OKLCH), haz clic para copiar

v4 define la paleta por defecto en OKLCH, que puede mostrar colores más saturados en pantallas de gama amplia. Cada muestra de abajo está pintada con el valor exacto del archivo de tema de Tailwind; haz clic en una para copiar su valor oklch() . Los tonos van de 50 a 950. Las paletas marcadas con * (mauve, olive, mist y taupe) se añadieron en v4.2.0, así que no existen en versiones anteriores de v4. El negro y el blanco son #000 y #fff.

Se muestran las 26
50100200300400500600700800900950
red
orange
amber
yellow
lime
green
emerald
teal
cyan
sky
blue
indigo
violet
purple
fuchsia
pink
rose
slate
gray
zinc
neutral
stone
mauve*
olive*
mist*
taupe*

Úsalos como bg-sky-500, text-sky-500/80 o, en tu propio CSS, var(--color-sky-500). Para comprobar si una combinación es legible, pásala por el comprobador de contraste de color, y para crear una escala propia en el mismo formato prueba el generador de paletas de colores de Tailwind.

Modo oscuro en v4

Por defecto, dark: sigue al sistema operativo mediante @media (prefers-color-scheme: dark). Para controlarlo desde una clase o un atributo (para un interruptor manual), sobrescribe la variante en tu CSS con @custom-variant. Ya no existe la clave de configuración darkMode .

/* Class strategy: <html class="dark"> */
@custom-variant dark (&:where(.dark, .dark *));

/* Or a data attribute: <html data-theme="dark"> */
@custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *));
<div class="bg-white text-slate-900 dark:bg-slate-900 dark:text-slate-100">...</div>

Con un interruptor manual, aplica la clase antes de que se pinte la página (un pequeño script en línea en <head> que lea la opción guardada) para que los visitantes no vean un destello del tema equivocado. Una tercera opción es prescindir por completo de las clases dark: : define tokens semánticos como --color-surface en @theme y cambia sus valores bajo .dark, para que una sola clase como bg-surface funcione en ambos temas.

De v3 a v4: clases renombradas y modificadas

Proceden de la guía oficial de actualización. Los cambios de nombre son lo más importante, porque los nombres antiguos siguen existiendo y producen sin avisar un resultado distinto (más pequeño).

v3v4Motivo
shadow-smshadow-xsLa escala bajó un paso para que todos los tamaños tengan nombre
shadowshadow-smMismo desplazamiento
drop-shadow-sm / drop-shadowdrop-shadow-xs / drop-shadow-smMismo desplazamiento
blur-sm / blurblur-xs / blur-smMismo desplazamiento (también backdrop-blur-*)
rounded-smrounded-xsMismo desplazamiento
roundedrounded-smMismo desplazamiento
outline-noneoutline-hiddenv4 outline-none ahora sí establece outline-style: none
ring (3px, blue-500)ring-3 más un colorUn ring sin más ahora es de 1px en currentColor
outline outline-2outline-2Las utilidades de ancho ahora aplican por sí mismas un estilo sólido
bg-opacity-50 (y text-, border-, ring-, divide-, placeholder-opacity)bg-black/50Eliminado; usa el modificador con barra
flex-shrink-0 / flex-growshrink-0 / growAlias eliminados
overflow-ellipsistext-ellipsisAlias eliminado
decoration-slice / decoration-clonebox-decoration-slice / box-decoration-cloneAlias eliminados
bg-[--brand]bg-(--brand)Nueva forma abreviada para variables CSS
!bg-red-500bg-red-500!El important va al final (la forma antigua está obsoleta)
first:*:pt-0*:first:pt-0Las variantes combinadas ahora se leen de izquierda a derecha
tw-flex (prefijo)tw:flexLos prefijos parecen una variante y van primero

Cambios de comportamiento sin cambio de nombre, que pillan a la gente al actualizar:

La herramienta oficial npx @tailwindcss/upgrade resuelve automáticamente la mayoría de los cambios de nombre. Ejecútala en una rama limpia y revisa el diff, porque no puede saber qué clases shadow querías que siguieran viéndose igual.

Imprimir esta chuleta

Esta página tiene estilos de impresión: las cajas de búsqueda y los botones se ocultan, las tablas usan una fuente más pequeña y la cuadrícula de colores mantiene juntas sus muestras. En la mayoría de los navegadores, activa "Gráficos de fondo" en el diálogo de impresión o las muestras saldrán en blanco. Si antes filtraste la tabla, solo se imprimen las filas visibles, una forma rápida de hacer una hoja de una página solo con las utilidades que usas.

La misma variante print: funciona en tus propios proyectos: print:hidden en la navegación, print:text-black en el texto claro y print:break-inside-avoid en las tarjetas mantienen legibles las páginas impresas.

Preguntas frecuentes

¿Dónde está tailwind.config.js en Tailwind v4?

v4 se configura en CSS. Importas Tailwind con @import "tailwindcss" y declaras los tokens de diseño dentro de un bloque @theme, como --color-brand-500 o --breakpoint-3xl. Todavía se puede cargar una configuración en JavaScript con la directiva @config, pero las opciones corePlugins, safelist y separator no son compatibles.

¿Cuáles son los breakpoints por defecto de Tailwind v4?

sm es 40rem (640px), md es 48rem (768px), lg es 64rem (1024px), xl es 80rem (1280px) y 2xl es 96rem (1536px). Son mobile first, así que md:flex se aplica desde 48rem en adelante. Usa max-md: para estilos por debajo de un breakpoint y combínalos, como md:max-xl:, para un rango.

¿Por qué mis sombras y esquinas redondeadas se ven más pequeñas tras actualizar a v4?

Las escalas de sombra, radio y desenfoque bajaron un paso. shadow-sm de v3 es shadow-xs en v4, shadow de v3 es shadow-sm en v4, rounded-sm de v3 es rounded-xs en v4 y rounded de v3 es rounded-sm en v4. Los nombres antiguos siguen compilando, así que no hay ningún error; simplemente producen el tamaño inmediatamente inferior.

¿Cómo hago que el modo oscuro use una clase en lugar del ajuste del sistema en v4?

Añade @custom-variant dark (&:where(.dark, .dark *)); a tu CSS. Las utilidades dark: se aplicarán siempre que un ancestro tenga la clase dark. Si prefieres un atributo data, usa [data-theme=dark] en el selector.

¿Necesita Tailwind v4 un plugin para las container queries?

No. Las container queries vienen integradas. Pon @container en el padre y usa variantes como @sm:, @md: y @max-md: en sus hijos. Los tamaños de contenedor empiezan en @3xs (16rem) y son distintos de los breakpoints de página; por ejemplo, @md es 28rem.

¿A qué compila p-4 en Tailwind v4?

padding: calc(var(--spacing) * 4). Con el --spacing por defecto de 0.25rem, eso es 1rem (16px con el tamaño de fuente por defecto). Cualquier número entero funciona en la escala de espaciado sin configuración, y al cambiar --spacing se reescalan todos a la vez.

Display

Items

Dirección

Wrap

Eje principal

Columnas

Eje transversal

Gap

Copiado

Copiar clases

Imprimir esta chuleta

Empieza gratis · Sin tarjeta de crédito

Relacionado: Guías

Producto

Para quién es

Funciones

Recursos

Empresa

Mapa del sitio