Tailwind CSS v4 cheat sheet (con ricerca)

Un cheat sheet di Tailwind CSS v4 con ricerca: scrivi una classe o una parola semplice e vedi il CSS esatto che v4 genera, dai multipli di var(--spacing) ai token di colore OKLCH. Copre anche i token @theme, i breakpoint, le container query, box flex e grid dal vivo, la palette di colori completa, la dark mode e le rinomine da v3 a v4.

Questo cheat sheet copre Tailwind CSS v4 (v4.3 è la versione attuale al momento della stesura, ottobre 2026). Per ogni classe mostra il CSS che v4 scrive davvero, e questo conta perché v4 ha cambiato il modo in cui vengono prodotti i valori: la spaziatura è un multiplo di un'unica variabile --spacing, i colori sono variabili --color-* definite in OKLCH, e dimensioni come raggio, ombra e testo arrivano da variabili del tema con un nome. Scrivi nella casella per filtrare. La ricerca funziona sui nomi delle classi, sul CSS che generano e su parole semplici come "center", "gradient" o "sticky".

Tutte le 243 visibili

ClasseCSS generato in v4
Layout e 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;
Allineamento e 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;
Spaziatura
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
Dimensioni
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);
Tipografia
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;
Colore e sfondi
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;
Bordi, raggi, ring e outline
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;
Effetti e filtri
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%);
Transizioni, animazioni e trasformazioni
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);
Interattività
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;
Varianti di stato e 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;

Note per leggere la tabella: calc(var(--spacing) * 4) vale 1rem perché il valore predefinito di --spacing è 0.25rem. Cambia quell'unica variabile in @theme e ogni padding, margin, gap, larghezza e altezza che usa la scala numerica cambia di conseguenza. Dove il CSS generato è lungo (gradienti, ring, transizioni), la tabella ne mostra una versione semplificata e lo segnala.

Come v4 trasforma una classe in un valore

In v4 ci sono quattro modi per dare un valore a una utility, e sapere quale stai usando spiega la maggior parte delle sorprese:

Le frazioni come w-1/2 diventano calc(1/2 * 100%), e un suffisso di opacità come bg-black/50 diventa un color-mix() con transparent, così funziona con qualsiasi formato di colore.

Token @theme (il sostituto di tailwind.config.js in v4)

In v4 configuri il design system nel CSS. Le variabili dichiarate dentro @theme diventano sia proprietà CSS personalizzate su :root sia la fonte delle classi utility. Il prefisso della variabile decide quali utility 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 */
}
NamespaceAlimentaEsempio
--color-*tutte le utility di colore (bg, text, border, fill, ring, colore dell'ombra...)bg-red-500
--spacingpadding, margin, gap, width, height, inset, translatepx-4
--font-*famiglia del fontfont-sans
--text-*dimensione del font (più --text-*--line-height facoltativo)text-xl
--font-weight-*peso del fontfont-bold
--tracking-* / --leading-*spaziatura delle lettere / interlineatracking-wide
--breakpoint-*varianti responsivesm:*
--container-*varianti delle container query e max-w-*@sm:*, max-w-md
--radius-*raggio del bordorounded-sm
--shadow-*, --inset-shadow-*, --drop-shadow-*ombreshadow-md
--blur-*blur e backdrop blurblur-md
--ease-* / --animate-*funzioni di timing / animazioniease-out, animate-spin
--perspective-* / --aspect-*prospettiva 3D / aspect ratioperspective-near, aspect-video

Per eliminare un intero namespace predefinito, impostalo prima a initial, per esempio --color-*: initial;, poi dichiara solo i tuoi colori. Se hai ancora una configurazione JavaScript, v4 può caricarla con @config "./tailwind.config.js";, ma le opzioni corePlugins, safelist e separator non sono supportate.

Breakpoint

I breakpoint sono mobile first: una classe senza prefisso vale a ogni larghezza, e md:flex vale da 48rem in su. v4 li scrive con la sintassi a intervallo width >= ....

PrefissoLarghezza minimaCSSAl di sotto (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:

Combinali per colpire un intervallo: md:max-xl:flex vale solo da 48rem fino a 80rem (escluso). Per un breakpoint singolo usa min-[900px]:grid o max-[600px]:hidden. Aggiungi o modifica i breakpoint con --breakpoint-* in @theme, e tienili tutti in rem così vengono ordinati correttamente.

Container query

Le container query sono integrate in v4 (in v3 serviva un plugin). Segna un genitore con @container, poi dai stile ai figli con @sm:, @md: e così via. Reagiscono alla larghezza del genitore e non a quella della finestra, ed è quello che ti serve per una card che compare sia in una sidebar sia in una colonna principale larga.

<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>
VarianteLarghezza del containerVarianteLarghezza del container
@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)

Ognuna viene compilata in @container (width >= ...). Usa @max-md: per "al di sotto", combina @sm:@max-md: per un intervallo, dai un nome ai container con @container/sidebar e indirizzali con @md/sidebar:, e usa dimensioni arbitrarie come @min-[475px]:. Nota che le dimensioni dei container non hanno gli stessi numeri dei breakpoint: @md è 28rem mentre md: è 48rem.

Riferimento rapido di flex e grid

Scegli un layout qui sotto e guarda i box spostarsi. La stringa di classi si aggiorna mentre fai clic, così puoi copiarla direttamente nel tuo markup.

Gli schemi che userai più spesso:

flex items-center justify-between: riga della navbar
flex items-center justify-center (o grid place-items-center): centrare un elemento
grid grid-cols-3 gap-2 con col-span-2
shrink-0 sull'elemento fisso, flex-1 sull'elemento che riempie lo spazio
ObiettivoClassi
Griglia di card responsive senza breakpointgrid grid-cols-[repeat(auto-fill,minmax(16rem,1fr))] gap-6
Sidebar più contenutogrid md:grid-cols-[16rem_1fr] gap-8
Footer fissato in fondo a una pagina cortaflex min-h-dvh flex-col sul wrapper, flex-1 su main
Testo che si tronca dentro una riga flexmin-w-0 sul figlio flex, truncate sul testo
In colonna su mobile, in riga su desktopflex flex-col md:flex-row gap-4
Spingere l'ultimo elemento a destrams-auto (o ml-auto) su quell'elemento

Palette di colori predefinita (OKLCH), fai clic per copiare

v4 definisce la palette predefinita in OKLCH, che può mostrare colori più saturi sugli schermi a gamut ampio. Ogni campione qui sotto è dipinto con il valore esatto del file del tema di Tailwind; fai clic su uno per copiarne il valore oklch(). Le tonalità vanno da 50 a 950. Le palette segnate con * (mauve, olive, mist e taupe) sono state aggiunte in v4.2.0, quindi mancano nelle versioni v4 precedenti. Nero e bianco sono #000 e #fff.

Tutte le 26 visibili
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*

Usali come bg-sky-500, text-sky-500/80 oppure, nel tuo CSS, var(--color-sky-500). Per controllare se un abbinamento è leggibile, passalo nel verificatore di contrasto dei colori, e per una scala personalizzata nello stesso formato prova il generatore di palette di colori Tailwind.

Dark mode in v4

Per impostazione predefinita dark: segue il sistema operativo tramite @media (prefers-color-scheme: dark). Per guidarlo invece con una classe o un attributo (per un interruttore manuale), sovrascrivi la variante nel tuo CSS con @custom-variant. Non esiste più la chiave di configurazione 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 interruttore manuale, imposta la classe prima che la pagina venga disegnata (un piccolo script inline in <head> che legge la scelta salvata), così i visitatori non vedono un lampo del tema sbagliato. Una terza opzione è fare a meno delle classi dark:: definisci token semantici come --color-surface in @theme e scambiane i valori sotto .dark, così una sola classe come bg-surface funziona in entrambi i temi.

Da v3 a v4: classi rinominate e modificate

Provengono dalla guida ufficiale all'aggiornamento. Le rinomine contano di più perché i vecchi nomi esistono ancora e producono in silenzio un risultato diverso (più piccolo).

v3v4Perché
shadow-smshadow-xsLa scala è scesa di un gradino così ogni dimensione ha un nome
shadowshadow-smStesso slittamento
drop-shadow-sm / drop-shadowdrop-shadow-xs / drop-shadow-smStesso slittamento
blur-sm / blurblur-xs / blur-smStesso slittamento (anche backdrop-blur-*)
rounded-smrounded-xsStesso slittamento
roundedrounded-smStesso slittamento
outline-noneoutline-hiddenIn v4 outline-none ora imposta davvero outline-style: none
ring (3px, blue-500)ring-3 più un colorering da solo ora è 1px in currentColor
outline outline-2outline-2Le utility di larghezza ora impostano da sole uno stile solid
bg-opacity-50 (e text-, border-, ring-, divide-, placeholder-opacity)bg-black/50Rimosso; usa il modificatore con la barra
flex-shrink-0 / flex-growshrink-0 / growAlias rimossi
overflow-ellipsistext-ellipsisAlias rimosso
decoration-slice / decoration-clonebox-decoration-slice / box-decoration-cloneAlias rimossi
bg-[--brand]bg-(--brand)Nuova forma abbreviata per le variabili CSS
!bg-red-500bg-red-500!Il punto esclamativo va alla fine (la vecchia forma è deprecata)
first:*:pt-0*:first:pt-0Le varianti combinate ora si leggono da sinistra a destra
tw-flex (prefisso)tw:flexI prefissi sembrano una variante e vanno per primi

Cambi di comportamento senza rinomina, che sorprendono durante gli aggiornamenti:

Lo strumento ufficiale npx @tailwindcss/upgrade gestisce automaticamente la maggior parte delle rinomine. Eseguilo su un branch pulito e controlla il diff, perché non può sapere quali classi shadow volevi mantenere identiche nell'aspetto.

Stampare questo cheat sheet

Questa pagina ha stili di stampa: le caselle di ricerca e i pulsanti sono nascosti, le tabelle passano a un font più piccolo e la griglia dei colori tiene uniti i campioni. Nella maggior parte dei browser, attiva "Grafica di sfondo" nella finestra di stampa, altrimenti i campioni vengono stampati vuoti. Se prima hai filtrato la tabella, vengono stampate solo le righe visibili, un modo rapido per ottenere un foglio di una pagina con le sole utility che usi.

La stessa variante print: funziona nei tuoi progetti: print:hidden sulla navigazione, print:text-black sul testo chiaro e print:break-inside-avoid sulle card mantengono leggibili le pagine stampate.

Domande frequenti

Dov'è tailwind.config.js in Tailwind v4?

v4 si configura nel CSS. Importi Tailwind con @import "tailwindcss" e dichiari i design token dentro un blocco @theme, come --color-brand-500 o --breakpoint-3xl. Una configurazione JavaScript si può ancora caricare con la direttiva @config, ma le opzioni corePlugins, safelist e separator non sono supportate.

Quali sono i breakpoint predefiniti di Tailwind v4?

sm è 40rem (640px), md è 48rem (768px), lg è 64rem (1024px), xl è 80rem (1280px) e 2xl è 96rem (1536px). Sono mobile first, quindi md:flex vale da 48rem in su. Usa max-md: per gli stili sotto un breakpoint e combinali, come md:max-xl:, per un intervallo.

Perché le mie ombre e i miei angoli arrotondati sembrano più piccoli dopo il passaggio a v4?

Le scale di ombra, raggio e blur sono scese di un gradino. shadow-sm di v3 è shadow-xs in v4, shadow di v3 è shadow-sm in v4, rounded-sm di v3 è rounded-xs in v4 e rounded di v3 è rounded-sm in v4. I vecchi nomi vengono ancora compilati, quindi non compare nessun errore; producono semplicemente la dimensione inferiore.

Come faccio a usare una classe invece dell'impostazione di sistema per la dark mode in v4?

Aggiungi @custom-variant dark (&:where(.dark, .dark *)); al tuo CSS. Le utility dark: si applicano allora ogni volta che un antenato ha la classe dark. Se preferisci un attributo data, usa invece [data-theme=dark] nel selettore.

Tailwind v4 ha bisogno di un plugin per le container query?

No. Le container query sono integrate. Metti @container sul genitore e usa varianti come @sm:, @md: e @max-md: sui suoi figli. Le dimensioni dei container partono da @3xs (16rem) e sono diverse dai breakpoint della pagina, per esempio @md è 28rem.

In cosa viene compilato p-4 in Tailwind v4?

padding: calc(var(--spacing) * 4). Con il valore predefinito di --spacing, 0.25rem, fa 1rem (16px con la dimensione del font predefinita). Qualsiasi numero intero funziona sulla scala di spaziatura senza configurazione, e cambiando --spacing si riscalano tutti insieme.

Display

Elementi

Direzione

A capo

Asse principale

Colonne

Asse trasversale

Gap

Copiato

Copia le classi

Stampa questo cheat sheet

Inizia gratis · Nessuna carta di credito richiesta

Correlati: Guide

Prodotto

Per chi è

Funzionalità

Risorse

Azienda

Mappa del sito