Designprinzipien für Softwareentwickler
Designgrundlagen für Softwareentwickler: Typografie, Farbe, Abstände, Animationen, KI-Schnittstellenmuster, Design-Tokens und 48 aktuelle Produktfallstudien.
Aktualisiert am 18. August 2026
Aktualisierung vom 18. Mai 2026: Der Index der Designstudien wurde an den aktuellen Korpus von 48 Studien angepasst und die AI Interface Patterns um Erkenntnisse zu agentischen Arbeitsabläufen erweitert: Checkpoints, Genehmigungsstatus, Quellenvertrauen und sichtbare Verifizierung.
Aktualisierung vom Mai 2026: Ein Hinweis zum Arbeitsentwurf von WCAG 3.0 vom März 2026 und zur Position des W3C, dass WCAG 2.2 und 3.0 parallel bestehen werden, wurde ergänzt. WCAG 2.2 bleibt der Standard, an dem Sie sich bei aktuellen Arbeiten zur Barrierefreiheit orientieren sollten.
Aktualisierung vom Februar 2026: Zwei neue Abschnitte wurden hinzugefügt – Interaktionsmuster (8 Paradigmen aus der Untersuchung von Framer, Flighty, Halide, Warp, Bear, Craft und Superhuman) und AI Interface Patterns (Design mit konsequenten Quellenangaben, Streaming-Phasen und transparente Fehlerdarstellung nach dem Vorbild von Perplexity). Die Webmuster wurden für 2026 aktualisiert und umfassen nun Anchor Positioning, scrollgesteuerte Animationen und @starting-style. Der Abschnitt zur Barrierefreiheit wurde an die ISO-Standardisierung von WCAG 2.2 angepasst. Unter Designstudien finden Sie detaillierte Analysen von 48 außergewöhnlichen Produkten.
Ich habe mich über Jahre hinweg intensiv mit Design beschäftigt und zugleich Software entwickelt, dabei die Prinzipien von Legenden wie Dieter Rams verinnerlicht und Benutzeroberflächen von Produkten wie Linear, Stripe und Raycast bis ins Detail analysiert. Dieser Leitfaden bündelt diese Erkenntnisse zu dem umfassenden Nachschlagewerk, das ich mir gewünscht hätte, als mir erstmals wichtig wurde, wie meine Software aussieht und sich anfühlt.
Design ist keine Dekoration. Es ist Kommunikation. Jedes Pixel vermittelt Funktion, Hierarchie und Bedeutung. Ob Software amateurhaft oder professionell wirkt, hängt davon ab, ob Sie diese Prinzipien verstehen und konsequent anwenden.
Dieser Leitfaden setzt voraus, dass Sie bereits programmieren können. Er schult Ihren Blick: Sie lernen zu verstehen, warum manche Benutzeroberflächen mühelos wirken, während andere chaotisch erscheinen – und vor allem, wie Sie erstere entwickeln.
Inhaltsverzeichnis
Teil 1: Grundlagen
- Gestalt-Psychologie
- Typografie
- Farbtheorie
- Visuelle Hierarchie
- Abstände & Rhythmus
- Animationsprinzipien
Teil 2: Interaktion & KI
Teil 3: Designphilosophie
Teil 4: Umsetzung
Teil 5: Referenz
Gestalt-Psychologie
„Das Ganze ist etwas anderes als die Summe seiner Teile.” — Kurt Koffka
Die in den 1920er-Jahren in Deutschland entwickelte Gestalt-Psychologie erklärt, wie Menschen visuelle Informationen wahrnehmen. Das Gehirn sieht keine einzelnen Pixel – es ordnet Elemente zu bedeutungsvollen Mustern. Beherrschen Sie diese Prinzipien, um gezielt zu steuern, wie Benutzer Ihre Oberflächen wahrnehmen.
Nähe (Proximity)
Elemente, die nahe beieinander stehen, werden als Gruppe wahrgenommen.
Dies ist das wirkungsvollste Gestalt-Prinzip im UI-Design. Abstände kommunizieren Zusammengehörigkeit stärker als jede andere visuelle Eigenschaft.
FALSCH (gleiche Abstände = keine Gruppierung):
┌─────────────────┐
│ Label │
│ │
│ Input Field │
│ │
│ Label │
│ │
│ Input Field │
└─────────────────┘
RICHTIG (ungleiche Abstände = klare Gruppen):
┌─────────────────┐
│ Label │
│ Input Field │ ← Eng (4px) - zusammengehörig
│ │
│ │ ← Weit (24px) - Gruppen trennen
│ Label │
│ Input Field │ ← Eng (4px) - zusammengehörig
└─────────────────┘
CSS-Umsetzung:
.form-group {
margin-bottom: 24px; /* Between groups: wide */
}
.form-group label {
margin-bottom: 4px; /* Label to input: tight */
display: block;
}
SwiftUI-Umsetzung:
VStack(alignment: .leading, spacing: 4) { // Tight within group
Text("Email")
.font(.caption)
.foregroundStyle(.secondary)
TextField("you@example.com", text: $email)
.textFieldStyle(.roundedBorder)
}
.padding(.bottom, 24) // Wide between groups
Ähnlichkeit (Similarity)
Elemente mit gemeinsamen visuellen Merkmalen wirken zusammengehörig.
Wenn Elemente gleich aussehen, gehen Benutzer davon aus, dass sie auch gleich funktionieren. Genau deshalb verwenden Designsysteme einheitliche Button-Stile, Kartengestaltungen und Typografie.
Beispiel Navigation:
┌───────────────────────────────────┐
│ [Dashboard] [Projects] [Settings] │ ← Gleicher Stil = gleiche Funktion
│ │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │Card │ │Card │ │Card │ │ ← Gleicher Stil = gleicher Inhaltstyp
│ └─────┘ └─────┘ └─────┘ │
│ │
│ [+ New Project] │ ← Anderer Stil = andere Funktion
└───────────────────────────────────┘
Figur-Grund-Beziehung (Figure-Ground)
Inhalte müssen sich klar vom Hintergrund abheben.
Das Gehirn muss die „Figur” (den Fokuspunkt) vom „Grund” (dem Hintergrund) unterscheiden können. Schwache Figur-Grund-Beziehungen erzeugen visuelle Verwirrung.
Techniken: - Kontrast (helle Figur auf dunklem Grund oder umgekehrt) - Schatten (Figur über den Grund erheben) - Rahmen (Figurkanten abgrenzen) - Unschärfe (Hintergrund weichzeichnen, Figur scharf halten)
/* Strong figure-ground relationship */
.card {
background: var(--color-surface); /* Figure */
border-radius: 12px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1); /* Elevation */
}
.modal-overlay {
background: rgba(0, 0, 0, 0.5); /* Dim ground */
backdrop-filter: blur(4px); /* Blur ground */
}
Gemeinsame Region (Common Region)
Elemente innerhalb einer Begrenzung werden als zusammengehörig wahrgenommen.
Das Einschließen von Elementen in einen visuellen Container (Karte, Box, umrandeter Bereich) signalisiert Zusammengehörigkeit.
Kontinuität (Continuity)
Das Auge folgt Pfaden, Linien und Kurven.
Nutzen Sie Ausrichtung und visuellen Fluss, um die Aufmerksamkeit durch Ihre Oberfläche zu lenken.
KONTINUITÄT DURCH AUSRICHTUNG:
┌────────────────────────────────┐
│ Logo [Nav] [Nav] [Nav] │ ← Auf horizontaler Achse ausgerichtet
├────────────────────────────────┤
│ │
│ Headline │
│ ───────────────────────────── │ ← Auge folgt der linken Kante
│ Paragraph text continues │
│ along the same left edge │
│ │
│ [Primary Action] │ ← Weiterhin an der linken Kante
└────────────────────────────────┘
Geschlossenheit (Closure)
Das Gehirn vervollständigt unvollständige Formen.
Benutzer benötigen nicht jedes einzelne Pixel – sie vervollständigen vertraute Formen gedanklich. Das ermöglicht minimalere, elegantere Designs.
/* Horizontal scroll with partial card (closure) */
.card-carousel {
display: flex;
gap: 16px;
overflow-x: auto;
padding-right: 48px; /* Show partial card = scroll hint */
}
.card-carousel .card {
flex: 0 0 280px; /* Fixed width, partial visible */
}
Gestalt-Kurzreferenz
| Prinzip | Regel | Hauptanwendung |
|---|---|---|
| Nähe | Zusammengehörig = nah, nicht zusammengehörig = fern | Formularfelder, Inhaltsbereiche |
| Ähnlichkeit | Gleiches Aussehen = gleiche Funktion | Buttons, Karten, Navigation |
| Figur-Grund | Klare Trennung der Ebenen | Karten, Modale, Overlays |
| Gemeinsame Region | Begrenzungen gruppieren Inhalte | Einstellungsbereiche, Benutzerkarten |
| Kontinuität | Linien und Ausrichtung folgen | Zeitleisten, Lesefluss |
| Geschlossenheit | Gehirn vervollständigt Formen | Icons, Scroll-Hinweise, Skelette |
Typografie
„Typografie ist das Handwerk, der menschlichen Sprache eine dauerhafte visuelle Form zu verleihen.” — Robert Bringhurst
Typografie bildet das Fundament des Interface-Designs. Text vermittelt Funktionalität, Hierarchie und Markenidentität. Schlechte Typografie erschwert die Bedienung von Oberflächen; großartige Typografie hingegen ist unsichtbar – sie funktioniert einfach.
Schriftgrößenskala (Type Scale)
Eine konsistente Skala schafft visuelle Harmonie. Verwenden Sie ein mathematisches Verhältnis.
Die 1,25-Skala (empfohlen für UI):
:root {
/* Base: 16px (1rem) */
--text-xs: 0.64rem; /* 10.24px - use sparingly */
--text-sm: 0.8rem; /* 12.8px - captions, labels */
--text-base: 1rem; /* 16px - body text */
--text-lg: 1.25rem; /* 20px - lead text */
--text-xl: 1.563rem; /* 25px - h4 */
--text-2xl: 1.953rem; /* 31.25px - h3 */
--text-3xl: 2.441rem; /* 39px - h2 */
--text-4xl: 3.052rem; /* 48.8px - h1 */
}
Zeilenhöhe (Line Height / Leading)
Die Zeilenhöhe beeinflusst die Lesbarkeit erheblich. Verschiedene Inhaltsarten erfordern unterschiedliche Zeilenabstände.
| Inhaltstyp | Zeilenhöhe | Warum |
|---|---|---|
| Überschriften | 1.1 - 1.2 | Kompakt, fett, kurz |
| UI-Text | 1.3 - 1.4 | Labels, Buttons |
| Fließtext | 1.5 - 1.7 | Gut lesbare Absätze |
| Langform | 1.7 - 2.0 | Artikel, Dokumentation |
Zeilenlänge (Measure)
Eine optimale Zeilenlänge beugt Ermüdung der Augen vor und verbessert das Leseverständnis.
- Optimal: 45–75 Zeichen pro Zeile
- Zielwert: 50–65 Zeichen
- Absolutes Maximum: 85 Zeichen
p {
max-width: 65ch; /* ch unit = width of '0' character */
}
.article-body {
max-width: 70ch;
margin: 0 auto;
}
Schriftauswahl
Systemschriften zuerst. Sie laden sofort, passen zur Plattform und sind für Bildschirme optimiert.
:root {
--font-sans: system-ui, -apple-system, BlinkMacSystemFont,
'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
--font-mono: ui-monospace, 'SF Mono', 'Cascadia Code',
'JetBrains Mono', Consolas, monospace;
}
Verwenden Sie benutzerdefinierte Schriften für: - Markendifferenzierung (Marketing-Websites) - Redaktionelles oder publizistisches Erscheinungsbild - Gestalterische Absichten, die mit Systemschriften nicht umsetzbar sind
Schriftstärke für Hierarchie
Nutzen Sie Schriftstärke zur Hierarchiebildung – nicht nur Größe.
h1 { font-weight: 700; } /* Bold */
h2 { font-weight: 600; } /* Semibold */
h3 { font-weight: 600; } /* Semibold */
.lead { font-weight: 500; } /* Medium */
p { font-weight: 400; } /* Regular */
.meta { font-weight: 400; color: var(--text-muted); }
Typografie-Kurzreferenz
| Eigenschaft | Fließtext | Überschriften | UI-Labels |
|---|---|---|---|
| Größe | 16–18px | 24–48px | 12–14px |
| Stärke | 400 | 600–700 | 500 |
| Zeilenhöhe | 1.5–1.7 | 1.1–1.2 | 1.3–1.4 |
| Zeilenlänge | 45–75ch | N/A | N/A |
| Ausrichtung | Links | Zentriert OK | Links |
Farbtheorie
„Farbe ist eine Kraft, die die Seele unmittelbar beeinflusst.“ — Wassily Kandinsky
Farbe vermittelt schneller als Worte. Sie erzeugt Stimmung, lenkt Aufmerksamkeit, signalisiert Bedeutung und stärkt die Markenwiedererkennung.
Die 60-30-10-Regel
Die verlässlichste Farbverteilung für ausgewogene Benutzeroberflächen.
┌──────────────────────────────────────────┐
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│ 60% - Dominant (Background)
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░│ 30% - Secondary (Cards, sections)
│░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░│
│░░░░░▓▓▓▓▓▓▓▓▓▓▓▓██████▓▓▓▓▓▓▓▓▓▓░░░░░░░░│ 10% - Accent (Buttons, links)
└──────────────────────────────────────────┘
Eine Farbpalette erstellen
Jede Benutzeroberfläche braucht diese semantischen Farben:
:root {
/* Brand */
--color-primary: hsl(220, 80%, 50%);
--color-primary-hover: hsl(220, 80%, 45%);
/* Semantic */
--color-success: hsl(142, 76%, 36%); /* Green - positive */
--color-warning: hsl(38, 92%, 50%); /* Amber - caution */
--color-error: hsl(0, 84%, 60%); /* Red - danger */
/* Neutrals */
--color-background: hsl(0, 0%, 100%);
--color-surface: hsl(220, 14%, 96%);
--color-border: hsl(220, 13%, 91%);
/* Text */
--color-text: hsl(220, 13%, 13%);
--color-text-secondary: hsl(220, 9%, 46%);
--color-text-muted: hsl(220, 9%, 64%);
}
Farbpsychologie
| Farbe | Psychologie | UI-Einsatz |
|---|---|---|
| Blau | Vertrauen, Stabilität, Ruhe | Finanzwesen, Tech, Unternehmen |
| Grün | Wachstum, Natur, Erfolg | Gesundheit, Nachhaltigkeit, positive Zustände |
| Rot | Energie, Dringlichkeit, Gefahr | Warnhinweise, Verkäufe, Fehler |
| Orange | Wärme, Begeisterung | CTAs, verspielte Marken |
| Gelb | Optimismus, Vorsicht | Warnungen, Hervorhebungen |
| Violett | Luxus, Kreativität | Premiumprodukte |
| ### Dark-Mode-First-Design (Vercel) | ||
| Vercel entwickelt zuerst für den Dunkelmodus und leitet daraus anschließend den Hellmodus ab. So entstehen bessere dunkle Oberflächen, weil der Dunkelmodus zur zentralen Überlegung wird statt zu einer nachträglichen Ergänzung. |
/* Design dark first, derive light */
:root {
/* Dark mode defaults */
--color-background: hsl(0, 0%, 0%);
--color-surface: hsl(0, 0%, 7%);
--color-border: hsl(0, 0%, 15%);
--color-text: hsl(0, 0%, 93%);
--color-text-secondary: hsl(0, 0%, 63%);
}
@media (prefers-color-scheme: light) {
:root {
--color-background: hsl(0, 0%, 100%);
--color-surface: hsl(0, 0%, 97%);
--color-border: hsl(0, 0%, 89%);
--color-text: hsl(0, 0%, 9%);
--color-text-secondary: hsl(0, 0%, 40%);
}
}
Wann verwenden: Entwicklertools, Medien-Apps, Dashboards – Kontexte, in denen Benutzer lange am Stück arbeiten und der Dunkelmodus die Augenbelastung verringert.
Kontrast für Barrierefreiheit
| Stufe | Normaler Text | Großer Text | UI-Komponenten |
|---|---|---|---|
| AA | 4,5:1 | 3:1 | 3:1 |
| AAA | 7:1 | 4,5:1 | N/A |
| WCAG 2.2 wurde im Oktober 2025 zu einem ISO-Standard (ISO/IEC 40500:2025) und ergänzt Kriterien für Fokus-Sichtbarkeit, redundante Eingabe und barrierefreie Authentifizierung. Wichtige Ergänzungen: Fokusindikatoren dürfen nicht vollständig durch andere Inhalte verdeckt werden (2.4.11), und die Authentifizierung darf sich nicht ausschließlich auf Tests kognitiver Funktionen stützen (3.3.8). Das W3C veröffentlichte im Dezember 2024 eine aktualisierte Fassung von WCAG 2.2, die voraussichtlich bis Ende 2026 als ISO/IEC 40500:2026 erscheinen wird. |
WCAG 3.0 ist weiterhin ein Arbeitsentwurf. Die neueste Überarbeitung erschien im März 2026 und ersetzt WCAG 2.2 nicht; das W3C erklärt, dass beide Standards nebeneinander bestehen werden. Die Accessibility Guidelines Working Group plant, 2026 einen voraussichtlichen Zeitplan für WCAG 3 zu veröffentlichen, doch WCAG 2.2 bleibt der Standard, an dem Sie sich bei aktueller Arbeit orientieren sollten.
Tools: WebAIM Contrast Checker, Chrome DevTools color picker
Visuelle Hierarchie
„Design ist der stille Botschafter Ihrer Marke.” — Paul Rand
Visuelle Hierarchie steuert, was Benutzer zuerst, danach und anschließend wahrnehmen. Ohne klare Hierarchie müssen Benutzer arbeiten, um Informationen zu finden. Mit ihr fühlen sich Interfaces mühelos an.
Die sechs Werkzeuge der Hierarchie
1. Größe — Größere Elemente ziehen zuerst Aufmerksamkeit auf sich
.hero-title { font-size: 3rem; } /* Dominant */
.section-title { font-size: 1.5rem; } /* Secondary */
.body-text { font-size: 1rem; } /* Baseline */
2. Schriftstärke — Fett tritt hervor, leicht tritt zurück
h1 { font-weight: 700; }
.lead { font-weight: 500; }
p { font-weight: 400; }
3. Farbe & Kontrast — Hoher Kontrast = Aufmerksamkeit
.title { color: var(--color-text); } /* Near black */
.meta { color: var(--color-text-muted); } /* Gray */
4. Position — Schlüsselpositionen zählen
F-PATTERN (content pages): Z-PATTERN (landing pages):
████████████████████████ 1 ──────────────────► 2
████████ ↘
████ ↘
██ ↘
3 ──────────────────► 4
5. Weißraum — Isolation schafft Bedeutung
.hero { padding: 120px 48px; } /* Generous space */
.data-table { padding: 12px; } /* Dense content */
6. Tiefe & Elevation — Elemente, die nach vorn treten, verlangen Aufmerksamkeit
Translation status: the provided German (de) markdown segment was translated inline only. I did not edit the listed guide files.
Locale verification: manually checked the returned segment for Sie form, preserved ````css
:root {
–shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
–shadow-md: 0 4px 6px rgba(0,0,0,0.1);
–shadow-lg: 0 10px 15px rgba(0,0,0,0.1);
}
.card { box-shadow: var(–shadow-sm); } .card:hover { box-shadow: var(–shadow-md); } .modal { box-shadow: var(–shadow-lg); } ```` exactly once, preserved protected product/CSS terms, markdown structure, table-free line order, and the existing section break.
Remaining i18n gaps: no file-level verification was run, no locale build or rendered check was performed, and I did not inspect the listed files because the translation request explicitly said not to run tools or inspect files. The listed guide paths remain unverified in this session.
„Weißraum ist wie Luft: Er ist notwendig, damit Design atmen kann.” — Wojciech Zieliński
Abstände sind die unsichtbare Struktur von Design. Konsistente Abstände erzeugen visuellen Rhythmus: das Gefühl, dass Elemente in einem kohärenten System zusammengehören.
Das 8px-Raster
Das 8px-Raster ist der Branchenstandard, weil es: - Sich gleichmäßig unterteilen lässt (8, 16, 24, 32, 40, 48…) - Mit gängigen Display-Dichten funktioniert (1x, 1.5x, 2x, 3x) - Ohne Rechnen einen konsistenten Rhythmus erzeugt
:root {
--space-1: 4px; /* Tight: icon gaps */
--space-2: 8px; /* Compact: inline elements */
--space-3: 12px; /* Snug: form fields */
--space-4: 16px; /* Default: most gaps */
--space-6: 24px; /* Spacious: card padding */
--space-8: 32px; /* Section gaps */
--space-12: 48px; /* Major sections */
--space-16: 64px; /* Page sections */
--space-20: 80px; /* Hero spacing */
}
Innen- vs. Außenabstand
Innen (padding): Abstand innerhalb eines Elements Außen (margin): Abstand zwischen Elementen
Regel: Der Innenabstand sollte innerhalb zusammengehöriger Gruppen in der Regel größer sein als der Außenabstand.
.card {
padding: 24px; /* Internal: spacious */
margin-bottom: 16px; /* External: less than padding */
}
Abstandsmuster für Komponenten
Karten:
.card { padding: 24px; border-radius: 12px; }
.card-header { margin-bottom: 16px; }
.card-title { margin-bottom: 4px; } /* Tight to subtitle */
Schaltflächen:
.btn { padding: 12px 24px; border-radius: 8px; }
.btn--sm { padding: 8px 16px; }
.btn--lg { padding: 16px 32px; }
.btn-group { display: flex; gap: 12px; }
Formulare:
.form-row { margin-bottom: 24px; }
.form-label { margin-bottom: 4px; }
.form-help { margin-top: 4px; }
.form-actions { margin-top: 32px; display: flex; gap: 12px; }
Kurzreferenz für Abstände
| Kontext | Empfohlener Abstand |
|---|---|
| Icon zu Text | 4-8px |
| Beschriftung zu Eingabefeld | 4px |
| Zwischen Formulargruppen | 24px |
| Innenabstand der Karte | 20-24px |
| Abstand zwischen Karten | 16-24px |
| Abschnittsabstand (mobile) | 48-64px |
| Abschnittsabstand (desktop) | 80-96px |
| Schaltflächen-Innenabstand (h/v) | 24px / 12px |
| — |
Animationsprinzipien
„Animation ist nicht die Kunst von Zeichnungen, die sich bewegen, sondern die Kunst von Bewegungen, die gezeichnet werden.” — Norman McLaren
Animation haucht Interfaces Leben ein. Gut umgesetzt lenkt sie die Aufmerksamkeit, kommuniziert Zustände und schafft eine emotionale Verbindung. Schlecht umgesetzt frustriert und lenkt sie ab.
Das Kernprinzip
Animation sollte sich unvermeidlich anfühlen, nicht dekorativ.
Gute Animation: 1. Kommuniziert etwas, das statisches Design nicht vermitteln kann 2. Reduziert die kognitive Last, indem sie Zusammenhänge sichtbar macht 3. Fühlt sich natürlich und erwartet an 4. Verschwindet aus dem bewussten Wahrnehmen
Schlechte Animation: 1. Existiert nur, weil „es cool aussieht” 2. Bremst den Benutzer aus 3. Lenkt die Aufmerksamkeit auf sich selbst 4. Erzeugt Unruhe oder Ungeduld
Zentrale Prinzipien für UI
1. Antizipation — Bereiten Sie Benutzer auf das Kommende vor.
.button {
transition: transform 0.1s ease-out;
}
.button:active {
transform: scale(0.97); /* Slight press before action */
}
2. Nachschwingen — Lassen Sie Bewegungen natürlich ausklingen, mit federartigem Einschwingen.
.panel {
transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
}
withAnimation(.spring(response: 0.4, dampingFraction: 0.7)) {
isOpen = true
}
3. Ease-In, Ease-Out — Nichts in der Natur bewegt sich mit konstanter Geschwindigkeit.
| Kurve | Einsatzbereich | Charakter |
|---|---|---|
ease-out |
Eintretende Elemente | Schneller Start, sanftes Stoppen |
ease-in |
Austretende Elemente | Sanfter Start, schnelles Verschwinden |
ease-in-out |
Zustandswechsel | Durchgehend gleichmäßig |
linear |
Ladeanimationen | Kontinuierlich, mechanisch |
4. Inszenierung — Lenken Sie die Aufmerksamkeit auf das Wesentliche. Nur ein Element sollte sich gleichzeitig bewegen, es sei denn, die Bewegung ist als Gruppe choreografiert.
5. Zeitversetztes Erscheinen — Elemente sollten nacheinander erscheinen, nicht alle gleichzeitig.
.list-item {
animation: fadeSlideIn 0.3s ease-out both;
}
.list-item:nth-child(1) { animation-delay: 0ms; }
.list-item:nth-child(2) { animation-delay: 50ms; }
.list-item:nth-child(3) { animation-delay: 100ms; }
.list-item:nth-child(4) { animation-delay: 150ms; }
@keyframes fadeSlideIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
Timing-Richtlinien
| Dauer | Einsatzbereich | Wirkung |
|---|---|---|
| 50–100ms | Mikrointeraktionen (Hover, Drücken) | Sofortiges Feedback |
| 150–200ms | Einfache Zustandswechsel (Umschalten, Auswählen) | Zügig |
| 250–350ms | Mittlere Übergänge (Panel-Einblendung, Karten-Flip) | Geschmeidig |
| 400–500ms | Große Bewegungen (Seitenübergänge, Modals) | Bewusst wahrnehmbar |
Performance: Die goldene Regel
Animieren Sie ausschließlich transform und opacity — diese werden GPU-beschleunigt und lösen kein Neuberechnen des Layouts aus.
/* BAD: Animating layout */
.panel { transition: left 0.3s, width 0.3s; }
/* GOOD: Using transform */
.panel { transition: transform 0.3s; }
Wann Sie NICHT animieren sollten
-
Der Benutzer hat
prefers-reduced-motionaktiviertcss @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; } } -
Die Animation vermittelt keine Information — überflüssige Spinner, hüpfende Elemente
- Benutzer haben es eilig — Fehlerzustände, Formularvalidierung, Suchergebnisse
- Animation würde wiederholte Aktionen verlangsamen — Tastaturkürzel sollten Animationen umgehen
- Daten sind bereits geladen — Bear verwendet keinerlei Ladezustände, da Inhalte vorgeladen werden, wodurch sich die App sofort anfühlt. Wenn Sie vorladen können, verzichten Sie komplett auf Skeleton-Screens oder Spinner.
// Bear's approach: preload so no loading state is needed
struct NoteListView: View {
@Query var notes: [Note] // SwiftData loads from disk instantly
// No loading state, no skeleton, no spinner — data is always there
var body: some View {
List(notes) { note in
NoteRow(note: note)
}
}
}
Animations-Kurzreferenz
:root {
/* Durations */
--duration-instant: 0.1s;
--duration-fast: 0.15s;
--duration-normal: 0.25s;
--duration-slow: 0.4s;
/* Easings */
--ease-out: cubic-bezier(0.0, 0.0, 0.58, 1.0);
--ease-in: cubic-bezier(0.42, 0.0, 1.0, 1.0);
--ease-in-out: cubic-bezier(0.42, 0.0, 0.58, 1.0);
--ease-out-back: cubic-bezier(0.34, 1.56, 0.64, 1);
}
Interaktionsmuster
„Das beste Interface ist kein Interface.” — Golden Krishna
Interaktionsmuster definieren, wie Benutzer Ihr Produkt bedienen, darin navigieren und es verstehen. Diese Muster wurden durch die Analyse von Produkten gewonnen, die herausragende Interaktionen umsetzen.
Direkte Manipulation (Framer)
Machen Sie abstrakte Konzepte greifbar. Framer verwandelt CSS-Breakpoints — abstrakte Zahlenwerte — in ziehbare Anfasser. Benutzer sehen in Echtzeit, wie sich Layouts anpassen.
/* Breakpoint handle styling */
.breakpoint-handle {
position: absolute;
top: 0;
bottom: 0;
width: 4px;
background: var(--accent);
cursor: col-resize;
opacity: 0.6;
transition: opacity 0.15s ease;
}
.breakpoint-handle:hover,
.breakpoint-handle:active {
opacity: 1;
width: 6px;
}
Wann einsetzen: Bei jeder Einstellung, deren Ergebnis visuell ist — Ziehen zum Größenändern, Farbwähler, Zeitleisten-Scrubbing.
Kontextbezogene Interfaces (Flighty, Figma)
Zeigen Sie nur das an, was im jeweiligen Moment relevant ist. Flighty nutzt 15 verschiedene Zustände für die Flugverfolgung. Figmas Eigenschaftenpanel wandelt sich je nach Auswahl vollständig um.
| Phase (Flighty) | Was Benutzer sehen |
|---|---|
| 24 Stunden vorher | Bestätigungscode, Terminalinformationen |
| Am Flughafen | Gate-Nummer, Boarding-Zeit |
| Im Flug | Verbleibende Zeit, Fortschritt, voraussichtliche Ankunft |
| Landung | Anschluss-Gates, Fußweg |
enum ContextState: CaseIterable {
case farOut, dayBefore, headToAirport, atAirport
case atGate, boarding, inFlight, landed, connection
static func current(for flight: Flight, context: UserContext) -> ContextState {
// Factor in: time, location, flight status
// Return the single most relevant state
}
}
Anti-Pattern: Alle Bedienelemente anzeigen und die irrelevanten ausgrauen. Das erzeugt visuelles Rauschen.
Intelligente Aktivierung (Halide)
Werkzeuge sollten den Kontext erkennen und sich selbstständig aktivieren. Halides Fokuslupe erscheint beim Ziehen des Fokuspunkts und verschwindet beim Loslassen. Kein Umschaltknopf nötig.
struct IntelligentlyActivated<Content: View>: ViewModifier {
let isInteracting: Bool
@State private var isVisible = false
func body(content: Content) -> some View {
content
.opacity(isVisible ? 1 : 0)
.scaleEffect(isVisible ? 1 : 0.95)
.animation(.easeInOut(duration: 0.2), value: isVisible)
.onChange(of: isInteracting) { _, newValue in
if newValue {
withAnimation { isVisible = true }
} else {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
if !isInteracting { isVisible = false }
}
}
}
}
}
Dualmodus-Design (Halide, Warp)
Moduswechsel sollten die Oberfläche transformieren, nicht nur Elemente ein- und ausblenden. Halides Auto- und Manuell-Modus sind vollständig unterschiedliche Interfaces. Warp verbindet CLI und GUI über vier Eingabemethoden (Tippen, Palette, KI, Maus), ohne Benutzer in ein einziges Paradigma zu zwängen.
Strukturierte Inhalte (Warp, Bear, Craft)
Verleihen Sie traditionell unstrukturierten Inhalten Struktur. Warp macht Terminal-Ausgaben zu eigenständigen Blöcken, die kopiert, geteilt oder erneut ausgeführt werden können. Bear ermöglicht es, Notizen direkt beim Schreiben zu ordnen (#tag/subtag). Bei Craft kann jeder Block zu einer eigenen Seite werden — Struktur entsteht durch Nutzung, nicht durch vorgegebene Hierarchie.
Progressives Training (Superhuman)
Bringen Sie Benutzern den schnellen Weg durch wiederholte Exposition bei. Superhuman zeigt in der Cmd+K-Palette stets Tastaturkürzel neben den Ergebnissen an. Jede Nutzung ist eine Mikro-Lektion.
/* Always show shortcut alongside command name */
.command-result {
display: flex;
justify-content: space-between;
padding: 8px 12px;
}
.command-shortcut {
font-family: var(--font-mono);
font-size: 12px;
color: var(--text-muted);
background: var(--bg-subtle);
padding: 2px 6px;
border-radius: 4px;
}
Anti-Pattern: Tutorial-Dialoge, die Funktionen erklären. Erklärungen werden vergessen — Übung bleibt haften.
AI-Schnittstellenmuster
„Die besten AI-Schnittstellen machen den Prozess der Maschine sichtbar und ihre Ergebnisse überprüfbar.“
AI-Schnittstellen stehen vor besonderen Herausforderungen: Benutzer können die Ausgabe nicht vorhersagen, ihre Richtigkeit nicht durch bloßes Betrachten überprüfen und oft nicht erkennen, ob das System funktioniert oder fehlerhaft ist.
Das Kernproblem
| Herkömmliche Software | AI-Software |
|---|---|
| Die Ausgabe ist vorhersehbar | Die Ausgabe variiert |
| Fehler sind offensichtlich | Fehler wirken plausibel |
| Benutzer überprüfen durch Tests | Benutzer überprüfen anhand von Quellen |
| Laden = Warten | Laden = Arbeiten (zeigen Sie es) |
| Vertrauen als Standard | Vertrauen muss verdient werden |
Quellenorientiertes Design (Perplexity)
Jede Tatsachenbehauptung muss mit ihrer Quelle verknüpft sein. Perplexity versieht jede Behauptung mit Inline-Quellenangaben [1], die eine Vorschau beim Darüberfahren sowie einen dauerhaft sichtbaren Quellenbereich bieten.
.citation-marker {
position: relative;
color: var(--accent);
cursor: pointer;
font-size: 0.8em;
vertical-align: super;
}
.citation-preview {
position: absolute;
bottom: 100%;
left: 50%;
transform: translateX(-50%);
width: 280px;
padding: 12px;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
Anti-Pattern: AI-Schnittstellen, die Behauptungen ohne nachvollziehbare Quellen erzeugen. Kann das Modell keine Quelle angeben, sollte die Schnittstelle darauf hinweisen.
Phasenanzeigen beim Streaming (Perplexity)
Zeigen Sie Benutzern, was die AI gerade tut, statt nur zu signalisieren, dass sie arbeitet. Ersetzen Sie allgemeine Ladeindikatoren durch Phasenanzeigen: „Suche läuft …“ → „4 Quellen werden gelesen …“ → „Antwort wird verfasst …“
.phase-indicator {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 6px 12px;
background: color-mix(in srgb, var(--phase-color) 10%, transparent);
border-radius: 16px;
font-size: 13px;
color: var(--phase-color);
transition: all 0.3s ease;
}
.loading-dots span {
width: 4px;
height: 4px;
background: currentColor;
border-radius: 50%;
animation: pulse 1.4s ease-in-out infinite;
}
Transparenter Umgang mit Fehlern
Wenn die AI scheitert oder unsicher ist, zeigen Sie dies deutlich – verbergen Sie es nicht hinter selbstsicher klingendem Text.
| Situation | Schlechtes Muster | Gutes Muster |
|---|---|---|
| Geringe Konfidenz | Selbstsicher darstellen | „Ich bin nicht sicher, aber …“ mit zurückhaltenderer Gestaltung |
| Keine Quellen gefunden | Text erfinden | „Ich konnte keine Quellen für diese Behauptung finden“ |
| Widersprüchliche Quellen | Unbemerkt eine auswählen | Beide anzeigen und den Widerspruch hervorheben |
| Veraltete Informationen | Als aktuell darstellen | „Stand: [Datum] …“ mit Aktualitätsindikator |
Zentrale Erkenntnis: Benutzer verzeihen einer AI, die offen mit Unsicherheit umgeht. Sie verzeihen keiner AI, die selbstsicher falsche Angaben macht.
Nachweise für agentische Arbeitsabläufe
AI-Agenten benötigen Schnittstellenzustände, die geleistete Arbeit belegen, statt bloß den Aufwand zu beschreiben. Ein guter agentischer Arbeitsablauf macht den Fortschritt anhand von Kontrollpunkten nachvollziehbar: Plan angenommen, Quellen gesammelt, Änderungen angewendet, Tests ausgeführt, Prüfung ausstehend und Veröffentlichung blockiert oder bereit.
| Agentenzustand | Schnittstellenmuster | Warum es wichtig ist |
|---|---|---|
| Planung | Explizites Ziel und Abnahmekriterien | Verhindert, dass der Agent auf Aktivität statt auf das Ergebnis optimiert |
| Recherche | Quellenliste mit Konfidenz und Aktualität | Ermöglicht Benutzern, verifizierte Fakten von vorläufigen Annahmen zu unterscheiden |
| Ausführung | Mit Kontrollpunkten verknüpfte Zusammenfassung der geänderten Dateien | Macht Änderungen überprüfbar, ohne das gesamte Protokoll lesen zu müssen |
| Verifizierung | Test-, Routen-, Screenshot- oder Laufzeitnachweise | Trennt Belege von künstlicher Selbstsicherheit |
| Veröffentlichung | Status von Freigabe, Deployment oder nativer Prüfung | Verhindert, dass eine Veröffentlichung unfertige Arbeit hinter erfolgreichen lokalen Prüfungen verbirgt |
Anti-Pattern: Ein einziger „Erledigt“-Zustand für mehrstufige Agentenarbeit. Komplexe Arbeit benötigt eine sichtbare Nachweiskette: was geändert wurde, wodurch es belegt ist, was bewusst abgelehnt wurde und was weiterhin menschliches Urteilsvermögen erfordert.
Dieter Rams: Zehn Prinzipien
„Weniger, aber besser.“ — Dieter Rams
Dieter Rams ist der einflussreichste Industriedesigner des 20. Jahrhunderts. Als Designchef von Braun schuf er von 1961 bis 1995 Produkte, die auch Jahrzehnte später zeitlos wirken. Seine Arbeit inspirierte unmittelbar die Designsprache von Apple.
Die zehn Prinzipien guten Designs
1. Gutes Design ist innovativ Kopieren Sie nicht. Verbinden Sie technologischen Fortschritt mit innovativem Design.
2. Gutes Design macht ein Produkt brauchbar Jedes Element muss einem Zweck dienen. Die Form folgt der Funktion.
3. Gutes Design ist ästhetisch Schönheit ist nicht oberflächlich – sie ist wesentlich. Produkte, die wir täglich verwenden, beeinflussen unser Wohlbefinden.
4. Gutes Design macht ein Produkt verständlich Benutzer sollten keine Anleitung benötigen. Die Schnittstelle erklärt sich selbst.
5. Gutes Design ist unaufdringlich Design sollte unterstützen, nicht überwältigen. Die Inhalte des Benutzers stehen im Mittelpunkt, nicht Ihre UI.
/* Obtrusive: UI competes with content */
.editor {
background: linear-gradient(135deg, purple, blue);
border: 3px dashed gold;
}
/* Unobtrusive: UI recedes, content shines */
.editor {
background: var(--color-background);
border: 1px solid var(--color-border);
}
6. Gutes Design ist ehrlich Verwenden Sie keine Dark Patterns. Versprechen Sie nicht zu viel. Kommunizieren Sie Einschränkungen transparent.
7. Gutes Design ist langlebig Vermeiden Sie Trends, die schnell veralten. Zeitlos statt modisch.
TRENDY (will date): TIMELESS:
- Extreme glassmorphism - Clean typography
- Neon colors, glitch effects - Subtle elevation
- Aggressive gradients - Neutral palette with considered accent
8. Gutes Design ist konsequent bis ins letzte Detail Nichts darf willkürlich sein. Ladezustände, Leerzustände, Fehlerzustände – alles ist gestaltet.
9. Gutes Design ist umweltfreundlich Performance ist ein Umweltfaktor. Respektieren Sie die Aufmerksamkeit der Benutzer. Schreiben Sie effizienten Code.
10. Gutes Design ist so wenig Design wie möglich Entfernen Sie alles, was nicht notwendig ist. Das beste Design ist unsichtbar.
Web Patterns 2026
Natives CSS ersetzt inzwischen JavaScript bei immer mehr Layout- und Interaktionsproblemen. In den Jahren 2025–2026 kamen Anchor Positioning, scrollgesteuerte Animationen und @starting-style in produktiv einsetzbare Browser; Mitte 2026 folgten die automatische Größenanpassung von Formularelementen, Gap-Dekorationen und die automatische Textanpassung.
Dabei ist der Unterstützungsstatus wichtiger als die Neuheit. Eine Funktion, die nur in einer Engine verfügbar ist, eignet sich als progressive Verbesserung; auf einer Funktion mit dem Status „Baseline Newly available“ können Sie bedenkenlos aufbauen. Die folgende Tabelle unterscheidet beide Kategorien mit Stand August 2026.
| Funktion | Chrome | Firefox | Safari | Status |
|---|---|---|---|---|
field-sizing |
123 | 152 | 26.2 | Baseline Newly available |
shape-outside: rect() / xywh() |
149 | 149 | 17.2 | Baseline Newly available |
background-clip: border-area |
150 | — | 18.2 | Zwei Engines |
Gap-Dekorationen (column-rule in Grid/Flexbox) |
149 | — | — | Nur Chrome |
text-fit |
150 | — | — | Nur Chrome |
focusgroup |
150 | — | — | Nur Chrome |
Quellen: Neu auf der Webplattform im Juni und Juli, web.dev.
Container Queries
Passen Sie die Größe von Komponenten anhand ihres Containers und nicht anhand des Viewports an.
.card-grid {
container-type: inline-size;
container-name: card-grid;
}
.card {
display: grid;
gap: 16px;
padding: 20px;
}
@container card-grid (min-width: 400px) {
.card {
grid-template-columns: auto 1fr;
}
}
@container card-grid (min-width: 600px) {
.card {
padding: 32px;
gap: 24px;
}
}
Der Selektor :has()
Auswahl eines Elternelements anhand seiner Kindelemente – zuvor ohne JavaScript nicht möglich.
/* Card with image gets different padding */
.card:has(img) {
padding: 0;
}
.card:has(img) .card-content {
padding: 20px;
}
/* Form group with error */
.form-group:has(.input:invalid) .form-label {
color: var(--color-error);
}
/* Highlight navigation when on that page */
.nav-item:has(a[aria-current="page"]) {
background: var(--color-surface);
}
CSS-Verschachtelung
Native Verschachtelung ohne Präprozessoren.
.card {
background: var(--color-surface);
border-radius: 12px;
padding: 24px;
& .card-title {
font-size: 1.25rem;
font-weight: 600;
margin-bottom: 8px;
}
& .card-body {
color: var(--color-text-secondary);
line-height: 1.6;
}
&:hover {
box-shadow: var(--shadow-md);
}
@media (min-width: 768px) {
padding: 32px;
}
}
Gap-Dekorationen
Abstände in Grid- und Flexbox-Layouts können eigene Linien erhalten. Dadurch sind weder Pseudoelemente noch Rahmen an jedem Kindelement oder ein Wrapper pro Spalte für Trennlinien erforderlich. Die Funktion ist nur in Chrome 149 und neuer verfügbar und eignet sich deshalb als progressive Verbesserung, nicht als Grundlage.
.pricing-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 32px;
/* Vertical rules between columns, horizontal between rows */
column-rule: 1px solid var(--color-border);
row-rule: 1px solid var(--color-border);
}
Beim bisherigen Ansatz erhielt jedes Element außer dem ersten einen border-left. Sobald das Grid in eine zweite Zeile umbrach, funktionierte dies nicht mehr. Gap-Dekorationen zeichnen direkt im Abstand, sodass die Darstellung auch bei Umbrüchen korrekt bleibt.
Da die Funktion nur von einer Engine unterstützt wird, sollten Sie diese Linien ausschließlich als Dekoration behandeln und niemals als einziges Mittel zur inhaltlichen Abgrenzung. Wird ein Layout ohne sie missverständlich, funktioniert es in Firefox und Safari nicht ausreichend.
Formularelemente, die sich an ihren Inhalt anpassen
Mit field-sizing: content können Eingabefelder, Textbereiche und Auswahlfelder entsprechend den Eingaben der Benutzer wachsen und schrumpfen. Damit entfällt das auf der Scrollhöhe basierende JavaScript, das in jeder Codebasis neu implementiert wird.
.comment-box {
field-sizing: content;
min-height: 3lh; /* floor: three lines */
max-height: 12lh; /* ceiling: then scroll */
}
.tag-input {
field-sizing: content;
min-width: 8ch;
}
Kombinieren Sie die Eigenschaft immer mit min--/max-Grenzen. Ohne Mindestgröße schrumpft ein leeres Feld auf nahezu nichts zusammen; ohne Höchstgröße kann ein langer eingefügter Text die Schaltfläche zum Absenden aus dem sichtbaren Bereich schieben.
Diese Funktion erreichte im Juni 2026 den Status „Baseline Newly available“ und kann daher sicher als primärer Mechanismus statt nur als Verbesserung eingesetzt werden.
Text, der in seinen Rahmen passt
text-fit skaliert die Schriftgröße so, dass der Text die Breite seines Containers ausfüllt. Das eignet sich für große Überschriften und Kennzahlen in Dashboards, für die zuvor ein Messskript erforderlich war.
.stat-value {
text-fit: consistent; /* one size for the whole box */
}
Nur Chrome 150. Legen Sie zuerst eine normale font-size fest, damit andere Engines eine bewusst gewählte statt der voreingestellten Größe verwenden:
.stat-value {
font-size: clamp(2rem, 8vw, 6rem); /* the real answer everywhere */
text-fit: consistent; /* refinement where supported */
}
clamp() deckt bereits die meisten Anwendungsfälle ab, für die diese Funktion in Betracht gezogen wird, und wird universell unterstützt. Verwenden Sie text-fit, wenn die Inhaltslänge so stark variiert, dass keine einzelne Clamp-Einstellung ausreicht.
Verlaufsrahmen ohne Umgehungslösung
background-clip: border-area zeichnet einen Hintergrund in die Rahmenbox. Dadurch lassen sich Verlaufsrahmen mit zwei Zeilen umsetzen, statt ein verschachteltes Element oder einen Trick mit mask-composite zu benötigen.
.featured-card {
border: 2px solid transparent;
border-radius: 12px;
background:
linear-gradient(var(--color-surface), var(--color-surface)) padding-box,
linear-gradient(135deg, #6366f1, #ec4899) border-area;
}
Chrome 150 und Safari 18.2; Firefox unterstützt die Funktion noch nicht. Deklarieren Sie zuerst eine einfarbige border-color, damit die Ausweichdarstellung einen sichtbaren und keinen transparenten Rahmen erhält.
Navigation mit Pfeiltasten ohne Keydown-Handler
Das Attribut focusgroup teilt dem Browser mit, dass eine Gruppe von Steuerelementen eine gemeinsame Tastatureinheit bildet: Mit Tab gelangen Sie einmal in die Gruppe, mit den Pfeiltasten bewegen Sie sich innerhalb der Gruppe und mit Tab verlassen Sie sie wieder. Symbolleisten, Tab-Leisten, segmentierte Steuerelemente und schaltflächenbasierte Optionsgruppen benötigen dieses Verhalten. Gerade bei selbst entwickelten Komponenten wird es jedoch häufig fehlerhaft umgesetzt.
<div role="toolbar" focusgroup="wrap">
<button>Bold</button>
<button>Italic</button>
<button>Underline</button>
</div>
Mit wrap führt die Pfeiltaste beim letzten Element wieder zum ersten. Standardmäßig endet die Navigation an den beiden Enden.
Da die Funktion nur in Chrome 150 verfügbar ist, sollten Sie den bestehenden Keydown-Handler beibehalten, bis sie breiter unterstützt wird. Das Attribut sollten Sie dennoch bereits kennen, denn es beschreibt das barrierefreie Verhalten präzise: Eine Symbolleiste sollte einen einzigen und nicht fünf Tabstopps bilden – diese Erwartung besteht schon seit Jahrzehnten. Die ARIA Authoring Practices beschreiben das Muster unabhängig davon, wie es implementiert wird.
HTMX-Integration
Servergesteuerte Interaktivität ohne umfangreiche JavaScript-Frameworks.
<!-- Load content on click -->
<button hx-get="/api/more-items"
hx-target="#item-list"
hx-swap="beforeend"
hx-indicator="#loading">
Load More
</button>
<!-- Form with inline validation -->
<form hx-post="/api/contact"
hx-target="#form-response"
hx-swap="outerHTML">
<input type="email" name="email"
hx-post="/api/validate-email"
hx-trigger="blur"
hx-target="next .error" />
<span class="error"></span>
</form>
Anchor Positioning
Native Positionierung mit CSS eines Elements relativ zu einem anderen – ohne JavaScript. Geeignet für Tooltips, Popover und Dropdown-Menüs, die ihrem Auslöser folgen.
/* Anchor an element to another */
.trigger {
anchor-name: --my-trigger;
}
.tooltip {
position: fixed;
position-anchor: --my-trigger;
top: anchor(bottom);
left: anchor(center);
translate: -50% 8px;
}
Scrollgesteuerte Animationen
Verknüpfen Sie den Animationsfortschritt mit der Scrollposition. So lassen sich Lesefortschrittsanzeigen, Parallaxeffekte und Einblendsequenzen ohne JavaScript umsetzen.
/* Reading progress bar */
.progress-bar {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 3px;
background: var(--color-primary);
transform-origin: left;
animation: progress linear;
animation-timeline: scroll();
}
@keyframes progress {
from { transform: scaleX(0); }
to { transform: scaleX(1); }
}
@starting-style
Definieren Sie Anfangsstile für Elemente, die in das DOM eingefügt werden. Dadurch werden ausschließlich mit CSS umgesetzte Eintrittsanimationen ohne JavaScript möglich.
.card {
opacity: 1;
transform: translateY(0);
transition: opacity 0.3s ease, transform 0.3s ease;
@starting-style {
opacity: 0;
transform: translateY(10px);
}
}
Design-Token-System
Ein vollständiges Token-System für ein einheitliches Erscheinungsbild in Ihrer gesamten Anwendung.
:root {
/* Colors */
--color-text: #1a1a1a;
--color-text-secondary: #666666;
--color-text-muted: #999999;
--color-background: #ffffff;
--color-surface: #f8f9fa;
--color-surface-elevated: #ffffff;
--color-border: #e5e7eb;
--color-primary: #3b82f6;
--color-primary-hover: #2563eb;
--color-success: #10b981;
--color-warning: #f59e0b;
--color-error: #ef4444;
/* Typography */
--font-sans: system-ui, -apple-system, sans-serif;
--font-mono: "SF Mono", Consolas, monospace;
--text-xs: 0.75rem;
--text-sm: 0.875rem;
--text-base: 1rem;
--text-lg: 1.125rem;
--text-xl: 1.25rem;
--text-2xl: 1.5rem;
--text-3xl: 2rem;
--leading-tight: 1.25;
--leading-normal: 1.5;
--leading-relaxed: 1.75;
/* Spacing (8px base) */
--space-1: 0.25rem; /* 4px */
--space-2: 0.5rem; /* 8px */
--space-3: 0.75rem; /* 12px */
--space-4: 1rem; /* 16px */
--space-6: 1.5rem; /* 24px */
--space-8: 2rem; /* 32px */
--space-12: 3rem; /* 48px */
--space-16: 4rem; /* 64px */
/* Borders */
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-full: 9999px;
/* Shadows */
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07);
--shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
/* Transitions */
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
--duration-fast: 100ms;
--duration-normal: 200ms;
}
Dunkelmodus richtig umgesetzt
Invertieren Sie nicht einfach nur die Farben – gestalten Sie die Oberfläche für dunkle Umgebungen neu.
@media (prefers-color-scheme: dark) {
:root {
/* Neutrals */
--color-background: hsl(220, 13%, 10%);
--color-surface: hsl(220, 13%, 15%);
--color-surface-elevated: hsl(220, 13%, 18%);
--color-border: hsl(220, 13%, 23%);
/* Text (inverted) */
--color-text: hsl(220, 9%, 93%);
--color-text-secondary: hsl(220, 9%, 70%);
--color-text-muted: hsl(220, 9%, 55%);
/* Adjust saturation for dark mode */
--color-primary: hsl(220, 80%, 60%);
--color-success: hsl(142, 70%, 45%);
--color-error: hsl(0, 80%, 65%);
/* Shadows in dark mode need adjustment */
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.4);
}
}
Grundprinzipien des Dunkelmodus: - Reduzieren Sie die Sättigung großer Flächen - Erhöhen Sie die Helligkeit von Akzentfarben - Verstärken Sie Schatten (sie benötigen mehr Kontrast) - Gestalten Sie den Dunkelmodus bewusst und nicht erst im Nachhinein
Figma-Extraktionsworkflows
Um Designdateien in produktionsreifen Code umzuwandeln, müssen Design-Tokens – Farben, Typografie, Abstände und Effekte, die Ihre Designsprache prägen – systematisch extrahiert werden.
Export von Figma-Variablen
Die native Variables-Funktion von Figma bietet den direktesten Weg für die Extraktion:
Exportschritte:
1. Öffnen Sie in der Figma-Datei den Bereich „Local Variables“ und anschließend die Sammlung
2. Klicken Sie mit der rechten Maustaste auf einen Modus → „Export mode“ (oder mit der rechten Maustaste auf die Sammlung → „Export modes“ – Sie erhalten eine JSON-Datei pro Modus)
3. Speichern Sie die exportierte(n) Datei(en), z. B. als figma-variables.json
Sowohl der native Export als auch der Import von Figma entsprechen dem DTCG-Format – mit $value-/$type-Schlüsseln und durch / verbundenen Gruppennamen. Beim Import werden ausschließlich Tokens in dieser Struktur akzeptiert.
JSON-Token-Struktur:
{
"colors": {
"primitive": {
"blue-500": { "$value": "#3b82f6", "$type": "color" },
"blue-600": { "$value": "#2563eb", "$type": "color" }
},
"semantic": {
"primary": { "$value": "{colors.primitive.blue-500}", "$type": "color" },
"primary-hover": { "$value": "{colors.primitive.blue-600}", "$type": "color" }
}
},
"spacing": {
"1": { "$value": "4px", "$type": "spacing" },
"2": { "$value": "8px", "$type": "spacing" },
"4": { "$value": "16px", "$type": "spacing" }
}
}
Transformation von Tokens in CSS
Benutzerdefinierte CSS-Eigenschaften:
:root {
/* Primitive colors (direct values) */
--color-blue-50: #eff6ff;
--color-blue-100: #dbeafe;
--color-blue-500: #3b82f6;
--color-blue-600: #2563eb;
--color-blue-900: #1e3a8a;
/* Semantic colors (reference primitives) */
--color-primary: var(--color-blue-500);
--color-primary-hover: var(--color-blue-600);
--color-background: var(--color-white);
--color-surface: var(--color-gray-50);
/* Spacing (8px grid) */
--space-1: 0.25rem; /* 4px */
--space-2: 0.5rem; /* 8px */
--space-4: 1rem; /* 16px */
--space-6: 1.5rem; /* 24px */
--space-8: 2rem; /* 32px */
/* Typography */
--font-size-sm: 0.875rem;
--font-size-base: 1rem;
--font-size-lg: 1.125rem;
--line-height-tight: 1.25;
--line-height-normal: 1.5;
/* Effects */
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07);
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
}
Tokens für den Dunkelmodus:
@media (prefers-color-scheme: dark) {
:root {
--color-background: var(--color-gray-900);
--color-surface: var(--color-gray-800);
--color-text: var(--color-gray-100);
--color-text-secondary: var(--color-gray-400);
/* Adjusted shadows for dark mode */
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.4);
}
}
Transformation von Tokens in SwiftUI
Farberweiterung:
import SwiftUI
extension Color {
// MARK: - Primitive Colors
static let blue50 = Color(hex: "eff6ff")
static let blue500 = Color(hex: "3b82f6")
static let blue600 = Color(hex: "2563eb")
// MARK: - Semantic Colors
static let brandPrimary = Color.blue500
static let brandPrimaryHover = Color.blue600
// MARK: - Surface Colors
static let surfaceBackground = Color(light: .white, dark: Color(hex: "0f172a"))
static let surfaceElevated = Color(light: Color(hex: "f8fafc"), dark: Color(hex: "1e293b"))
}
extension Color {
init(hex: String) {
// Standard hex parsing implementation
}
init(light: Color, dark: Color) {
self.init(UIColor { traits in
traits.userInterfaceStyle == .dark ? UIColor(dark) : UIColor(light)
})
}
}
Abstandskonstanten:
enum Spacing {
static let xs: CGFloat = 4 // --space-1
static let sm: CGFloat = 8 // --space-2
static let md: CGFloat = 16 // --space-4
static let lg: CGFloat = 24 // --space-6
static let xl: CGFloat = 32 // --space-8
}
// Usage
VStack(spacing: Spacing.md) {
// ...
}
.padding(Spacing.lg)
Checkliste für die Designerübergabe
Was Designer exportieren sollten:
| Asset-Typ | Format | Hinweise |
|---|---|---|
| Farben | Variablen-JSON | Hellen und dunklen Modus einschließen |
| Typografie | Stilexport | Schriftart, Größe, Gewicht, Zeilenhöhe |
| Abstände | Variablen-JSON | Basiseinheit dokumentieren |
| Symbole | SVG | Konturiert, einfarbig |
| Bilder | PNG @2x/@3x oder WebP | Mit Komprimierung |
| Komponenten | Figma-Links | Als Referenz während der Implementierung |
Kriterien für die Qualitätsprüfung:
- [ ] Alle Farben sind als Variablen definiert (keine fest codierten Hex-Werte)
- [ ] Die Typografie verwendet definierte Textstile
- [ ] Die Abstände folgen dem Rastersystem (8px-Basis)
- [ ] Varianten für den Dunkelmodus sind vorhanden
- [ ] Interaktionszustände sind dokumentiert (hover, active, disabled)
- [ ] Responsive Breakpoints sind gekennzeichnet
- [ ] Barrierefreiheitsanforderungen sind vermerkt (Kontrastverhältnisse)
Entwickler erhalten:
- Token-Dateien (JSON/CSS/Swift, abhängig von der Plattform)
- Komponentenspezifikationen mit Maßangaben
- Asset-Exporte in den erforderlichen Formaten
- Interaktionsdokumentation (Zustände, Animationen)
- Anmerkungen zur Barrierefreiheit
Schnellreferenztabellen
Gestalt-Prinzipien
| Prinzip | Regel | Anwendung |
|---|---|---|
| Nähe | Zusammengehöriges = nah beieinander | Formulare, Abschnitte |
| Ähnlichkeit | Gleiches Aussehen = gleiche Funktion | Schaltflächen, Karten |
| Figur-Grund | Klare Trennung der Ebenen | Modalfenster, Karten |
| Kontinuität | Linien folgen | Zeitleisten, Ausrichtung |
| Geschlossenheit | Das Gehirn vervollständigt Formen | Symbole, Scrollhinweise |
Typografie
| Element | Größe | Gewicht | Zeilenhöhe |
|---|---|---|---|
| Fließtext | 16px | 400 | 1,5–1,7 |
| Überschriften | 24-48px | 600-700 | 1,1–1,2 |
| UI-Beschriftungen | 12-14px | 500 | 1,3–1,4 |
| Bildunterschriften | 12px | 400 | 1,4 |
Farbrollen
| Rolle | Heller Modus | Dunkler Modus |
|---|---|---|
| Hintergrund | #ffffff | #0f172a |
| Oberfläche | #f4f5f7 | #1e293b |
| Rahmen | #e4e6ea | #334155 |
| Text | #1a1a2e | #f1f5f9 |
| Gedämpfter Text | #6b7280 | #94a3b8 |
| Primärfarbe | #3b82f6 | #60a5fa |
| Erfolg | #22c55e | #4ade80 |
| Fehler | #ef4444 | #f87171 |
Abstandsskala
| Token | Wert | Anwendung |
|---|---|---|
| –space-1 | 4px | Abstände zwischen Symbolen |
| –space-2 | 8px | Inline-Elemente |
| –space-4 | 16px | Standardabstände |
| –space-6 | 24px | Innenabstand von Karten |
| –space-8 | 32px | Abstände zwischen Abschnitten |
| –space-16 | 64px | Seitenabschnitte |
Designcheckliste
Prüfen Sie vor der Veröffentlichung jeder Benutzeroberfläche:
Gestalt
- [ ] Zusammengehörige Elemente stehen näher beieinander als nicht zusammengehörige (Nähe)
- [ ] Ähnliche Funktionen weisen ähnliche Stile auf (Ähnlichkeit)
- [ ] Vorder- und Hintergrund sind klar voneinander getrennt (Figur-Grund)
- [ ] Der Blick wird auf natürliche Weise durch das Layout geführt (Kontinuität)
Typografie
- [ ] Die Basisschriftgröße beträgt mindestens 16px
- [ ] Die Zeilenhöhe für Fließtext beträgt mindestens 1,5
- [ ] Die Zeilenlänge liegt unter 75 Zeichen
- [ ] Die Hierarchie ist eindeutig (3 unterscheidbare Ebenen)
- [ ] Durchgehend wird eine einheitliche Skala verwendet
Farbe
- [ ] Sämtlicher Text erfüllt das Kontrastverhältnis von 4,5:1 (WCAG AA)
- [ ] Farbe ist nicht der einzige Indikator (auch Symbole/Beschriftungen verwenden)
- [ ] Der Dunkelmodus wurde bewusst gestaltet
- [ ] Die 60-30-10-Verteilung wird eingehalten
Visuelle Hierarchie
- [ ] Das wichtigste Element lässt sich eindeutig erkennen
- [ ] Der Blick folgt der vorgesehenen Reihenfolge
- [ ] Pro Abschnitt gibt es einen klaren CTA
- [ ] Die Typografieskala ist einheitlich
Abstände
- [ ] Alle Abstände verwenden eine definierte Skala (keine willkürlichen Werte)
- [ ] Karten/Komponenten weisen einheitliche Innenabstände auf
- [ ] Die Abstände auf Mobilgeräten sind angenehm
- [ ] Die Rasterausrichtung ist einheitlich (8px-Basis)
Interaktion
- [ ] Können Benutzer ihre Ziele erreichen, ohne über das Werkzeug nachdenken zu müssen?
- [ ] Passt sich die UI an den aktuellen Kontext an?
- [ ] Sind Werkzeuge nur sichtbar, wenn sie relevant sind?
- [ ] Vermittelt die wiederholte Nutzung schnellere Methoden?
AI-Benutzeroberflächen
- [ ] Jede Tatsachenbehauptung verfügt über eine nachvollziehbare Quelle
- [ ] Beim Streaming werden die Prozessphasen angezeigt, nicht nur ein Ladekreisel
- [ ] Fehlerzustände werden transparent dargestellt und nicht verborgen
- [ ] Ergebnisse mit geringer Konfidenz sind visuell gekennzeichnet
Dieter-Rams-Prüfung
- [ ] Lässt sich etwas entfernen?
- [ ] Erfüllt jedes Element eine Funktion?
- [ ] Würde dies in 5 Jahren veraltet wirken?
- [ ] Habe ich jeden Zustand gestaltet?
Ressourcen
Bücher: - As Little Design as Possible von Sophie Lovell (Dieter Rams) - The Elements of Typographic Style von Robert Bringhurst
Werkzeuge: - WebAIM Contrast Checker - Type Scale Generator - Figma Tokens Studio — Verwaltung von Design-Tokens
Designsysteme: - Apple HIG - Material Design 3 - Radix UI - shadcn/ui
Designstudien
Detaillierte Analysen von 48 herausragenden Produkten, die nachahmenswerte Muster und Prinzipien dokumentieren.
Entwicklertools & AI
| Produkt | Wichtigster Beitrag |
|---|---|
| Figma | Präsenz mehrerer Benutzer, kontextsensitive Bedienfelder |
| Warp | Blockbasiertes Terminal, CLI-GUI-Brücke |
| Framer | Visuelles responsives Design, Eigenschaftssteuerung |
| Vercel | Hervorragender Dunkelmodus, dezente Statusanzeige |
| Linear | Optimistic UI, tastaturorientierter Arbeitsablauf |
| Raycast | Erweiterungssystem, Schnellaktionen |
| Stripe | Hervorragende Dokumentation, API-Design |
| Perplexity | AI mit Zitaten im Vordergrund, Streaming-Phasen |
| Obsidian | Local-First-Komponierbarkeit, Wissensgraph-Oberflächen |
Apple-native Anwendungen & Kreativtools
| Produkt | Wichtigster Beitrag |
|---|---|
| Flighty | 15 intelligente Zustände, Live Activities, Datenvisualisierung |
| Halide | Intelligente Aktivierung, Gestensteuerung |
| Bear | Typografieorientiertes Design, Inline-Tags |
| Craft | Native-First-Ansatz für mehrere Plattformen, verschachtelte Seiten |
| Things | Aufschubdaten, Muster zur Schnellerfassung |
| Darkroom | Immersive dunkle UI, fotobasierte Bearbeitung |
| Procreate | Gestenorientierte Kreativtools |
| Overcast | Unsichtbare Audiotechnik als Oberflächendesign |
| Camo | Professionelle UI für die Videoproduktion |
| Ivory | Sorgfältig gestaltete Timeline, spielerische Präzision |
| Anybox | Plattformnative Transparenz |
| Drafts | Klarheit durch textorientierte Erfassung |
| Notion Calendar | Präzise Kalenderführung, Arbeitsbereichsintegration |
Produktivität, Wissen & Finanzen
| Produkt | Wichtigster Beitrag |
|---|---|
| Superhuman | 100-ms-Regel, Einführung in die Befehlspalette, praxisorientiertes Onboarding |
| Notion | Blocksystem, Slash-Befehle |
| Arc | Bereiche, geteilte Ansicht, Befehlsleiste |
| Todoist | Warmer Minimalismus, maximale Zurückhaltung |
| Amie | Freude an Produktivität, warmer Minimalismus |
| Loom | Sympathische Professionalität bei asynchronen Videos |
| Pitch | Ausdrucksstarke Designsprache für Präsentationen |
| Readwise Reader | Werkzeuge für vertieftes Lesen, kosmisches Branding |
| Copilot Money | Filmreife Visualisierung von Finanzdaten |
| 1Password | Reibungslose Sicherheit |
| Mercury | Filmreife Eleganz im Banking |
Verbraucherprodukte, soziale Netzwerke & Vertrauen
| Produkt | Wichtigster Beitrag |
|---|---|
| Spotify | Farbe, Emotion und Skalierung |
| Duolingo | Gamification als Designsprache |
| Signal | Sicherheit durch Einfachheit |
| Airbnb | Vertrauen im Maßstab eines Marktplatzes |
| Bluesky | Algorithmische Transparenz |
| Letterboxd | Film als soziales Objekt |
| Strava | GPS-Daten als soziale Währung |
| Apple Music | Redaktionelle Stimme, räumlicher Klang |
| Headspace | Ruhe als Oberflächenstrategie |
| Zomato | Persönlichkeitsgeprägte Food-UX |
Physische Produkte, Spiele & Barrierefreiheit
| Produkt | Wichtigster Beitrag |
|---|---|
| Balatro | Feedbackschleifen, Systeme für das Spielgefühl |
| Rivian | Abenteuerfotografie und monumentale Typografie |
| Teenage Engineering | Beschränkungen als ästhetische Identität |
| OKO | Audio-haptische Barrierefreiheit |
| CARROT Weather | Persönlichkeit als Differenzierungsmerkmal einer Dienstprogramm-App |
Dieser Leitfaden wächst durch die Praxis. Designprinzipien sind zeitlos, doch ihre Anwendung entwickelt sich mit Technologie und Verständnis weiter.