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
| Classe | CSS generato in v4 |
|---|---|
| Layout e display | |
block | display: block; |
inline-block | display: inline-block; |
inline | display: inline; |
flex | display: flex; |
inline-flex | display: inline-flex; |
grid | display: grid; |
inline-grid | display: inline-grid; |
contents | display: contents; |
hidden | display: none; |
container | width: 100%; plus max-width: var(--breakpoint-sm) at sm, and so on for each breakpoint |
box-border | box-sizing: border-box; |
box-content | box-sizing: content-box; |
static | position: static; |
relative | position: relative; |
absolute | position: absolute; |
fixed | position: fixed; |
sticky | position: sticky; |
inset-0 | inset: calc(var(--spacing) * 0); |
inset-x-0 | inset-inline: calc(var(--spacing) * 0); |
top-4 | top: calc(var(--spacing) * 4); /* 1rem */ |
-top-2 | top: calc(var(--spacing) * -2); |
left-1/2 | left: calc(1/2 * 100%); |
z-10 | z-index: 10; |
z-50 | z-index: 50; |
isolate | isolation: isolate; |
overflow-hidden | overflow: hidden; |
overflow-auto | overflow: auto; |
overflow-x-auto | overflow-x: auto; |
aspect-video | aspect-ratio: var(--aspect-video); /* 16 / 9 */ |
aspect-square | aspect-ratio: 1 / 1; |
object-cover | object-fit: cover; |
object-contain | object-fit: contain; |
visible | visibility: visible; |
invisible | visibility: hidden; |
sr-only | position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border-width: 0; |
| Flexbox | |
flex-row | flex-direction: row; |
flex-col | flex-direction: column; |
flex-row-reverse | flex-direction: row-reverse; |
flex-wrap | flex-wrap: wrap; |
flex-nowrap | flex-wrap: nowrap; |
flex-1 | flex: 1; |
flex-auto | flex: auto; |
flex-initial | flex: 0 auto; |
flex-none | flex: none; |
grow | flex-grow: 1; |
grow-0 | flex-grow: 0; |
shrink-0 | flex-shrink: 0; |
basis-64 | flex-basis: calc(var(--spacing) * 64); |
basis-1/3 | flex-basis: calc(1/3 * 100%); |
order-2 | order: 2; |
order-first | order: -9999; |
order-last | order: 9999; |
| Allineamento e gap | |
justify-start | justify-content: flex-start; |
justify-center | justify-content: center; |
justify-end | justify-content: flex-end; |
justify-between | justify-content: space-between; |
justify-around | justify-content: space-around; |
justify-evenly | justify-content: space-evenly; |
items-start | align-items: flex-start; |
items-center | align-items: center; |
items-end | align-items: flex-end; |
items-baseline | align-items: baseline; |
items-stretch | align-items: stretch; |
self-center | align-self: center; |
self-end | align-self: flex-end; |
content-center | align-content: center; |
place-items-center | place-items: center; |
place-content-center | place-content: center; |
justify-items-center | justify-items: center; |
gap-4 | gap: calc(var(--spacing) * 4); /* 1rem */ |
gap-x-6 | column-gap: calc(var(--spacing) * 6); |
gap-y-2 | row-gap: calc(var(--spacing) * 2); |
| Grid | |
grid-cols-3 | grid-template-columns: repeat(3, minmax(0, 1fr)); |
grid-cols-12 | grid-template-columns: repeat(12, minmax(0, 1fr)); |
grid-cols-[200px_1fr] | grid-template-columns: 200px 1fr; |
grid-cols-subgrid | grid-template-columns: subgrid; |
grid-rows-3 | grid-template-rows: repeat(3, minmax(0, 1fr)); |
col-span-2 | grid-column: span 2 / span 2; |
col-span-full | grid-column: 1 / -1; |
col-start-2 | grid-column-start: 2; |
row-span-2 | grid-row: span 2 / span 2; |
grid-flow-col | grid-auto-flow: column; |
grid-flow-dense | grid-auto-flow: dense; |
auto-rows-fr | grid-auto-rows: minmax(0, 1fr); |
auto-cols-max | grid-auto-columns: max-content; |
| Spaziatura | |
p-4 | padding: calc(var(--spacing) * 4); /* 1rem */ |
p-px | padding: 1px; |
p-[13px] | padding: 13px; |
p-(--card-pad) | padding: var(--card-pad); |
px-6 | padding-inline: calc(var(--spacing) * 6); |
py-2 | padding-block: calc(var(--spacing) * 2); |
pt-8 | padding-top: calc(var(--spacing) * 8); |
ps-4 | padding-inline-start: calc(var(--spacing) * 4); |
m-0 | margin: calc(var(--spacing) * 0); |
mx-auto | margin-inline: auto; |
mt-6 | margin-top: calc(var(--spacing) * 6); |
-mt-2 | margin-top: calc(var(--spacing) * -2); |
ms-auto | margin-inline-start: auto; |
space-y-4 | margin-block-end: calc(var(--spacing) * 4) on every child except the last (selector: > :not(:last-child)) |
space-x-2 | margin-inline-end: calc(var(--spacing) * 2) on every child except the last |
| Dimensioni | |
w-64 | width: calc(var(--spacing) * 64); /* 16rem */ |
w-full | width: 100%; |
w-1/2 | width: calc(1/2 * 100%); |
w-screen | width: 100vw; |
w-fit | width: fit-content; |
w-auto | width: auto; |
size-10 | width: calc(var(--spacing) * 10); height: calc(var(--spacing) * 10); |
h-12 | height: calc(var(--spacing) * 12); |
h-dvh | height: 100dvh; |
h-screen | height: 100vh; |
min-h-screen | min-height: 100vh; |
min-w-0 | min-width: calc(var(--spacing) * 0); |
max-w-md | max-width: var(--container-md); /* 28rem */ |
max-w-7xl | max-width: var(--container-7xl); /* 80rem */ |
max-w-prose | max-width: 65ch; |
max-w-screen-lg | max-width: var(--breakpoint-lg); |
| Tipografia | |
text-xs | font-size: var(--text-xs); /* 0.75rem */ line-height: var(--tw-leading, var(--text-xs--line-height)); |
text-sm | font-size: var(--text-sm); /* 0.875rem */ line-height: var(--tw-leading, var(--text-sm--line-height)); |
text-base | font-size: var(--text-base); /* 1rem */ line-height: var(--tw-leading, var(--text-base--line-height)); |
text-xl | font-size: var(--text-xl); /* 1.25rem */ line-height: var(--tw-leading, var(--text-xl--line-height)); |
text-4xl | font-size: var(--text-4xl); /* 2.25rem */ line-height: var(--tw-leading, var(--text-4xl--line-height)); |
text-sm/6 | font-size: var(--text-sm); line-height: calc(var(--spacing) * 6); |
font-sans | font-family: var(--font-sans); |
font-mono | font-family: var(--font-mono); |
font-medium | font-weight: var(--font-weight-medium); /* 500 */ |
font-semibold | font-weight: var(--font-weight-semibold); /* 600 */ |
font-bold | font-weight: var(--font-weight-bold); /* 700 */ |
leading-tight | line-height: var(--leading-tight); /* 1.25 */ |
leading-6 | line-height: calc(var(--spacing) * 6); |
tracking-tight | letter-spacing: var(--tracking-tight); /* -0.025em */ |
tracking-wide | letter-spacing: var(--tracking-wide); |
text-left | text-align: left; |
text-center | text-align: center; |
text-right | text-align: right; |
uppercase | text-transform: uppercase; |
capitalize | text-transform: capitalize; |
italic | font-style: italic; |
underline | text-decoration-line: underline; |
no-underline | text-decoration-line: none; |
underline-offset-4 | text-underline-offset: 4px; |
decoration-2 | text-decoration-thickness: 2px; |
truncate | overflow: hidden; text-overflow: ellipsis; white-space: nowrap; |
line-clamp-3 | overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; |
text-balance | text-wrap: balance; |
text-pretty | text-wrap: pretty; |
whitespace-nowrap | white-space: nowrap; |
wrap-break-word | overflow-wrap: break-word; /* added in v4.1 */ |
tabular-nums | font-variant-numeric: tabular-nums; |
antialiased | -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; |
| Colore e sfondi | |
text-blue-600 | color: var(--color-blue-600); /* oklch(54.6% 0.245 262.881) */ |
bg-white | background-color: var(--color-white); /* #fff */ |
bg-slate-900 | background-color: var(--color-slate-900); |
bg-black/50 | background-color: color-mix(in oklab, var(--color-black) 50%, transparent); |
bg-[#4f98fb] | background-color: #4f98fb; |
bg-(--brand) | background-color: var(--brand); |
text-current | color: currentColor; |
bg-transparent | background-color: transparent; |
border-gray-200 | border-color: var(--color-gray-200); |
fill-current | fill: currentColor; |
accent-blue-600 | accent-color: var(--color-blue-600); |
caret-pink-500 | caret-color: var(--color-pink-500); |
bg-linear-to-r | background-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-radial | background-image: radial-gradient(...stops); /* new in v4 */ |
bg-cover | background-size: cover; |
bg-center | background-position: center; |
bg-no-repeat | background-repeat: no-repeat; |
bg-clip-text | background-clip: text; |
| Bordi, raggi, ring e outline | |
border | border-style: var(--tw-border-style); border-width: 1px; /* color is currentColor in v4 */ |
border-2 | border-style: var(--tw-border-style); border-width: 2px; |
border-t | border-top-style: var(--tw-border-style); border-top-width: 1px; |
border-dashed | --tw-border-style: dashed; border-style: dashed; |
rounded-xs | border-radius: var(--radius-xs); /* 0.125rem */ |
rounded-sm | border-radius: var(--radius-sm); /* 0.25rem */ |
rounded-md | border-radius: var(--radius-md); /* 0.375rem */ |
rounded-lg | border-radius: var(--radius-lg); /* 0.5rem */ |
rounded-2xl | border-radius: var(--radius-2xl); /* 1rem */ |
rounded-full | border-radius: calc(infinity * 1px); |
rounded-t-lg | border-top-left-radius: var(--radius-lg); border-top-right-radius: var(--radius-lg); |
divide-y | border-bottom-width: 1px on every child except the last (selector: > :not(:last-child)) |
ring-1 | box-shadow: 0 0 0 1px currentColor; /* simplified; v4 default ring width is 1px */ |
ring-3 | box-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; |
outline | outline-style: var(--tw-outline-style); outline-width: 1px; |
outline-2 | outline-style: var(--tw-outline-style); outline-width: 2px; |
outline-offset-2 | outline-offset: 2px; |
outline-hidden | outline: 2px solid transparent; outline-offset: 2px; /* still visible in forced colors */ |
outline-none | --tw-outline-style: none; outline-style: none; |
| Effetti e filtri | |
shadow-2xs | box-shadow: 0 1px rgb(0 0 0 / 0.05); |
shadow-xs | box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); |
shadow-sm | box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); |
shadow-md | box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); |
shadow-lg | box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); |
shadow-2xl | box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); |
shadow-none | box-shadow: 0 0 #0000; |
inset-shadow-sm | box-shadow: inset 0 2px 4px rgb(0 0 0 / 0.05); /* new in v4 */ |
opacity-50 | opacity: 50%; |
mix-blend-multiply | mix-blend-mode: multiply; |
blur-sm | filter: blur(var(--blur-sm)); /* 8px */ |
blur-xs | filter: blur(var(--blur-xs)); /* 4px */ |
backdrop-blur-md | backdrop-filter: blur(var(--blur-md)); /* 12px, frosted glass */ |
grayscale | filter: grayscale(100%); |
| Transizioni, animazioni e trasformazioni | |
transition | transition-property: color, background-color, border-color, outline-color, opacity, box-shadow, transform, translate, scale, rotate, filter and more; transition-duration: 150ms; |
transition-colors | transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke and gradient stops; 150ms |
duration-200 | transition-duration: 200ms; |
ease-out | transition-timing-function: var(--ease-out); /* cubic-bezier(0, 0, 0.2, 1) */ |
animate-spin | animation: var(--animate-spin); /* spin 1s linear infinite */ |
animate-pulse | animation: 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-45 | rotate: 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-pointer | cursor: pointer; /* v4 buttons default to cursor: default */ |
cursor-not-allowed | cursor: not-allowed; |
pointer-events-none | pointer-events: none; |
select-none | user-select: none; |
appearance-none | appearance: none; |
scroll-smooth | scroll-behavior: smooth; |
snap-x | scroll-snap-type: x var(--tw-scroll-snap-strictness); |
snap-start | scroll-snap-align: start; |
scroll-mt-20 | scroll-margin-top: calc(var(--spacing) * 20); |
resize-y | resize: vertical; |
touch-manipulation | touch-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.
In v4 ci sono quattro modi per dare un valore a una utility, e sapere quale stai usando spiega la maggior parte delle sorprese:
p-4, w-64, gap-3. Funziona qualsiasi numero intero, e anche i quarti come p-2.5, senza configurazione. Il valore è calc(var(--spacing) * n).rounded-lg, shadow-md, text-xl, max-w-md. Ognuno legge una variabile come --radius-lg o --container-md.p-[13px], grid-cols-[200px_1fr], bg-[#4f98fb]. I trattini bassi sostituiscono gli spazi.bg-(--brand) è la forma abbreviata di v4 per bg-[var(--brand)]. In v3 scrivevi bg-[--brand].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.
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 */
}
| Namespace | Alimenta | Esempio |
|---|---|---|
--color-* | tutte le utility di colore (bg, text, border, fill, ring, colore dell'ombra...) | bg-red-500 |
--spacing | padding, margin, gap, width, height, inset, translate | px-4 |
--font-* | famiglia del font | font-sans |
--text-* | dimensione del font (più --text-*--line-height facoltativo) | text-xl |
--font-weight-* | peso del font | font-bold |
--tracking-* / --leading-* | spaziatura delle lettere / interlinea | tracking-wide |
--breakpoint-* | varianti responsive | sm:* |
--container-* | varianti delle container query e max-w-* | @sm:*, max-w-md |
--radius-* | raggio del bordo | rounded-sm |
--shadow-*, --inset-shadow-*, --drop-shadow-* | ombre | shadow-md |
--blur-* | blur e backdrop blur | blur-md |
--ease-* / --animate-* | funzioni di timing / animazioni | ease-out, animate-spin |
--perspective-* / --aspect-* | prospettiva 3D / aspect ratio | perspective-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.
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 >= ....
| Prefisso | Larghezza minima | CSS | Al 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.
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>
| Variante | Larghezza del container | Variante | Larghezza del container |
|---|---|---|---|
@3xs | 16rem (256px) | @2xl | 42rem (672px) |
@2xs | 18rem (288px) | @3xl | 48rem (768px) |
@xs | 20rem (320px) | @4xl | 56rem (896px) |
@sm | 24rem (384px) | @5xl | 64rem (1024px) |
@md | 28rem (448px) | @6xl | 72rem (1152px) |
@lg | 32rem (512px) | @7xl | 80rem (1280px) |
@xl | 36rem (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.
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 navbarflex items-center justify-center (o grid place-items-center): centrare un elementogrid grid-cols-3 gap-2 con col-span-2shrink-0 sull'elemento fisso, flex-1 sull'elemento che riempie lo spazio| Obiettivo | Classi |
|---|---|
| Griglia di card responsive senza breakpoint | grid grid-cols-[repeat(auto-fill,minmax(16rem,1fr))] gap-6 |
| Sidebar più contenuto | grid md:grid-cols-[16rem_1fr] gap-8 |
| Footer fissato in fondo a una pagina corta | flex min-h-dvh flex-col sul wrapper, flex-1 su main |
| Testo che si tronca dentro una riga flex | min-w-0 sul figlio flex, truncate sul testo |
| In colonna su mobile, in riga su desktop | flex flex-col md:flex-row gap-4 |
| Spingere l'ultimo elemento a destra | ms-auto (o ml-auto) su quell'elemento |
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.
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.
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.
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).
| v3 | v4 | Perché |
|---|---|---|
shadow-sm | shadow-xs | La scala è scesa di un gradino così ogni dimensione ha un nome |
shadow | shadow-sm | Stesso slittamento |
drop-shadow-sm / drop-shadow | drop-shadow-xs / drop-shadow-sm | Stesso slittamento |
blur-sm / blur | blur-xs / blur-sm | Stesso slittamento (anche backdrop-blur-*) |
rounded-sm | rounded-xs | Stesso slittamento |
rounded | rounded-sm | Stesso slittamento |
outline-none | outline-hidden | In v4 outline-none ora imposta davvero outline-style: none |
ring (3px, blue-500) | ring-3 più un colore | ring da solo ora è 1px in currentColor |
outline outline-2 | outline-2 | Le utility di larghezza ora impostano da sole uno stile solid |
bg-opacity-50 (e text-, border-, ring-, divide-, placeholder-opacity) | bg-black/50 | Rimosso; usa il modificatore con la barra |
flex-shrink-0 / flex-grow | shrink-0 / grow | Alias rimossi |
overflow-ellipsis | text-ellipsis | Alias rimosso |
decoration-slice / decoration-clone | box-decoration-slice / box-decoration-clone | Alias rimossi |
bg-[--brand] | bg-(--brand) | Nuova forma abbreviata per le variabili CSS |
!bg-red-500 | bg-red-500! | Il punto esclamativo va alla fine (la vecchia forma è deprecata) |
first:*:pt-0 | *:first:pt-0 | Le varianti combinate ora si leggono da sinistra a destra |
tw-flex (prefisso) | tw:flex | I prefissi sembrano una variante e vanno per primi |
Cambi di comportamento senza rinomina, che sorprendono durante gli aggiornamenti:
currentColor invece di gray-200, quindi un border da solo appare scuro. Aggiungi un colore come border-gray-200.hover: è racchiuso in @media (hover: hover), così un tocco non attiva più stili hover che restano bloccati.cursor: default come fa il browser. Aggiungi cursor-pointer se vuoi la manina.> :not(:last-child) e il margine si è spostato sul lato finale. Se la spaziatura sembra sbagliata, passa a flex o grid con gap.center e padding non esistono più; estendilo con @utility container { margin-inline: auto; padding-inline: 2rem; }.bg-linear-to-r e aggiunge bg-radial e bg-conic.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.
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.
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.
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.
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.
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.
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.
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