Ein durchsuchbares Tailwind CSS v4 Cheat Sheet: Tippe eine Klasse oder ein einfaches Wort ein und sieh das exakte CSS, das v4 erzeugt, von var(--spacing)-Vielfachen bis zu OKLCH-Farbtokens. Es behandelt außerdem @theme-Tokens, Breakpoints, Container Queries, live Flex- und Grid-Boxen, die komplette Farbpalette, Dark Mode und die Umbenennungen von v3 zu v4.
Dieses Cheat Sheet behandelt Tailwind CSS v4 (v4.3 ist zum Zeitpunkt des Schreibens, im Oktober 2026, die aktuelle Version). Zu jeder Klasse zeigt es das CSS, das v4 tatsächlich erzeugt. Das ist wichtig, weil v4 die Art geändert hat, wie Werte entstehen: Abstände sind ein Vielfaches einer einzigen --spacing-Variable, Farben sind --color-*-Variablen in OKLCH, und Größen wie Radius, Schatten und Text stammen aus benannten Theme-Variablen. Tippe in das Feld, um zu filtern. Die Suche funktioniert mit Klassennamen, dem CSS, das sie ausgeben, und einfachen Wörtern wie "center", "gradient" oder "sticky".
Alle 243 werden angezeigt
| Klasse | Erzeugtes CSS in v4 |
|---|---|
| Layout und 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; |
| Ausrichtung und 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; |
| Abstände | |
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 |
| Größen | |
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); |
| Typografie | |
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; |
| Farbe und Hintergründe | |
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; |
| Rahmen, Radius, Rings und 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; |
| Effekte und Filter | |
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, Animationen und Transforms | |
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); |
| Interaktivität | |
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; |
| Zustands- und Medien-Varianten | |
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; |
Hinweise zum Lesen der Tabelle: calc(var(--spacing) * 4) ergibt 1rem, weil der Standardwert von --spacing 0.25rem ist. Ändere diese eine Variable in @theme, und jedes Padding, jede Margin, jeder Gap, jede Breite und jede Höhe auf der Zahlenskala ändert sich mit. Wo das erzeugte CSS lang ist (Verläufe, Rings, Transitions), zeigt die Tabelle eine vereinfachte Fassung und weist darauf hin.
Es gibt in v4 vier Wege, einer Utility einen Wert zu geben. Wer weiß, welchen er gerade nutzt, kann sich die meisten Überraschungen erklären:
p-4, w-64, gap-3. Jede ganze Zahl funktioniert, ebenso Viertelschritte wie p-2.5, ganz ohne Konfiguration. Der Wert ist calc(var(--spacing) * n).rounded-lg, shadow-md, text-xl, max-w-md. Jeder liest eine Variable wie --radius-lg oder --container-md.p-[13px], grid-cols-[200px_1fr], bg-[#4f98fb]. Unterstriche stehen für Leerzeichen.bg-(--brand) ist die v4-Kurzform für bg-[var(--brand)]. In v3 hast du bg-[--brand] geschrieben.Brüche wie w-1/2 werden zu calc(1/2 * 100%), und ein Deckkraft-Suffix wie bg-black/50 wird zu einem color-mix() mit transparent. Dadurch funktioniert es mit jedem Farbformat.
In v4 konfigurierst du das Designsystem in CSS. Variablen, die du in @theme deklarierst, werden sowohl zu CSS Custom Properties auf :root als auch zur Quelle für Utility-Klassen. Das Präfix der Variable entscheidet, welche Utilities sie speist:
@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 | Speist | Beispiel |
|---|---|---|
--color-* | jede Farb-Utility (bg, text, border, fill, ring, Schattenfarbe...) | bg-red-500 |
--spacing | Padding, Margin, Gap, Breite, Höhe, Inset, Translate | px-4 |
--font-* | Schriftfamilie | font-sans |
--text-* | Schriftgröße (plus optional --text-*--line-height) | text-xl |
--font-weight-* | Schriftstärke | font-bold |
--tracking-* / --leading-* | Zeichenabstand / Zeilenhöhe | tracking-wide |
--breakpoint-* | Responsive Varianten | sm:* |
--container-* | Container-Query-Varianten und max-w-* | @sm:*, max-w-md |
--radius-* | Rahmenradius | rounded-sm |
--shadow-*, --inset-shadow-*, --drop-shadow-* | Schatten | shadow-md |
--blur-* | Blur und Backdrop-Blur | blur-md |
--ease-* / --animate-* | Timing-Funktionen / Animationen | ease-out, animate-spin |
--perspective-* / --aspect-* | 3D-Perspektive / Seitenverhältnis | perspective-near, aspect-video |
Um einen kompletten Standard-Namespace zu entfernen, setze ihn zuerst auf initial, zum Beispiel --color-*: initial;, und deklariere dann nur deine eigenen Farben. Falls du noch eine JavaScript-Konfiguration hast, kann v4 sie mit @config "./tailwind.config.js"; laden, die Optionen corePlugins, safelist und separator werden aber nicht unterstützt.
Breakpoints sind Mobile First: Eine Klasse ohne Präfix gilt bei jeder Breite, und md:flex gilt ab 48rem aufwärts. v4 schreibt sie mit der Range-Syntax width >= ....
| Präfix | Mindestbreite | CSS | Darunter (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: |
Kombiniere sie, um einen Bereich anzusprechen: md:max-xl:flex gilt nur von 48rem bis (ausschließlich) 80rem. Für einen einmaligen Breakpoint nutze min-[900px]:grid oder max-[600px]:hidden. Breakpoints fügst du mit --breakpoint-* in @theme hinzu oder änderst sie dort. Halte sie alle in rem, damit sie korrekt sortiert werden.
Container Queries sind in v4 eingebaut (in v3 brauchten sie ein Plugin). Markiere ein Elternelement mit @container und style die Kindelemente dann mit @sm:, @md: und so weiter. Sie reagieren auf die Breite des Elternelements statt auf das Fenster. Genau das willst du bei einer Karte, die sowohl in einer Sidebar als auch in einer breiten Hauptspalte erscheint.
<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 | Container-Breite | Variante | Container-Breite |
|---|---|---|---|
@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) |
Jede wird zu @container (width >= ...) kompiliert. Nutze @max-md: für "unterhalb", kombiniere @sm:@max-md: für einen Bereich, benenne Container mit @container/sidebar und sprich sie mit @md/sidebar: an, und verwende beliebige Größen wie @min-[475px]:. Beachte, dass die Container-Größen nicht dieselben Zahlen wie die Breakpoints sind: @md ist 28rem, während md: 48rem ist.
Wähle unten ein Layout und sieh zu, wie sich die Boxen bewegen. Der Klassen-String aktualisiert sich bei jedem Klick, sodass du ihn direkt in dein Markup kopieren kannst.
Die Muster, die du am häufigsten brauchst:
flex items-center justify-between: Navbar-Zeileflex items-center justify-center (oder grid place-items-center): ein Element zentrierengrid grid-cols-3 gap-2 mit col-span-2shrink-0 auf dem festen Element, flex-1 auf dem Element, das den Rest füllt| Ziel | Klassen |
|---|---|
| Responsives Karten-Grid ohne Breakpoints | grid grid-cols-[repeat(auto-fill,minmax(16rem,1fr))] gap-6 |
| Sidebar plus Inhalt | grid md:grid-cols-[16rem_1fr] gap-8 |
| Footer am unteren Rand einer kurzen Seite fixieren | flex min-h-dvh flex-col auf dem Wrapper, flex-1 auf main |
| Text, der in einer Flex-Zeile abgeschnitten wird | min-w-0 auf dem Flex-Kind, truncate auf dem Text |
| Auf Mobilgeräten gestapelt, auf dem Desktop in einer Zeile | flex flex-col md:flex-row gap-4 |
| Das letzte Element nach rechts schieben | ms-auto (oder ml-auto) auf diesem Element |
v4 definiert die Standardpalette in OKLCH, womit auf Wide-Gamut-Bildschirmen gesättigtere Farben möglich sind. Jedes Farbfeld unten ist mit dem exakten Wert aus Tailwinds eigener Theme-Datei gefärbt. Klicke eines an, um seinen oklch()-Wert zu kopieren. Die Abstufungen reichen von 50 bis 950. Mit * markierte Paletten (mauve, olive, mist und taupe) kamen in v4.2.0 hinzu und fehlen daher in früheren v4-Versionen. Schwarz und Weiß sind #000 und #fff.
Verwende sie als bg-sky-500, text-sky-500/80 oder in deinem eigenen CSS als var(--color-sky-500). Um zu prüfen, ob eine Kombination gut lesbar ist, nutze den Farbkontrast-Checker, und für eine eigene Skala im selben Format probiere den Tailwind-Farbpaletten-Generator.
Standardmäßig folgt dark: dem Betriebssystem über @media (prefers-color-scheme: dark). Um ihn stattdessen über eine Klasse oder ein Attribut zu steuern (für einen manuellen Umschalter), überschreibe die Variante in deinem CSS mit @custom-variant. Einen darkMode-Konfigurationsschlüssel gibt es nicht mehr.
/* 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>
Mit einem manuellen Umschalter setzt du die Klasse, bevor die Seite gezeichnet wird (ein kleines Inline-Script in <head>, das die gespeicherte Wahl liest), damit Besucher kein kurzes Aufblitzen des falschen Themes sehen. Eine dritte Möglichkeit ist, ganz auf dark:-Klassen zu verzichten: Definiere semantische Tokens wie --color-surface in @theme und tausche ihre Werte unter .dark, sodass eine einzige Klasse wie bg-surface in beiden Themes funktioniert.
Diese Angaben stammen aus dem offiziellen Upgrade-Guide. Die Umbenennungen sind am wichtigsten, weil die alten Namen weiterhin existieren und stillschweigend ein anderes (kleineres) Ergebnis liefern.
| v3 | v4 | Warum |
|---|---|---|
shadow-sm | shadow-xs | Skala um eine Stufe nach unten verschoben, damit jede Größe einen Namen hat |
shadow | shadow-sm | Gleiche Verschiebung |
drop-shadow-sm / drop-shadow | drop-shadow-xs / drop-shadow-sm | Gleiche Verschiebung |
blur-sm / blur | blur-xs / blur-sm | Gleiche Verschiebung (auch backdrop-blur-*) |
rounded-sm | rounded-xs | Gleiche Verschiebung |
rounded | rounded-sm | Gleiche Verschiebung |
outline-none | outline-hidden | In v4 setzt outline-none jetzt wirklich outline-style: none |
ring (3px, blue-500) | ring-3 plus eine Farbe | Ein reines ring ist jetzt 1px in currentColor |
outline outline-2 | outline-2 | Breiten-Utilities setzen jetzt selbst einen durchgezogenen Stil |
bg-opacity-50 (und text-, border-, ring-, divide-, placeholder-opacity) | bg-black/50 | Entfernt, nutze den Slash-Modifier |
flex-shrink-0 / flex-grow | shrink-0 / grow | Entfernte Aliasse |
overflow-ellipsis | text-ellipsis | Entfernter Alias |
decoration-slice / decoration-clone | box-decoration-slice / box-decoration-clone | Entfernte Aliasse |
bg-[--brand] | bg-(--brand) | Neue Kurzform für CSS-Variablen |
!bg-red-500 | bg-red-500! | Important steht jetzt am Ende (alte Form ist veraltet) |
first:*:pt-0 | *:first:pt-0 | Kombinierte Varianten werden jetzt von links nach rechts gelesen |
tw-flex (Präfix) | tw:flex | Präfixe sehen aus wie eine Variante und stehen vorne |
Verhaltensänderungen ohne Umbenennung, die beim Upgrade oft überraschen:
currentColor statt gray-200, deshalb wirkt ein reines border dunkel. Ergänze eine Farbe wie border-gray-200.hover: ist in @media (hover: hover) eingeschlossen, sodass ein Tippen keine hängenbleibenden Hover-Stile mehr auslöst.cursor: default, so wie der Browser. Ergänze cursor-pointer, wenn du die Hand als Mauszeiger willst.> :not(:last-child) geändert, und die Margin liegt jetzt auf der End-Seite. Wenn Abstände nicht stimmen, wechsle zu flex oder grid mit gap.center und padding sind weggefallen. Erweitere ihn mit @utility container { margin-inline: auto; padding-inline: 2rem; }.bg-linear-to-r und ergänzt bg-radial und bg-conic.Das offizielle Tool npx @tailwindcss/upgrade erledigt die meisten Umbenennungen automatisch. Führe es auf einem sauberen Branch aus und prüfe den Diff, denn es kann nicht wissen, welche shadow-Klassen gleich aussehen sollen.
Diese Seite hat Druckstile: Suchfelder und Buttons werden ausgeblendet, die Tabellen schrumpfen auf eine kleinere Schrift, und das Farbraster hält seine Farbfelder zusammen. Aktiviere in den meisten Browsern im Druckdialog "Hintergrundgrafiken", sonst werden die Farbfelder leer gedruckt. Wenn du die Tabelle vorher gefiltert hast, werden nur die sichtbaren Zeilen gedruckt. So bekommst du schnell eine einseitige Übersicht nur mit den Utilities, die du nutzt.
Dieselbe print:-Variante funktioniert auch in deinen eigenen Projekten: print:hidden auf der Navigation, print:text-black auf hellem Text und print:break-inside-avoid auf Karten halten gedruckte Seiten lesbar.
v4 wird in CSS konfiguriert. Du importierst Tailwind mit @import "tailwindcss" und deklarierst Design-Tokens in einem @theme-Block, etwa --color-brand-500 oder --breakpoint-3xl. Eine JavaScript-Konfiguration lässt sich weiterhin mit der @config-Direktive laden, die Optionen corePlugins, safelist und separator werden aber nicht unterstützt.
sm ist 40rem (640px), md ist 48rem (768px), lg ist 64rem (1024px), xl ist 80rem (1280px) und 2xl ist 96rem (1536px). Sie sind Mobile First, md:flex gilt also ab 48rem und breiter. Nutze max-md: für Stile unterhalb eines Breakpoints und kombiniere sie, etwa md:max-xl:, für einen Bereich.
Die Skalen für Schatten, Radius und Blur sind eine Stufe nach unten gerutscht. v3 shadow-sm ist v4 shadow-xs, v3 shadow ist v4 shadow-sm, v3 rounded-sm ist v4 rounded-xs und v3 rounded ist v4 rounded-sm. Die alten Namen kompilieren weiterhin, daher gibt es keine Fehlermeldung. Sie erzeugen nur die nächstkleinere Größe.
Füge @custom-variant dark (&:where(.dark, .dark *)); in dein CSS ein. dark:-Utilities greifen dann, sobald ein Vorfahre die Klasse dark hat. Nutze stattdessen [data-theme=dark] im Selektor, wenn dir ein Data-Attribut lieber ist.
Nein. Container Queries sind eingebaut. Setze @container auf das Elternelement und nutze Varianten wie @sm:, @md: und @max-md: auf seinen Kindelementen. Die Container-Größen beginnen bei @3xs (16rem) und unterscheiden sich von den Seiten-Breakpoints, zum Beispiel ist @md 28rem.
padding: calc(var(--spacing) * 4). Mit dem Standardwert von --spacing, 0.25rem, sind das 1rem (16px bei der Standardschriftgröße). Jede ganze Zahl funktioniert auf der Spacing-Skala ohne Konfiguration, und wenn du --spacing änderst, skalieren alle auf einmal mit.
Display
Items
Richtung
Umbruch
Hauptachse
Spalten
Querachse
Abstand
Kopiert
Klassen kopieren
Dieses Cheat Sheet drucken
Kostenlos starten · Keine Kreditkarte nötig