Communitygithub.com

ZainR525/PersonalWebsiteZainRizvi

Apples Ansatz für Interface-Design und flüssige, physische Bewegung, übersetzt für das Web. Verwenden Sie dies beim Erstellen oder Überprüfen von gestengesteuerten Benutzeroberflächen, Federanimationen, Drag-/Wisch-/Sheet-Interaktionen, Momentum und unterbrechbaren Übergängen, durchscheinenden Materialien und Tiefe, Typografie (optische Größenanpassung, Tracking, Durchschuss), reduzierter Bewegung oder den Design-Grundlagen (Feedback, räumliche Konsistenz, Zurückhaltung) hinter Apple-ähnlichen Oberflächen.

Was ist PersonalWebsiteZainRizvi?

Diese Fähigkeit bietet eine umfassende Anleitung zum Erstellen von flüssigen, Apple-ähnlichen Benutzeroberflächen im Web, basierend auf Erkenntnissen aus Apples WWDC-Design-Vorträgen, insbesondere dem Vortrag „Designing Fluid Interfaces“ (WWDC 2018). Der Schwerpunkt liegt auf zentralen Prinzipien wie sofortiger Reaktion auf Benutzereingaben, direkter Manipulation mit 1:1-Tracking und der entscheidenden Bedeutung von Unterbrechbarkeit, bei der Animationen jederzeit gegriffen und umgekehrt werden können. Es werden Federanimationen (Springs) gegenüber herkömmlichen Animationen mit fester Dauer bevorzugt, da sie geschwindigkeitsbewusst sind und eine nahtlose Übergabe der Geschwindigkeit (Velocity Handoff) zwischen Gesten und Animationen ermöglichen. Die Fähigkeit geht auch auf praktische Umsetzungen für das Web ein, wie z. B. die Verwendung von Pointer Events anstelle von Klick-Ereignissen, die Implementierung von Momentum-Projektion für Wischgesten und die Anwendung von Gummiband-Effekten (Rubber-banding) an Grenzen. Es werden konkrete Codebeispiele und CSS-Regeln bereitgestellt, und es wird die Verwendung von Bibliotheken wie Motion oder Framer Motion empfohlen, um Federanimationen auf der Webplattform zu implementieren. Das Ziel ist es, Schnittstellen zu schaffen, die sich nicht wie ein Computer, sondern wie eine nahtlose Erweiterung des Benutzers anfühlen.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ZainR525/PersonalWebsiteZainRizvi/tree/HEAD/.claude/skills/apple-design

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Apple Design

Erstantwort

Wenn diese Fähigkeit zum ersten Mal ohne eine spezifische Frage aufgerufen wird, antworten Sie nur mit:

Ich bin bereit, Ihnen beim Erstellen flüssiger, Apple-ähnlicher Oberflächen im Web zu helfen. Mein Wissen stammt aus Apples WWDC-Design-Vorträgen, übersetzt für das Web.

Geben Sie keine weiteren Informationen, bis der Benutzer eine Frage stellt.

Wie Apple Schnittstellen baut, die sich nicht mehr wie ein Computer anfühlen, sondern wie eine Erweiterung Ihrer selbst. Dieses Wissen stammt aus Apples WWDC-Design-Vorträgen – hauptsächlich Designing Fluid Interfaces (WWDC 2018) – destilliert und auf die Webplattform übertragen (CSS, Pointer Events, requestAnimationFrame, Federbibliotheken wie Motion/Framer Motion).

Der rote Faden: Eine Schnittstelle fühlt sich lebendig an, wenn die Bewegung vom aktuellen Bildschirmwert ausgeht, die Geschwindigkeit des Benutzers übernimmt, den Schwung nach vorne projiziert und jederzeit gegriffen und umgekehrt werden kann. Federn (Springs) sind das Werkzeug, das all dies natürlich macht, da sie von Natur aus unterbrechbar und geschwindigkeitsbewusst sind.

Die Kernidee

„Wenn wir die Schnittstelle an die Art und Weise anpassen, wie wir denken und uns bewegen, geschieht etwas Magisches – sie hört auf, sich wie ein Computer anzufühlen, und beginnt, sich wie eine nahtlose Erweiterung unserer selbst anzufühlen.“

Eine Schnittstelle ist flüssig, wenn sie sich wie die physische Welt verhält: Dinge reagieren sofort, bewegen sich kontinuierlich, tragen Schwung, widerstehen an Grenzen und können mitten in der Bewegung umgeleitet werden. Alles untenstehende ist ein Weg, um dem näher zu kommen.

Apple betrachtet Design als die Erfüllung von vier menschlichen Bedürfnissen: Sicherheit/Vorhersagbarkeit, Verständnis, Leistung und Freude. Jede hier genannte Regel dient einem davon.

1. Reaktion – Latenz eliminieren

Sobald eine Verzögerung auftritt, fällt das Gefühl der Direktheit „von einer Klippe“. Reaktion ist das Fundament, auf dem alles andere aufbaut.

  • Reagieren Sie bei Pointer-Down, nicht bei Loslassen. Heben Sie einen Knopf sofort hervor, wenn er gedrückt wird. Auf click/Touch-up zu warten, um Feedback zu zeigen, fühlt sich tot an.
  • Seien Sie wachsam gegenüber jeder Latenz. Überprüfen Sie Debounces, künstliche Timer, Übergangswartezeiten und die ~300ms Tippverzögerung. Alles auf dem Eingabepfad, was nicht wesentlich ist, ist ein Rückschritt.
  • Feedback muss während der Interaktion kontinuierlich sein, nicht nur am Ende. Ziehen Sie bei einem Drag, Schieberegler oder Drawer die UI 1:1 mit dem Zeiger mit – animieren Sie nie erst, wenn die Geste abgeschlossen ist.
/* Feedback lebt auf dem Druck und es ist sofort */
.button:active {
  transform: scale(0.97);
  transition: transform 100ms ease-out;
}

2. Direkte Manipulation – 1:1-Verfolgung

„Berührung und Inhalt sollten sich zusammen bewegen.“

Wenn der Benutzer etwas zieht, muss es am Finger kleben bleiben – und den Versatz von der Stelle respektieren, an der es gegriffen wurde. Ein Einrasten in der Mitte des Elements beim Greifen zerstört die Illusion sofort.

  • Verwenden Sie Pointer Events mit setPointerCapture, damit die Verfolgung fortgesetzt wird, auch wenn der Zeiger die Grenzen des Elements verlässt.
  • Verfolgen Sie einen kurzen Geschwindigkeits-/Positionsverlauf (die letzten paar pointermove-Ereignisse), nicht nur den aktuellen Punkt – Sie benötigen die Geschwindigkeit beim Loslassen.
el.addEventListener('pointerdown', (e) => {
  el.setPointerCapture(e.pointerId);
  const grabOffset = e.clientY - el.getBoundingClientRect().top; // respektieren, wo gegriffen wurde
  // ...Position + Zeitstempel-Verlauf für Geschwindigkeit verfolgen
});

3. Unterbrechbarkeit – das mit Abstand wichtigste Prinzip

„Der Gedanke und die Geste passieren parallel.“

Jede Animation muss unterbrechbar und jederzeit umleitbar sein. Ein Benutzer muss in der Lage sein, ein sich bewegendes Element mitten im Flug zu greifen und umzukehren, ohne auf das Ende der Animation warten zu müssen. Ein schließendes Modal, das der Benutzer erneut greift, sollte dem Finger folgen – nicht zuerst fertig schließen und dann wieder öffnen.

  • Sperren Sie niemals Eingaben während eines Übergangs.
  • Animieren Sie immer vom aktuellen (Präsentations-)Wert, niemals vom Zielwert. Beim Unterbrechen lesen Sie die live auf dem Bildschirm angezeigte Transformation des Elements aus und starten die neue Animation von dort aus. Wenn Sie vom logischen/Zielwert aus starten, entsteht ein sichtbarer Sprung.
  • Vermeiden Sie CSS-Übergänge und @keyframes für alles, was gestengesteuert ist – sie können nicht sanft mitten im Flug gegriffen und umgekehrt werden. Federn animieren standardmäßig vom aktuellen Wert, was genau das ist, was Unterbrechung benötigt.
  • Wenn eine Geste umkehrt, mischen Sie die Geschwindigkeit – schneiden Sie sie nicht hart ab. Das Ersetzen einer Animation durch eine andere bei einer Umkehrung erzeugt eine Geschwindigkeitsdiskontinuität, eine „Mauer“. Federbibliotheken, die die Geschwindigkeit bei einer Neuausrichtung (Re-target) weiterführen, vermeiden dies. (Dies ist, was iOS‘ additive Animationen nativ tun; wählen Sie im Web eine Federbibliothek, die die Geschwindigkeit bei einer Neuausrichtung beibehält.)
  • Zerlegen Sie 2D-Bewegungen in unabhängige X- und Y-Federn. Eine einzelne Feder über eine 2D-Entfernung verliert die Synchronisation, wenn X und Y unterschiedliche Geschwindigkeiten haben.

4. Verhalten über Animation – Federn verwenden

„Denken Sie an Animation als ein Gespräch zwischen Ihnen und dem Objekt, nicht als etwas, das von der Schnittstelle vorgeschrieben wird.“

Eine vorgegebene Animation mit fester Dauer kann nicht auf neue Eingaben reagieren. Eine Feder kann – neue Eingaben ändern einfach das Ziel, und die Bewegung bleibt kontinuierlich. Greifen Sie zu Federn für alles, was ein Benutzer berühren kann.

Apple hat das physikalische Trio (Masse/Steifigkeit/Dämpfung) bewusst durch zwei designerfreundliche Parameter ersetzt. Denken Sie in diesen:

  • Dämpfungsverhältnis (Damping ratio) – steuert Überschwingen. 1.0 = kritisch gedämpft, kein Nachschwingen, sanftes Einlaufen. < 1.0 = überschwingt und oszilliert. Niedriger = schwungvoller.
  • Ansprechzeit (Response) – wie schnell der Wert das Ziel erreicht, in Sekunden. Niedriger = direkter. Dies ist keine „Dauer“ – eine Feder hat keine feste Dauer; ihre Beruhigungszeit ergibt sich aus den Parametern.

Standardwerte:

  • Beginnen Sie bei den meisten UI-Elementen mit Dämpfung 1.0 (kritisch gedämpft) – anmutig und nicht ablenkend.
  • Fügen Sie Nachschwingen (Dämpfung ~0.8) nur hinzu, wenn die Geste selbst Schwung hatte (ein Wisch, ein Wurf, ein Loslassen nach einem Zug). Ein Überschwingen bei einem Menü, das einfach eingeblendet wurde, fühlt sich falsch an; ein Überschwingen bei einer Karte, die Sie weggewischt haben, fühlt sich richtig an.

Konkrete Werte, die Apple ausliefert:

InteraktionDämpfungAnsprechzeit
Bewegen / Neupositionieren (z. B. PiP)1.00.4
Drehung0.80.4
Drawer / Sheet0.80.3

Web-Mapping (Motion / Framer Motion): Die bounce + duration Feder-API bildet Apples Dämpfung + Ansprechzeit gut ab. Ein sicherer Hausstil ist damping: 1.0 Federn überall standardmäßig; reservieren Sie Nachschwingen für schwunggetriebene, physische Interaktionen.

import { animate } from 'motion';

// Kritisch gedämpfter Standard (kein Überschwingen)
animate(el, { y: 0 }, { type: 'spring', bounce: 0, duration: 0.4 });

// Schwunginteraktion – ein wenig Nachschwingen, nur weil ein Wisch vorausging
animate(el, { y: target }, { type: 'spring', bounce: 0.2, duration: 0.4 });

5. Geschwindigkeitsübergabe – die Naht zwischen Ziehen und Animation

Wenn eine Geste endet, muss die Animation mit der exakten Geschwindigkeit des Fingers fortgesetzt werden, damit es keine sichtbare Naht zwischen Ziehen und Animieren gibt. Dies ist das Detail, das „flüssig“ am meisten von „in Ordnung“ unterscheidet.

Übergeben Sie die Loslassgeschwindigkeit des Zeigers als Anfangsgeschwindigkeit der Feder. Einige Feder-APIs benötigen eine relative Geschwindigkeit – normalisieren Sie sie durch die verbleibende Entfernung zum Ziel:

relativeVelocity = gestureVelocity / (targetValue − currentValue)

Beispiel: Element bei y=50, Ziel y=150 (100px zu gehen), Finger bewegt sich mit 50px/s → Anfangsgeschwindigkeit der Feder = 50 / 100 = 0.5. Framer Motion / Motion übernehmen die absolute px/s-Geschwindigkeit direkt (velocity-Option), daher übergeben Sie normalerweise den Rohwert.

6. Momentum-Projektion – animieren Sie dorthin, wo die Geste hingeht

„Nehmen Sie eine kleine Eingabe und erzeugen Sie eine große Ausgabe.“

Rasten Sie nicht am nächsten Haltepunkt ab dem Loslasspunkt ein. Verwenden Sie die Geschwindigkeit, um die Ruheposition zu projizieren – genau wie bei der Scroll-Verzögerung – und rasten Sie dann am Ziel ein, das diesem projizierten Punkt am nächsten ist. Dadurch fühlt sich ein Wisch so an, als würde er das Element werfen.

Apples exakte Projektionsfunktion (aus dem Beispielcode von Designing Fluid Interfaces):

// decelerationRate ≈ 0.998 für normales Scrollgefühl; 0.99 für direkter
function project(initialVelocity /* px/s */, decelerationRate = 0.998) {
  return (initialVelocity / 1000) * decelerationRate / (1 - decelerationRate);
}

const projectedEndpoint = currentPosition + project(releaseVelocity);
const target = nearestSnapPoint(projectedEndpoint);   // Ziel basierend auf der Projektion wählen
animateSpringTo(target, { velocity: releaseVelocity }); // dann Geschwindigkeit übergeben (§5)

Hinweis: Die physikalische Formel v²/(2·decel) ist nicht, was Apple ausliefert – verwenden Sie die obige exponentielle Abklingform. Dies ist das Standardverhalten bei guten Bottom-Sheets und Karussells (Vaul, Embla).

7. Räumliche Konsistenz – symmetrische Pfade, verankerte Ursprünge

„Wenn etwas auf eine Weise verschwindet, erwarten wir, dass es dort auftaucht, wo es herkam.“

  • Eintreten und Verlassen auf demselben Pfad. Ein Panel, das von rechts hereingleitet, muss nach rechts ausgeblendet werden. Hereinkommen von rechts / Hinausgehen nach unten fühlt sich unzusammenhängend und verwirrend an.
  • Verankern Sie Interaktionen an ihrer Quelle. Ein Menü, Popover oder Sheet sollte von dem Element ausgehen, das es ausgelöst hat – setzen Sie transform-origin auf den Auslöser, damit die räumliche Beziehung zwischen Schaltfläche und Inhalt offensichtlich ist. (Dies ist der gleiche Punkt der Ursprungsbewusstheit wie bei Popovers, die von ihrem Auslöser und nicht von ihrer Mitte aus skalieren.)
  • Spiegeln Sie die Beschleunigung bei umkehrbaren Übergängen, so dass der Ausgangspfad dem Rückweg entspricht (verwenden Sie für die beiden Richtungen inverse kubische Bézier-Kontrollpunkte).

8. Hinweis in Richtung der Geste

Menschen sagen einen Endzustand aus einer Flugbahn voraus. Zwischenbilder sollten vermitteln, wohin die Dinge gehen – Control Center-Module „wachsen nach oben und außen in Richtung Ihres Fingers“. Lassen Sie die Zwischenbilder auf das Ergebnis zeigen, anstatt nur blind dorthin zu interpolieren.

9. Gummiband-Effekt – sanfte Grenzen

An einer Grenze widerstehen Sie zunehmend, anstatt abrupt zu stoppen. Ein harter Stopp wirkt wie „eingefroren“; kontinuierlicher Widerstand wirkt wie „reagiert, aber es gibt nichts mehr hier“. Wenden Sie eine Dämpfung an, die zunimmt, je weiter der Benutzer über die Grenze hinaus zieht.

// Je weiter über die Grenze hinaus, desto weniger folgt das Element – echte Dinge werden langsamer, bevor sie anhalten
function rubberband(overshoot, dimension, constant = 0.55) {
  return (overshoot * dimension * constant) / (dimension + constant * Math.abs(overshoot));
}

10. Details zum Gestendesign (die „Gefühls“-Checkliste)

  • Tippen: Hervorhebung bei Berührungs-down (sofort), Ausführung bei Berührungs-up. Fügen Sie ~10px Hysterese/Hit-Padding um das Ziel hinzu und erlauben Sie das Abbrechen durch Wegziehen und Zurückkommen.
  • Ziehen/Wischen: Erfordern Sie eine kleine Bewegungsschwelle (Hysterese, ~10px), bevor Sie sich für eine Richtung entscheiden, dann verfolgen Sie 1:1.
  • Erkennen Sie alle plausiblen Gesten parallel ab der ersten Bewegung, brechen Sie dann die Verlierer sicher ab, sobald die Absicht klar ist. Vermeiden Sie Erkennungsmechanismen, die nur einen finalen Zustand melden (swipeleft-artige Ereignisse) – sie verwerfen die kontinuierliche Verfolgung, die Sie für Feedback benötigen.
  • Minimieren Sie Verzögerungen bei der Disambiguierung. Die Doppeltipp-Erkennung verzögert zwangsläufig einzelne Tipps; zahlen Sie diese Kosten nur dort, wo Doppeltipp wirklich existiert.

11. Glätte auf Einzelbildebene

Glätte betrifft das, was in den Einzelbildern ist, nicht nur die Bildwiederholrate.

  • Halten Sie die positionsbezogene Änderung pro Einzelbild unterhalb der Wahrnehmungsschwelle, um Stroboskopeffekte zu vermeiden.
  • Bei sehr schnellen Bewegungen codiert eine subtile Bewegungsunschärfe / -streckung die Geschwindigkeit und wirkt besser als eine harte, scharfe Spur.
  • requestAnimationFrame ist die anzeigensynchronisierte Uhr des Webs (Apple verwendet CADisplayLink). Animieren Sie nur compositor-freundliche Eigenschaften – transform und opacity – und geben Sie mit will-change einen Hinweis, wo Bewegung unmittelbar bevorsteht.

12. Materialien & Tiefe – Transluzenz vermittelt Hierarchie

Apple verwendet durchscheinende Materialien als schwebende funktionale Ebene, die Struktur verleiht, ohne die Aufmerksamkeit zu stehlen. Nähern Sie sich dem im Web mit backdrop-filter an.

  • Bauen Sie Navigations-/Symbolleisten/Sheets als durchscheinende Ebenen (backdrop-filter: blur() + ein halbtransparenter Hintergrund), deren Inhalt darunter scrollt – nicht als undurchsichtige Balken, die einen festen Streifen verbrauchen.
  • Materialgewicht codiert Hierarchie: dunklere/schwerere Materialien trennen strukturelle Regionen (Sidebars); hellere Materialien lenken die Aufmerksamkeit auf interaktive Elemente (Schaltflächen). Stapeln Sie niemals eine helle, durchscheinende Oberfläche auf eine andere – die Lesbarkeit leidet.
  • Größere Oberflächen sollten dicker wirken: stärkere Unschärfe + ein tieferer Schatten als bei kleinen Chips. Erwägen Sie kontextabhängige Schatten – schwerer über belebten/textreichen Inhalten zur Trennung, leichter über einfachen Hintergründen.
  • Abdunkeln, um zu fokussieren; trennen, um den Fluss zu erhalten. Eine modale Aufgabe paart die Oberfläche mit einem abdunkelnden Overlay und schiebt den Hintergrund zurück/nach unten. Ein paralleles, nicht blockierendes Panel verwendet Transluzenz und Versatz ohne ein Overlay, damit der Fluss nicht unterbrochen wird. Bei gestapelten Sheets dunkeln Sie schrittweise ab und schieben jede übergeordnete Ebene zurück.
  • Vibranz hält Text über wechselnden Hintergründen lesbar. Verwenden Sie über unscharfen/durchscheinenden Oberflächen kein flaches Grau für Text – verwenden Sie höheren Kontrast, etwas schwereres Gewicht und eine kleine Erhöhung des Buchstabenabstands. Setzen Sie Farbe auf eine feste Ebene, nicht auf den durchscheinenden Vordergrund.
  • Scrolleffekte an Kanten, keine harten Trennlinien. Verwenden Sie anstelle einer 1px-Grenze unter einem festen Header eine kleine Unschärfe-/Verlaufsmaske, die dort verblasst, wo Inhalt auf schwebendes Chrom trifft – nur dort, wo sich schwebende UI tatsächlich mit Inhalt überschneidet.
  • Materialisieren, nicht nur einblenden. Für Glas-/Unschärfeoberflächen animieren Sie den Unschärferadius und die Skalierung beim Betreten/Verlassen gemeinsam, so dass die Oberfläche als ein ankommendes echtes Material und nicht als einfache Deckkraft-Einblendung gelesen wird.
.toolbar {
  background: rgba(255, 255, 255, 0.6);
  backdrop-filter: blur(20px) saturate(180%);
  border-top: 1px solid rgba(255, 255, 255, 0.4); /* helle Oberkante = Licht, das auf das Material trifft */
}

13. Multimodales Feedback – Bewegung + Ton + Haptik

Drei Regeln für die Kombination der Sinne (aus Designing Audio-Haptic Experiences):

  1. Kausalität – es muss offensichtlich sein, was das Feedback verursacht hat. Lösen Sie es beim tatsächlichen kausalen Ereignis aus (dem Umlegen des Kippschalters, dem Einrasten des Objekts) und passen Sie seinen Charakter an die Physis der Aktion an.
  2. Harmonie – das Visuelle, der Ton und die Haptik müssen im gleichen Einzelbild ausgelöst werden. Latenz zwischen ihnen zerstört die Illusion. Lassen Sie nicht zu, dass ein ...

… [für die Übersetzung gekürzt]

Verwandte Skills