Un aide-mémoire Tailwind CSS v4 avec recherche : tapez n'importe quelle classe ou un simple mot et voyez le CSS exact généré par la v4, des multiples de var(--spacing) aux tokens de couleur OKLCH. Il couvre aussi les tokens @theme, les breakpoints, les container queries, des blocs flex et grid interactifs, la palette de couleurs complète, le mode sombre et les renommages de v3 à v4.
La v4 se configure en CSS. Vous importez Tailwind avec @import "tailwindcss" et déclarez les design tokens dans un bloc @theme, comme --color-brand-500 ou --breakpoint-3xl. Une configuration JavaScript peut encore être chargée avec la directive @config, mais les options corePlugins, safelist et separator ne sont pas prises en charge.
sm vaut 40rem (640px), md 48rem (768px), lg 64rem (1024px), xl 80rem (1280px) et 2xl 96rem (1536px). Ils sont mobile first, donc md:flex s'applique à partir de 48rem et au-delà. Utilisez max-md: pour les styles en dessous d'un breakpoint et combinez-les, comme md:max-xl:, pour une plage.
Les échelles d'ombre, de radius et de flou ont été décalées d'un cran vers le bas. shadow-sm en v3 correspond à shadow-xs en v4, shadow en v3 à shadow-sm en v4, rounded-sm en v3 à rounded-xs en v4 et rounded en v3 à rounded-sm en v4. Les anciens noms se compilent toujours, donc aucune erreur n'apparaît ; ils produisent simplement la taille inférieure.
Ajoutez @custom-variant dark (&:where(.dark, .dark *)); à votre CSS. Les utilitaires dark: s'appliquent alors dès qu'un ancêtre possède la classe dark. Utilisez plutôt [data-theme=dark] dans le sélecteur si vous préférez un attribut data.
Non. Les container queries sont intégrées. Placez @container sur le parent et utilisez des variantes comme @sm:, @md: et @max-md: sur ses enfants. Les tailles de conteneur commencent à @3xs (16rem) et diffèrent des breakpoints de page, par exemple @md vaut 28rem.
padding: calc(var(--spacing) * 4). Avec la valeur par défaut de --spacing, 0.25rem, cela donne 1rem (16px avec la taille de police par défaut). Tout nombre entier fonctionne sur l'échelle d'espacement sans configuration, et modifier --spacing les redimensionne tous d'un coup.
Affichage
Éléments
Direction
Retour à la ligne
Axe principal
Colonnes
Axe secondaire
Espacement
Copié
Copier les classes
Imprimer cet aide-mémoire
Cet aide-mémoire couvre Tailwind CSS v4 (la v4.3 est la version actuelle au moment de la rédaction, en octobre 2026). Pour chaque classe, il montre le CSS que la v4 génère réellement, ce qui compte car la v4 a changé la façon dont les valeurs sont produites : l'espacement est un multiple d'une seule variable --spacing , les couleurs sont des variables --color-* définies en OKLCH, et les tailles comme le radius, l'ombre et le texte proviennent de variables de thème nommées. Tapez dans le champ pour filtrer. La recherche porte sur les noms de classes, le CSS qu'elles produisent et des mots courants comme "center", "gradient" ou "sticky".
Les 243 sont affichées
| Classe | CSS produit en v4 |
|---|---|
| Mise en page et affichage | |
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; |
| Alignement et 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; |
| Espacement | |
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 |
| Dimensions | |
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); |
| Typographie | |
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; |
| Couleurs et arrière-plans | |
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; |
| Bordures, radius, rings et outlines | |
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; |
| Effets et filtres | |
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%); |
| Transitions, animations et transformations | |
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); |
| Interactivité | |
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; |
| Variantes d'état et de média | |
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; |
Pour bien lire le tableau : calc(var(--spacing) * 4) vaut 1rem car la valeur par défaut de --spacing est 0.25rem. Modifiez cette seule variable dans @theme et tous les padding, margin, gap, width et height qui utilisent l'échelle numérique changent avec elle. Lorsque le CSS généré est long (dégradés, rings, transitions), le tableau en montre une version simplifiée et le signale.
Il existe quatre façons de donner une valeur à un utilitaire en v4, et savoir laquelle vous utilisez explique la plupart des surprises :
p-4, w-64, gap-3. Tout nombre entier fonctionne, tout comme les quarts de pas tels que p-2.5, sans configuration. La valeur est calc(var(--spacing) * n).rounded-lg, shadow-md, text-xl, max-w-md. Chacune lit une variable comme --radius-lg ou --container-md.p-[13px], grid-cols-[200px_1fr], bg-[#4f98fb]. Les tirets bas remplacent les espaces.bg-(--brand) est le raccourci v4 pour bg-[var(--brand)]. En v3, on écrivait bg-[--brand].Les fractions comme w-1/2 deviennent calc(1/2 * 100%), et un suffixe d'opacité comme bg-black/50 devient un color-mix() avec transparent, il fonctionne donc avec n'importe quel format de couleur.
En v4, vous configurez le design system en CSS. Les variables déclarées dans @theme deviennent à la fois des propriétés personnalisées CSS sur :root et la source des classes utilitaires. Le préfixe de la variable détermine les utilitaires qu'elle alimente :
@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 */
}
| Espace de noms | Alimente | Exemple |
|---|---|---|
--color-* | tous les utilitaires de couleur (bg, text, border, fill, ring, couleur d'ombre...) | bg-red-500 |
--spacing | padding, margin, gap, width, height, inset, translate | px-4 |
--font-* | famille de police | font-sans |
--text-* | taille de police (plus un --text-*--line-height) | text-xl |
--font-weight-* | graisse de police | font-bold |
--tracking-* / --leading-* | interlettrage / hauteur de ligne | tracking-wide |
--breakpoint-* | variantes responsive | sm:* |
--container-* | variantes de container queries et max-w-* | @sm:*, max-w-md |
--radius-* | rayon de bordure | rounded-sm |
--shadow-*, --inset-shadow-*, --drop-shadow-* | ombres | shadow-md |
--blur-* | flou et flou d'arrière-plan | blur-md |
--ease-* / --animate-* | fonctions de temporisation / animations | ease-out, animate-spin |
--perspective-* / --aspect-* | perspective 3D / ratio d'aspect | perspective-near, aspect-video |
Pour supprimer tout un espace de noms par défaut, définissez-le d'abord sur initial , par exemple --color-*: initial;, puis déclarez uniquement vos propres couleurs. Si vous avez encore une configuration JavaScript, la v4 peut la charger avec @config "./tailwind.config.js";, mais les options corePlugins, safelist et separator ne sont pas prises en charge.
Les breakpoints sont mobile first : une classe sans préfixe s'applique à toutes les largeurs, et md:flex s'applique à partir de 48rem. La v4 les écrit avec la syntaxe de plage width >= ....
| Préfixe | Largeur min. | CSS | En dessous (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: |
Combinez-les pour cibler une plage : md:max-xl:flex s'applique uniquement de 48rem jusqu'à 80rem (exclu). Pour un breakpoint ponctuel, utilisez min-[900px]:grid ou max-[600px]:hidden. Ajoutez ou modifiez des breakpoints avec --breakpoint-* dans @theme, et gardez-les tous en rem pour qu'ils soient triés correctement.
Les container queries sont intégrées à la v4 (en v3, il fallait un plugin). Marquez un parent avec @container, puis stylez les enfants avec @sm:, @md: et ainsi de suite. Elles réagissent à la largeur du parent plutôt qu'à celle de la fenêtre, ce qui est idéal pour une carte qui apparaît à la fois dans une barre latérale et dans une large colonne principale.
<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 | Largeur du conteneur | Variante | Largeur du conteneur |
|---|---|---|---|
@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) |
Chacune se compile en @container (width >= ...). Utilisez @max-md: pour "en dessous", combinez @sm:@max-md: pour une plage, nommez les conteneurs avec @container/sidebar et ciblez-les avec @md/sidebar:, et utilisez des tailles arbitraires comme @min-[475px]:. Notez que les tailles de conteneur ne correspondent pas aux valeurs des breakpoints : @md vaut 28rem alors que md: vaut 48rem.
Choisissez une mise en page ci-dessous et regardez les blocs bouger. La chaîne de classes se met à jour à chaque clic, vous pouvez donc la copier directement dans votre balisage.
Les patterns que vous utiliserez le plus souvent :
flex items-center justify-between : ligne de barre de navigationflex items-center justify-center (ou grid place-items-center) : centrer un élémentgrid grid-cols-3 gap-2 avec col-span-2shrink-0 sur l'élément fixe, flex-1 sur l'élément qui remplit l'espace| Objectif | Classes |
|---|---|
| Grille de cartes responsive sans breakpoints | grid grid-cols-[repeat(auto-fill,minmax(16rem,1fr))] gap-6 |
| Barre latérale plus contenu | grid md:grid-cols-[16rem_1fr] gap-8 |
| Pied de page collé en bas d'une page courte | flex min-h-dvh flex-col sur le conteneur, flex-1 sur main |
| Texte tronqué dans une ligne flex | min-w-0 sur l'enfant flex, truncate sur le texte |
| Empilé sur mobile, en ligne sur ordinateur | flex flex-col md:flex-row gap-4 |
| Pousser le dernier élément à droite | ms-auto (ou ml-auto) sur cet élément |
La v4 définit la palette par défaut en OKLCH, qui peut afficher des couleurs plus saturées sur les écrans à large gamut. Chaque nuancier ci-dessous est peint avec la valeur exacte du fichier de thème de Tailwind ; cliquez sur l'un d'eux pour copier sa valeur oklch() . Les nuances vont de 50 à 950. Les palettes marquées * (mauve, olive, mist et taupe) ont été ajoutées en v4.2.0, elles sont donc absentes des versions v4 antérieures. Le noir et le blanc sont #000 et #fff.
Utilisez-les sous la forme bg-sky-500, text-sky-500/80 ou, dans votre propre CSS, var(--color-sky-500). Pour vérifier qu'une association est lisible, passez-la dans le vérificateur de contraste des couleurs, et pour une échelle personnalisée dans le même format, essayez le générateur de palette de couleurs Tailwind.
Par défaut, dark: suit le système d'exploitation via @media (prefers-color-scheme: dark). Pour le piloter plutôt avec une classe ou un attribut (pour un bouton de bascule manuel), redéfinissez la variante dans votre CSS avec @custom-variant. Il n'y a plus de clé de configuration 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>
Avec une bascule manuelle, définissez la classe avant l'affichage de la page (un petit script inline dans <head> qui lit le choix enregistré) pour que les visiteurs ne voient pas un flash du mauvais thème. Une troisième option consiste à se passer complètement des classes dark: : définissez des tokens sémantiques comme --color-surface dans @theme et changez leurs valeurs sous .dark, ainsi une seule classe comme bg-surface fonctionne dans les deux thèmes.
Ces changements proviennent du guide de migration officiel. Les renommages comptent le plus, car les anciens noms existent toujours et produisent discrètement un résultat différent (plus petit).
| v3 | v4 | Pourquoi |
|---|---|---|
shadow-sm | shadow-xs | Échelle décalée d'un cran vers le bas pour que chaque taille ait un nom |
shadow | shadow-sm | Même décalage |
drop-shadow-sm / drop-shadow | drop-shadow-xs / drop-shadow-sm | Même décalage |
blur-sm / blur | blur-xs / blur-sm | Même décalage (aussi backdrop-blur-*) |
rounded-sm | rounded-xs | Même décalage |
rounded | rounded-sm | Même décalage |
outline-none | outline-hidden | v4 outline-none définit désormais vraiment outline-style: none |
ring (3px, blue-500) | ring-3 plus une couleur | Sans suffixe, ring vaut désormais 1px en currentColor |
outline outline-2 | outline-2 | Les utilitaires de largeur définissent désormais eux-mêmes un style solid |
bg-opacity-50 (ainsi que text-, border-, ring-, divide-, placeholder-opacity) | bg-black/50 | Supprimé ; utilisez le modificateur avec barre oblique |
flex-shrink-0 / flex-grow | shrink-0 / grow | Alias supprimés |
overflow-ellipsis | text-ellipsis | Alias supprimé |
decoration-slice / decoration-clone | box-decoration-slice / box-decoration-clone | Alias supprimés |
bg-[--brand] | bg-(--brand) | Nouveau raccourci pour les variables CSS |
!bg-red-500 | bg-red-500! | Le important se place à la fin (ancienne forme dépréciée) |
first:*:pt-0 | *:first:pt-0 | Les variantes combinées se lisent désormais de gauche à droite |
tw-flex (préfixe) | tw:flex | Les préfixes ressemblent à une variante et viennent en premier |
Changements de comportement sans renommage, qui surprennent souvent lors des migrations :
currentColor au lieu de gray-200, donc un border seul paraît sombre. Ajoutez une couleur comme border-gray-200.hover: est enveloppé dans @media (hover: hover), donc un appui ne déclenche plus de styles de survol qui restent bloqués.cursor: default comme le fait le navigateur. Ajoutez cursor-pointer si vous voulez la main.> :not(:last-child) et la marge est passée du côté de fin. Si l'espacement semble incorrect, passez à flex ou grid avec gap.center et padding ont disparu ; étendez-le avec @utility container { margin-inline: auto; padding-inline: 2rem; }.bg-linear-to-r et ajoute bg-radial et bg-conic.L'outil officiel npx @tailwindcss/upgrade gère automatiquement la plupart des renommages. Lancez-le sur une branche propre et relisez le diff, car il ne peut pas savoir quelles classes shadow vous vouliez garder visuellement identiques.
Cette page possède des styles d'impression : les champs de recherche et les boutons sont masqués, les tableaux passent à une police plus petite et la grille de couleurs garde ses nuanciers groupés. Dans la plupart des navigateurs, activez "Graphiques d'arrière-plan" dans la boîte de dialogue d'impression, sinon les nuanciers s'impriment en blanc. Si vous avez d'abord filtré le tableau, seules les lignes visibles s'impriment, ce qui permet de créer rapidement une fiche d'une page avec uniquement les utilitaires que vous utilisez.
La même variante print: fonctionne dans vos propres projets : print:hidden sur la navigation, print:text-black sur le texte clair, et print:break-inside-avoid sur les cartes gardent les pages imprimées lisibles.
Commencer gratuitement · Sans carte bancaire