Dokumentation
Dokumentation
useAnimations ist eine kostenlose, MIT-lizenzierte Bibliothek mit 300 animierten Icons für React. Jedes Icon bringt eine eingebaute Interaktion mit: Es läuft in Schleife, spielt per Klick ab oder spielt bei Hover ab. Sie nutzen die Icons über das Paket react-useanimations oder fügen sie mit der shadcn CLI hinzu.
Schnellstart
npm install react-useanimations
import UseAnimations from 'react-useanimations';
import github from 'react-useanimations/lib/github';
export default function Header() {
return <UseAnimations animation={github} size={32} />;
}
Das Icon übernimmt die Textfarbe und spielt seine eigene Interaktion ab: github läuft in Schleife, solange der Mauszeiger darauf liegt. Das Paket hat keine Abhängigkeiten. Ein eingebauter Player (8 kB gzip-komprimiert) zeichnet die Icons als SVG, und jedes Icon ist ein eigenes Modul, sodass Ihr Bundle nur die Icons enthält, die Sie importieren.
Interaktionen
Jedes Icon kommt mit der Interaktion, für die es gestaltet wurde. Mit dem Prop interaction überschreiben Sie sie.
| Interaktion | Was sie macht | Beispiel-Icons |
|---|---|---|
loop |
Läuft ununterbrochen. | loading, activity, alertCircle |
click-toggle |
Wechselt per Klick zwischen zwei Zuständen (vorwärts, dann rückwärts). | menu, checkBox, playPause |
click-replay |
Spielt bei jedem Klick von vorn ab. | download, refresh, send |
hover |
Spielt beim Betreten mit der Maus vorwärts und beim Verlassen rückwärts. | archive, settings, trash |
hover-loop |
Läuft bei Hover in Schleife und spielt beim Verlassen den aktuellen Durchlauf zu Ende. | github, twitter, dribbble |
hover-replay |
Spielt beim Betreten mit der Maus einmal von vorn ab. | arrowRight, bluetooth, zap |
Ist beim Nutzer reduzierte Bewegung eingestellt, bleiben die Icons still: Loops zeigen ihren ersten Frame, Hover- und Replay-Animationen spielen nicht ab, und Toggles springen sofort in ihren neuen Zustand.
Props
<UseAnimations animation={github} size={56} strokeColor="#4b5cff" style={{ padding: 8 }} />
| Prop | Standardwert | Beschreibung |
|---|---|---|
animation |
— | Icon, importiert aus react-useanimations/lib/<name>, oder { animationData, interaction } für eine eigene Animation. |
size |
24 |
Breite und Höhe; Zahlen sind Pixel, Strings jede CSS-Länge wie '1.5em'. |
strokeColor |
'currentColor' |
Farbe der Linien. Standardmäßig übernimmt das Icon die Textfarbe. |
fillColor |
strokeColor |
Farbe gefüllter Flächen, z. B. eines gelikten Herzens. |
interaction |
je nach Icon | 'loop', 'click-toggle', 'click-replay', 'hover', 'hover-loop' oder 'hover-replay'. |
active |
— | Für click-toggle-Icons: true zeigt den Endzustand. Kontrolliert: in onClick setzen, Klicks allein schalten nicht um. |
autoplay |
je nach Icon | true für loop-Icons, außer bei eingestellter reduzierter Bewegung. |
loop |
je nach Icon | true für loop- und hover-loop-Icons. |
speed |
1 |
Wiedergabegeschwindigkeit. |
render |
— | Render-Prop für einen eigenen Wrapper, siehe Das Icon in einen echten Button setzen. |
Alle anderen Props (className, aria-label, onClick, …) landen auf dem Wrapper-<span>. Ihre Event-Handler laufen vor denen der Animation; mit event.preventDefault() lassen Sie die Animation aus.
Icons importieren
Importieren Sie jedes Icon aus react-useanimations/lib/<name> oder mehrere auf einmal aus react-useanimations/icons:
import { github, heart, menu } from 'react-useanimations/icons';
Produktions-Builds enthalten in beiden Fällen nur die Icons, die Sie verwenden. Dev-Server und Test-Runner machen kein Tree-Shaking, dort lädt react-useanimations/icons also alle Icons; ist das relevant, nehmen Sie lieber lib/<name>. delete und package sind reservierte Wörter: Importieren Sie sie als deleteIcon und packageIcon.
Kontrollierter Toggle
import { useState } from 'react';
import UseAnimations from 'react-useanimations';
import menu from 'react-useanimations/lib/menu';
export function MenuButton() {
const [open, setOpen] = useState(false);
return (
<UseAnimations
animation={menu}
size={40}
active={open} // animiert auch, wenn sich `open` an anderer Stelle ändert
onClick={() => setOpen(!open)}
/>
);
}
Das Icon in einen echten Button setzen
Bei anklickbaren Icons legen Sie mit dem Prop render ein fokussierbares Element um das Icon: eventProps kommen auf Ihr Element, animationProps auf ein <span> darin. Hover-Animationen spielen dann auch ab, wenn der Button den Tastaturfokus erhält.
import heart from 'react-useanimations/lib/heart';
<UseAnimations
animation={heart}
size={32}
render={(eventProps, animationProps) => (
<button type="button" aria-label="Add to favorites" {...eventProps}>
<span {...animationProps} />
</button>
)}
/>;
Größe & Farbe
Die Icons sind Linien-Icons auf einer Zeichenfläche von 24 oder 32 px und bleiben in jeder Größe scharf: Setzen Sie size auf eine Pixelzahl oder eine beliebige CSS-Länge.
Die Linien folgen currentColor, die Icons übernehmen also Textfarbe, Hover-Zustände und Dark Mode von selbst. Ändern lässt sich das mit strokeColor und fillColor, mit der CSS-Eigenschaft color oder über Styles für die Pfade: Die eingebaute Regel hat die Spezifität null, Ihr CSS gewinnt also immer.
Manche Icons schneiden eine Lücke in sich selbst (der Schrägstrich in visibility, microphone, video, volume und notification, der Haken in download, der Ring um das Badge von notification3). Die Lücke nimmt den Seitenhintergrund an: weiß auf hellen Seiten und dunkel auf Seiten mit color-scheme: dark. Auf anderen Hintergründen setzen Sie sie mit der CSS-Variablen --ua-knockout, z. B. body { --ua-knockout: #0f172a; }.
// Tailwind: Farbe und Linienstärke
<UseAnimations animation={github} className="text-indigo-500 [&_path]:stroke-[3]" />
Next.js und Server-Rendering
Die Komponente ist mit 'use client' markiert und zeichnet die Animation nur im Browser. Sie können sie daher aus Server Components und SSR-Frameworks (Next.js, Remix, Astro) rendern, ohne dynamic(…, { ssr: false }). Icon-Module sind reine Daten, Server Components können sie also importieren und als Props weitergeben.
shadcn/ui
Jedes Icon steht auch in einer shadcn-Registry. Die CLI fügt eine fertige Komponente hinzu und installiert react-useanimations:
npx shadcn@latest add https://useanimations.com/r/checkmark.json
import { AnimatedCheckmark } from '@/components/animations/checkmark';
<AnimatedCheckmark size={24} />;
Die Komponente heißt Animated + die Icon-ID in PascalCase (check-box → AnimatedCheckBox), landet in components/animations/<id>.tsx und nimmt dieselben Props wie UseAnimations. Der Registry-Index liegt unter /r/registry.json. Für die Kurzform npx shadcn@latest add @useanimations/checkmark tragen Sie die Registry in components.json ein:
{
"registries": {
"@useanimations": "https://useanimations.com/r/{name}.json"
}
}
Eigene Animation
import animationData from './my-animation.json';
<UseAnimations animation={{ animationData, interaction: 'hover' }} />;
Ihre Animation muss eine Lottie-JSON-Datei sein, also im selben Format wie die Icons vorliegen. Der Player unterstützt alles, was die Icons brauchen: Formebenen, Präkompositionen, Null-Ebenen und Parenting, Pfade, Rechtecke, Ellipsen, Konturen, Füllungen, Trim Paths, Masken, Keyframes mit Easing, Hold-Keyframes und Bewegungspfade sowie die Expressions loopOut() und wiggle(). Alles andere, etwa Verläufe, Text- oder Bildebenen, Effekte und Matten, wird nicht gezeichnet; die Konsole warnt bei nicht unterstützten Ebenen, Formen und Expressions.
Dateien & icons.json
Jedes Icon lässt sich auch herunterladen, von seiner Seite oder über stabile URLs mit aktiviertem CORS:
| Datei | URL |
|---|---|
| Animation (Lottie JSON) | https://useanimations.com/icons/<id>.json |
| Statisches SVG je Zustand | https://useanimations.com/icons/<id>/<state>.svg |
| ZIP mit JSON und SVGs | https://useanimations.com/icons/<id>.zip |
| Icon-Seite (nur Englisch) | https://useanimations.com/icons/<id> |
| Katalog aller Icons | https://useanimations.com/icons.json |
icons.json listet jedes Icon mit ID, Titel, Kategorie, Suchbegriffen, Interaktion, Datei-URLs, Größe und Dauer sowie seinem react-useanimations-Import und dem shadcn-Befehl auf. Das npm-Paket liefert dieselben Daten mit: react-useanimations/catalog.json (Metadaten), react-useanimations/icons (die Animationen) und react-useanimations/svg.json (die statischen SVGs).
Ohne React verwenden
Die Icons sind Standard-Lottie-JSON, jeder Lottie-Player kann sie also von https://useanimations.com/icons/<id>.json oder aus einer Kopie in Ihrem Projekt abspielen. Außerhalb von React verdrahten Sie die Interaktion selbst. Weitere Player und Beispiele finden Sie unter Lottie-Icons.
Einige Icons nutzen After-Effects-Expressions (loopOut(), wiggle()); in icons.json sind sie mit requiresFullPlayer gekennzeichnet. Im Web brauchen sie den vollständigen Build von lottie-web, nicht lottie_light, und native Player werten keine Expressions aus.
HTML und JavaScript
<div id="icon" style="width: 48px; height: 48px"></div>
<script src="https://cdn.jsdelivr.net/npm/lottie-web@5.13.0/build/player/lottie.min.js"></script>
<script>
const el = document.getElementById('icon');
const animation = lottie.loadAnimation({
container: el,
renderer: 'svg',
loop: false,
autoplay: false,
path: 'https://useanimations.com/icons/archive.json',
});
// Hover: vorwärts beim Betreten, rückwärts beim Verlassen
el.addEventListener('mouseenter', () => {
animation.setDirection(1);
animation.play();
});
el.addEventListener('mouseleave', () => {
animation.setDirection(-1);
animation.play();
});
</script>
Mit dem SVG-Renderer kann das Icon wie die React-Komponente die Textfarbe übernehmen:
#icon path[stroke^='rgb']:not([stroke='rgb(255,255,255)']) {
stroke: currentColor;
}
#icon path[fill='rgb(0,0,0)'] {
fill: currentColor;
}
Vue
<script setup>
import lottie from 'lottie-web';
import { onBeforeUnmount, onMounted, ref } from 'vue';
const el = ref(null);
let animation;
onMounted(() => {
animation = lottie.loadAnimation({
container: el.value,
renderer: 'svg',
loop: true,
autoplay: true,
path: 'https://useanimations.com/icons/loading.json',
});
});
onBeforeUnmount(() => animation?.destroy());
</script>
<template>
<div ref="el" style="width: 48px; height: 48px" />
</template>
React Native
import LottieView from 'lottie-react-native';
<LottieView source={require('./loading.json')} autoPlay loop style={{ width: 48, height: 48 }} />;
iOS
Mit lottie-ios und dem JSON in Ihrem App-Bundle:
import Lottie
import SwiftUI
LottieView(animation: .named("loading"))
.looping()
.frame(width: 48, height: 48)
Android
Mit lottie-android in Jetpack Compose und dem JSON in res/raw:
val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.loading))
LottieAnimation(composition, iterations = LottieConstants.IterateForever, modifier = Modifier.size(48.dp))
Flutter
Mit dem Paket lottie:
Lottie.asset('assets/loading.json', width: 48, height: 48)
Performance & Barrierefreiheit
- Klein: Der Player ist gzip-komprimiert 8 kB groß und hat keine Abhängigkeiten; ein Icon hat 1 bis 15 kB (Median 2 kB).
- Lazy: Animationen werden nur im Browser gezeichnet, nachdem die Seite gerendert ist. Automatisch startende Loops pausieren, solange sie aus dem sichtbaren Bereich gescrollt sind, und beim Unmount wird alles aufgeräumt.
- Standardmäßig dekorativ: Icons sind für Screenreader verborgen (
aria-hidden), solange Sie keinaria-labelübergeben; mit Label werden sie als Bild angesagt. Für Bedienelemente, die nur aus einem Icon bestehen, nutzen Sie einen echten<button>mitaria-label(siehe oben) und geben den Toggle-Zustand mitaria-pressedoderaria-expandedwieder. - Reduzierte Bewegung und Touch: Die Icons berücksichtigen
prefers-reduced-motion, und Tippen auf Touchscreens löst keine Hover-Animationen aus.
KI-Coding-Agenten
Agenten können Icons per Stichwort oder Interaktion aus icons.json oder aus react-useanimations/catalog.json im Paket auswählen und die dort angegebene Importzeile oder den shadcn-Befehl verwenden. Auch die Typdefinitionen jedes Icon-Imports enthalten Titel, Keywords, Interaktion und Vorschau. Diese Dokumentation gibt es als Markdown unter /documentation.md, und /llms.txt indexiert die Website.
Upgrade von v2
Für die meisten Apps bedeutet das Upgrade nur, v3 zu installieren: Die Komponente, die Imports aus react-useanimations/lib/<name> und alle 79 Icons aus v2 bleiben gleich. Arbeiten Sie die folgenden Schritte ab, soweit sie Ihren Code betreffen.
1. v3 installieren
v3 braucht React 18 oder neuer und hat keine Abhängigkeiten. Entfernen Sie auch lottie-web, sofern nichts anderes in Ihrer App es nutzt.
npm install react-useanimations@3
npm uninstall lottie-web
2. reverse durch active ersetzen
active ist vollständig kontrolliert: Das Icon animiert, wenn sich active ändert, und ein Klick allein schaltet es nicht um. Aktualisieren Sie den Wert also in onClick. reverse funktioniert weiterhin wie in v2 (es legt den Startzustand fest, und Klicks schalten das Icon um), ist aber veraltet. Beide wirken nur bei click-toggle-Icons: Die vier Pfeilkreise spielen jetzt per Klick erneut ab (siehe Schritt 6).
- <UseAnimations animation={checkBox} reverse={checked} onClick={toggle} />
+ <UseAnimations animation={checkBox} active={checked} onClick={toggle} />
3. Farben prüfen
In v2 waren die Icons schwarz, solange Sie kein strokeColor gesetzt hatten. In v3 übernehmen sie die Textfarbe (currentColor), und fillColor ist standardmäßig gleich strokeColor. Icons in farbigem Text oder in Links ändern ihre Farbe also mit; sollen sie schwarz bleiben, setzen Sie die Farbe selbst:
<UseAnimations animation={github} strokeColor="#000" />
4. wrapperStyle, pathCss und options ersetzen
wrapperStyleist veraltet: Nutzen Siestyle.pathCsswurde entfernt: Stylen Sie die Pfade über eine Klasse.options(Einstellungen für lottie-web) wurde zusammen mit lottie-web entfernt. Nutzen Sie die Propsloop,autoplayundspeed; für andere lottie-web-Optionen gibt es keine Entsprechung.
Werden pathCss oder options trotzdem übergeben, erscheint einmalig eine Warnung; die Werte werden ignoriert.
- <UseAnimations animation={github} wrapperStyle={{ margin: 8 }} pathCss="stroke-width: 3px;" options={{ loop: true }} />
+ <UseAnimations animation={github} style={{ margin: 8 }} className="thick" loop />
.thick path {
stroke-width: 3px;
}
5. Wrapper-Element prüfen
Der Wrapper ist jetzt ein <span> mit inline-block statt eines <div>. Er ist damit innerhalb von Buttons und Links gültig und sitzt auf der Textzeile. Passen Sie CSS an, das den Wrapper als div anspricht, und verteilen Sie animationProps im Prop render auf ein <span>:
render={(eventProps, animationProps) => (
<button type="button" aria-label="Like" {...eventProps}>
- <div {...animationProps} />
+ <span {...animationProps} />
</button>
)}
Icons sind jetzt für Screenreader verborgen (aria-hidden), solange Sie kein aria-label übergeben; ergänzen Sie eines bei Icons, die für sich allein eine Bedeutung tragen.
6. Icons mit geänderter Interaktion prüfen
Die Interaktionen entsprechen jetzt denen auf useanimations.com. Soll sich ein Icon wie in v2 verhalten, übergeben Sie seine alte Interaktion:
| Icons | v2 | v3 |
|---|---|---|
arrowDownCircle, arrowLeftCircle, arrowRightCircle, arrowUpCircle |
click-toggle |
click-replay |
calendar, folder, home, instagram, userMinus, userPlus, userX, youtube, youtube2 |
hover-replay* |
hover |
behance, codepen, facebook, github, linkedin, pocket, twitter |
hover-replay* |
hover-loop |
copy, edit, mail |
click-replay |
hover |
dribbble |
hover |
hover-loop |
zoomIn, zoomOut |
loop |
hover |
* In v2 spielten diese Icons beim Betreten mit der Maus einmal ab und sprangen beim Verlassen an den Anfang zurück; hover-replay kommt dem am nächsten.
<UseAnimations animation={zoomIn} interaction="loop" />
7. Imports aktualisieren
Importieren Sie Icons nur noch als react-useanimations/lib/<name> oder aus react-useanimations/icons. Interne Dateipfade aus v2 wie react-useanimations/lib/github/index oder react-useanimations/lib/github/github.json lassen sich nicht mehr auflösen; das Lottie JSON ist die animationData des Icons:
- import githubJson from 'react-useanimations/lib/github/github.json';
+ import github from 'react-useanimations/lib/github';
+ const githubJson = github.animationData;
Die Pfade unter react-useanimations/utils wurden entfernt. Importieren Sie die Typen aus dem Paket:
- import type { Animation, AnimationKey } from 'react-useanimations/utils';
+ import type { Animation, AnimationKey, Interaction, UseAnimationsProps } from 'react-useanimations';
Animation ist jetzt { animationData, interaction }; das Feld animationKey aus v2 gibt es nicht mehr. Selbst gebaute Objekte verwenden stattdessen interaction.
Was sonst neu ist
221 zusätzliche Icons (300 insgesamt), mehrere Icons auf einmal aus react-useanimations/icons, Unterstützung für reduzierte Bewegung, Hover per Tastaturfokus, keine hängenbleibenden Hover-Animationen auf Touchscreens, Server-Rendering ohne Workarounds und eine shadcn-Registry.
Lizenz
Die Icons und der Code stehen unter der MIT-Lizenz: Sie dürfen sie in privaten und kommerziellen Projekten nutzen, verändern und weitergeben. Eine Namensnennung ist nicht erforderlich, freut uns aber:
Animated icons by <a href="https://useanimations.com">useAnimations</a>
Alle Bedingungen: Lizenz & Nutzungsbedingungen.
Häufige Fragen
Ist useAnimations für kommerzielle Projekte kostenlos?
Ja. Die Icons und das Paket stehen unter der MIT-Lizenz, eine Namensnennung ist nicht erforderlich.
Wie ändere ich die Farbe eines Icons?
Icons übernehmen die Textfarbe. Ändern lässt sie sich mit strokeColor und fillColor, mit der CSS-Eigenschaft color oder über Styles für die Pfade. Siehe Größe & Farbe.
Funktioniert es auch ohne React?
Das Paket ist für React gedacht. Jedes Icon gibt es aber auch als Lottie-JSON-Datei, die lottie-web, lottie-ios, lottie-android, Flutter und React Native abspielen können, und als statisches SVG. Siehe Ohne React verwenden und Lottie-Icons.
Können KI-Coding-Agenten useAnimations nutzen?
Ja. Verweisen Sie sie auf icons.json und /documentation.md; das Paket selbst liefert catalog.json und dokumentierte Typen für jedes Icon mit.