====== LU05b – CSS Transitions ====== {{:de:modul:m291:learningunits:lu05:theorie:faq-toggle-transistion.gif?nolink|}} ===== CSS Transitions – Grundprinzip ===== Eine CSS Transition animiert den Übergang zwischen zwei Zuständen eines Elements. Sie definieren, **welche Eigenschaft** animiert wird, **wie lange** die Animation dauert und nach welcher **Timing-Kurve**. .element { background-color: blue; transition: background-color 400ms ease-in-out; } .element:hover { background-color: red; } Beim Hovern wechselt die Hintergrundfarbe nun nicht abrupt, sondern gleitend über 400 ms von Blau zu Rot. Mehrere Eigenschaften gleichzeitig animieren: .panel { opacity: 0; height: 0; transition: opacity 600ms ease-in-out, height 600ms ease-in-out; } ===== Antworten Ein- und Ausblenden mit 'display' ===== Im ersten Schritt haben wir die Panels mit ''display: none'' / ''display: block'' ein- und ausgeblendet. Das funktioniert – aber es gibt **keinen Übergang**, das Element erscheint und verschwindet abrupt. **Warum lässt sich ''display'' nicht animieren?** CSS Transitions interpolieren zwischen zwei Zahlenwerten. ''display: none'' bedeutet: das Element **existiert im Layout nicht**. Zwischen "existiert nicht" und "existiert" kann kein Mittelwert berechnet werden – eine Transition ist daher logisch nicht möglich. /* ❌ Kein Übergang möglich */ .panel { display: none; transition: display 400ms; /* wirkungslos */ } .panel.open { display: block; /* schaltet sofort um */ } ===== Das Problem: height von 0 zu auto ===== Der einfachste und natürlichste Ansatz wäre: ''height: 0'' → ''height: auto'' (-> auto: der Browser berechnet selbst die Höhe des Elements anhand der Inhalte). Leider funktioniert das **nicht** mit einer Transition: /* ❌ Funktioniert NICHT – Browser kann nicht interpolieren */ .panel { height: 0; overflow: hidden; transition: height 600ms ease-in-out; } .panel.open { height: auto; /* Browser weiss nicht, was das in px bedeutet */ } Der Browser kann zwischen einem fixen Pixelwert (''0'') und dem Schlüsselwort ''auto'' nicht interpolieren – ''auto'' ist kein Zahlenwert, sondern eine Anweisung: "berechne die Höhe selbst". ===== Die moderne Lösung: interpolate-size: allow-keywords ===== Seit 2024 unterstützen moderne Browser eine neue CSS-Eigenschaft, die genau dieses Problem löst: ''interpolate-size: allow-keywords''. Sie erlaubt dem Browser, Übergänge zwischen einem Pixel-Wert und einem CSS-Schlüsselwort wie ''auto'', ''min-content'' oder ''max-content'' zu berechnen. :root { interpolate-size: allow-keywords; /* einmal global definieren */ } Damit funktioniert ''height: 0'' → ''height: auto'' mit einer Transition wie erwartet. ==== CSS-Transitions: Ein- und Ausblenden der Antworten ==== :root { interpolate-size: allow-keywords; } /* Standardmässig versteckt */ .panel { height: 0; opacity: 0; overflow: hidden; transition: height 800ms ease-in-out, opacity 800ms ease-in-out; } /* Sichtbar wenn Klasse 'open' gesetzt */ .panel.open { height: auto; opacity: 1; } Das Öffnen und Schliessen wird weiterhin per JavaScript durch ''classList.add('open')'' / ''classList.remove('open')'' gesteuert – die Animation läuft vollständig in CSS. ===== Neueste Entwicklung: @starting-style ===== In sehr modernen Browsern gibt es eine noch elegantere Variante mit ''@starting-style'' und ''display allow-discrete''. Diese Technik erlaubt Transitionen auch beim **ersten Erscheinen** eines Elements, also direkt von ''display: none'' zu ''display: block'': :root { interpolate-size: allow-keywords; } /* Startzustand beim ersten Einblenden */ @starting-style { .panel { opacity: 0; height: 0; } } /* Standardmässig versteckt */ .panel { height: 0; overflow: hidden; opacity: 0; transition: height 1100ms ease-in-out, opacity 1100ms ease-in-out, display 0.5s allow-discrete; } /* Sichtbar wenn Klasse 'open' gesetzt */ .panel.open { display: block; height: auto; opacity: 1; } **Browser-Support:** ''@starting-style'' und ''display allow-discrete'' werden **in allen modernen Browsern unterstützt** (Chrome, Firefox, Safari). Das eigentliche Kompatibilitätsproblem liegt bei ''interpolate-size: allow-keywords'': Diese Eigenschaft wird aktuell **nur von Chrome/Edge** unterstützt – Safari und Firefox kennen sie noch nicht. In diesen Browsern springt das Panel beim Öffnen abrupt auf ''height: auto'', ohne Animation. Aktuellen Support prüfen: [[https://caniuse.com/mdn-css_properties_interpolate-size|caniuse.com – interpolate-size]] ===== Timing-Funktionen ===== Der dritte Parameter von ''transition'' steuert die Beschleunigungskurve der Animation: ^ Wert ^ Beschreibung ^ | ''ease'' | Langsam starten, beschleunigen, langsam enden (Standard) | | ''ease-in'' | Langsam starten, schnell enden | | ''ease-out'' | Schnell starten, langsam enden – oft natürlicher | | ''ease-in-out'' | Langsam starten und enden, in der Mitte schnell | | ''linear'' | Konstante Geschwindigkeit | | ''cubic-bezier(x,x,x,x)'' | Vollständig selbst definierte Kurve | Im Accordion-Projekt verwenden wir ''ease-in-out'' – das Panel öffnet und schliesst sich jeweils mit einer leichten Verzögerung am Anfang und Ende, was natürlicher wirkt. Interaktives Beispiel mit Beispiel-Code: [[https://css-transitions.vercel.app|Externe Seite erkunden.]] [[https://css-transitions.vercel.app|{{ :de:modul:m291:learningunits:lu05:theorie:screenshot_2026-03-09_at_00.26.55.png?600 |}}]]