EMZETT.
Login

Kurz: transform verschiebt, dreht, skaliert oder neigt ein Element, ohne das Layout der anderen zu beeinflussen:

Teil des Kurses HTML + CSS

Kapitel 23 von 27 im Kurs HTML + CSS. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Transformationen

transform verschiebt, dreht, skaliert oder neigt ein Element, ohne das Layout der anderen zu beeinflussen:

<style>
  .reihe { display: flex; gap: 30px; padding: 30px; }
  .reihe div { width: 60px; height: 60px; background: #6366f1; color: white; display: grid; place-items: center; }
  .t1 { transform: translate(20px, 10px); }
  .t2 { transform: rotate(25deg); }
  .t3 { transform: scale(1.4); }
  .t4 { transform: skew(20deg, 0); }
  .t5 { transform: rotate(45deg) scale(.8) translateX(10px); }  /* Reihenfolge zählt */
</style>
<div class="reihe"><div class="t1">move</div><div class="t2">rotate</div><div class="t3">scale</div><div class="t4">skew</div><div class="t5">alle</div></div>
FunktionWirkung
translate(x, y), translateX()verschieben
rotate(45deg)drehen
scale(1.5)vergrößern/verkleinern
skew(10deg)neigen
transform-originDrehpunkt (center, top left, 50% 100%)
translate: 10px, rotate: 5deg, scale: 1.2einzelne Eigenschaften (modern)

3D: perspective, rotateX(), rotateY(), transform-style: preserve-3d.

Übergänge (transition)

Ein Übergang lässt Änderungen weich ablaufen, statt sofort zu springen:

<style>
  .knopf {
    padding: 12px 22px; border: 0; border-radius: 8px; color: white; cursor: pointer;
    background: #4f46e5;
    transition: background-color .25s ease, transform .15s ease, box-shadow .25s;
  }
  .knopf:hover { background: #7c3aed; transform: translateY(-3px); box-shadow: 0 8px 20px #4f46e544; }
  .knopf:active { transform: translateY(0) scale(.97); }
  .knopf:focus-visible { outline: 3px solid #fbbf24; outline-offset: 3px; }
</style>
<button class="knopf">Fahre mit der Maus darüber</button>

transition: eigenschaft dauer easing verzögerung;

TeilWerte
Eigenschaftall oder bestimmte (opacity, transform, …)
Dauer.3s, 300ms
Easingease, linear, ease-in, ease-out, ease-in-out, cubic-bezier(...)
Verzögerung.1s

Nicht alle Eigenschaften lassen sich animieren (display zum Beispiel nicht direkt). Besonders flüssig und sparsam laufen transform und opacity, weil sie die Grafikkarte nutzen. Animiere nicht width, height, top oder left, wenn es auch mit transform geht.

Aufklappen mit Übergang

<style>
  .akk { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .3s ease; background: #e0f2fe; }
  .akk > div { overflow: hidden; }
  .akk.offen { grid-template-rows: 1fr; }
  button { margin-bottom: 6px; }
</style>
<button onclick="this.nextElementSibling.classList.toggle('offen')">Auf- und zuklappen</button>
<div class="akk"><div><p style="padding:10px;margin:0">Dieser Inhalt klappt weich auf, ohne eine feste Höhe zu kennen. Der Trick ist der Übergang von <code>0fr</code> zu <code>1fr</code>.</p></div></div>

Animationen mit @keyframes

Mit @keyframes definierst du eine Abfolge, mit animation wendest du sie an:

<style>
  @keyframes huepfen {
    0%   { transform: translateY(0); }
    50%  { transform: translateY(-40px); }
    100% { transform: translateY(0); }
  }
  @keyframes einblenden {
    from { opacity: 0; transform: translateY(12px); }
    to   { opacity: 1; transform: none; }
  }
  @keyframes puls {
    0%, 100% { box-shadow: 0 0 0 0 #ef444488; }
    70%      { box-shadow: 0 0 0 16px #ef444400; }
  }
  .ball { width: 40px; height: 40px; border-radius: 50%; background: #f59e0b; animation: huepfen .9s ease-in-out infinite; margin: 50px 0 10px; }
  .text { animation: einblenden .8s ease both; }
  .punkt { width: 20px; height: 20px; border-radius: 50%; background: #ef4444; animation: puls 1.6s infinite; margin: 16px; }
</style>
<div class="ball"></div>
<p class="text">Dieser Text blendet beim Laden ein.</p>
<div class="punkt"></div>
EigenschaftBedeutung
animation-nameName der Keyframes
animation-durationDauer
animation-timing-functionEasing (steps(8) für Sprites)
animation-delayVerzögerung
animation-iteration-countAnzahl oder infinite
animation-directionnormal, reverse, alternate
animation-fill-modeforwards (Endzustand behalten), both
animation-play-staterunning, paused

Kurzform: animation: huepfen .9s ease-in-out infinite;

Ladeanzeige

<style>
  .spinner { width: 36px; height: 36px; border: 4px solid #e2e8f0; border-top-color: #4f46e5; border-radius: 50%; animation: dreh .8s linear infinite; }
  @keyframes dreh { to { transform: rotate(360deg); } }
  .punkte span { display: inline-block; width: 10px; height: 10px; margin: 0 3px; background: #4f46e5; border-radius: 50%; animation: hup 1s infinite ease-in-out; }
  .punkte span:nth-child(2) { animation-delay: .15s; } .punkte span:nth-child(3) { animation-delay: .3s; }
  @keyframes hup { 0%, 80%, 100% { transform: scale(.5); opacity: .4; } 40% { transform: scale(1); opacity: 1; } }
</style>
<div class="spinner" role="status" aria-label="Lädt"></div>
<p class="punkte" aria-hidden="true"><span></span><span></span><span></span></p>

Bewegung respektieren

Manche Menschen reagieren auf Bewegung mit Übelkeit oder Schwindel. Sie stellen im System “Bewegung reduzieren” ein. Berücksichtige das:

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
}

Beschränke dich außerdem auf Bewegung, die etwas bedeutet (Rückmeldung, Zustandswechsel), und lass nichts länger als 5 Sekunden ohne Pausemöglichkeit laufen.

Scrollgesteuert und View Transitions

Moderne CSS-Funktionen: animation-timeline: scroll() und view() koppeln Animationen an das Scrollen, die View Transitions API animiert Seitenwechsel. Sie sind in aktuellen Browsern verfügbar, aber prüfe die Unterstützung auf MDN/caniuse.

Merke

  • transform (verschieben, drehen, skalieren) und opacity sind die effizientesten Animationseigenschaften
  • transition macht Zustandswechsel weich (hover, focus, Klassenwechsel)
  • @keyframes + animation für Abläufe, auch endlos
  • Respektiere prefers-reduced-motion
  • Animiere sparsam und mit Bedeutung

Übungsaufgabe

Baue einen Button mit weichem Hover-Effekt, ein Element, das beim Laden einblendet, und eine Ladeanzeige. Schalte alle Animationen bei prefers-reduced-motion ab.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: CSS-Variablen und Funktionen

Weiter: Moderne CSS-Funktionen

Alle Kapitel: HTML + CSS im Überblick