Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung | |||
| de:modul:m291:learningunits:lu06:theorie:a_transistions [2026/03/15 22:58] – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | de:modul:m291:learningunits:lu06:theorie:a_transistions [2026/03/15 22:58] (aktuell) – ↷ Seite von de:modul:m291:learningunits:lu05:theorie:b_transistions nach de:modul:m291:learningunits:lu06:theorie:a_transistions verschoben und umbenannt gkoch | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== LU06a – CSS Transitions ====== | ||
| + | {{: | ||
| + | |||
| + | ===== 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**. | ||
| + | <WRAP center round box 80%> | ||
| + | {{: | ||
| + | \\ | ||
| + | // | ||
| + | |||
| + | <code css> | ||
| + | .element { | ||
| + | background-color: | ||
| + | transition: background-color 400ms ease-in-out; | ||
| + | } | ||
| + | |||
| + | .element: | ||
| + | background-color: | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Beim Hovern wechselt die Hintergrundfarbe nun nicht abrupt, sondern gleitend über 400 ms von Blau zu Rot. | ||
| + | |||
| + | Mehrere Eigenschaften gleichzeitig animieren: | ||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | .panel { | ||
| + | opacity: 0; | ||
| + | height: 0; | ||
| + | transition: | ||
| + | opacity | ||
| + | height | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Trigger: Was löst eine Transition aus? ===== | ||
| + | |||
| + | Damit eine Transition aktiviert wird, braucht es zwei Dinge: eine **Eigenschaft, | ||
| + | <WRAP center round box 80%> | ||
| + | ^ Trigger ^ Beschreibung ^ | ||
| + | | '': | ||
| + | | '': | ||
| + | | '': | ||
| + | | '': | ||
| + | | '': | ||
| + | | **Klasse via JavaScript** | Eine CSS-Klasse wird per '' | ||
| + | \\ | ||
| + | {{: | ||
| + | \\ | ||
| + | //Durch Klicken ins Formular-Feld erhält das Element den Fokus -> Ein Trigger für eine Transition der Transparenz.// | ||
| + | </ | ||
| + | |||
| + | Der letzte Punkt ist für unser Accordion entscheidend: | ||
| + | |||
| + | ===== Was kann (und was kann nicht) animiert werden? ===== | ||
| + | |||
| + | Nicht jede CSS-Eigenschaft lässt sich animieren. Die Grundregel: Eine Eigenschaft ist animierbar, wenn zwischen Start- und Endwert ein **Zwischenwert berechnet werden kann**. | ||
| + | |||
| + | <WRAP round box 80%> | ||
| + | **Beispiel: | ||
| + | |||
| + | **Gegenbeispiel: | ||
| + | </ | ||
| + | |||
| + | ==== Gut animierbare Eigenschaften ==== | ||
| + | |||
| + | === transform === | ||
| + | |||
| + | '' | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | {{: | ||
| + | |||
| + | <code css> | ||
| + | .box { | ||
| + | transition: transform 400ms ease-out; | ||
| + | } | ||
| + | |||
| + | .box:hover { | ||
| + | transform: scale(1.2) rotate(5deg) translateY(-8px); | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Einzelne Transform-Eigenschaften können auch separat animiert werden: | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | .box { | ||
| + | transition: | ||
| + | scale 300ms ease-out, | ||
| + | rotate | ||
| + | translate 300ms ease-out; | ||
| + | } | ||
| + | |||
| + | .box:hover { | ||
| + | scale: 1.2; | ||
| + | rotate: 5deg; | ||
| + | translate: 0 -8px; | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | === Farbe === | ||
| + | |||
| + | '' | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | .btn { | ||
| + | background-color: | ||
| + | transition: background-color 250ms ease-in-out; | ||
| + | } | ||
| + | |||
| + | .btn:hover { | ||
| + | background-color: | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | === opacity === | ||
| + | |||
| + | Sanftes Ein- und Ausblenden – das Element **bleibt aber im Layout** (es nimmt weiterhin Platz ein). | ||
| + | |||
| + | === Weitere animierbare Eigenschaften === | ||
| + | <WRAP center round box 80%> | ||
| + | ^ Eigenschaft ^ Einsatz ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | </ | ||
| + | |||
| + | ==== Nicht animierbar ==== | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | ^ Eigenschaft ^ Warum nicht? ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP round tip 80%> | ||
| + | Eine vollständige Liste animierbarer Eigenschaften: | ||
| + | </ | ||
| + | |||
| + | ===== Antworten Ein- und Ausblenden mit ' | ||
| + | |||
| + | Im ersten Schritt haben wir die Panels mit '' | ||
| + | |||
| + | **Warum lässt sich '' | ||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | /* ❌ 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: '' | ||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | /* ❌ 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 ('' | ||
| + | |||
| + | |||
| + | ===== Die moderne Lösung: interpolate-size: | ||
| + | |||
| + | Seit 2024 unterstützen moderne Browser eine neue CSS-Eigenschaft, | ||
| + | |||
| + | Sie erlaubt dem Browser, Übergänge zwischen einem Pixel-Wert und einem CSS-Schlüsselwort wie '' | ||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | :root { | ||
| + | interpolate-size: | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Damit funktioniert '' | ||
| + | |||
| + | ==== CSS-Transitions: | ||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | :root { | ||
| + | interpolate-size: | ||
| + | } | ||
| + | |||
| + | /* Standardmässig versteckt */ | ||
| + | .panel { | ||
| + | height: 0; | ||
| + | opacity: 0; | ||
| + | overflow: hidden; | ||
| + | transition: | ||
| + | height | ||
| + | opacity 800ms ease-in-out; | ||
| + | } | ||
| + | |||
| + | /* Sichtbar wenn Klasse ' | ||
| + | .panel.open { | ||
| + | height: auto; | ||
| + | opacity: 1; | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Das Öffnen und Schliessen wird weiterhin per JavaScript durch '' | ||
| + | |||
| + | <WRAP important round center 80%> | ||
| + | **Browser-Support: | ||
| + | |||
| + | Aktuellen Support prüfen: [[https:// | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Timing-Funktionen ===== | ||
| + | |||
| + | Der dritte Parameter von '' | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | ^ Wert ^ Beschreibung ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | </ | ||
| + | |||
| + | Im Accordion-Projekt verwenden wir '' | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | Interaktives Beispiel mit Beispiel-Code: | ||
| + | [[https:// | ||
| + | </ | ||