Animationen und Übergänge
Die Smolitux UI Bibliothek bietet ein leistungsstarkes Animationssystem, das die Erstellung von flüssigen und ansprechenden Benutzeroberflächen erleichtert.
Überblick
Das Animationssystem besteht aus mehreren Komponenten:
- Komponenten:
Fade
,Zoom
,Slide
,Collapse
für häufig verwendete Animationseffekte - Hooks:
useTransition
unduseAnimation
für benutzerdefinierte Animationen - Hilfsfunktionen:
keyframes
,createTransition
für die Definition von Animationen - Komponenten:
Motion
undAnimatePresence
für komplexe Animationen
Grundlegende Verwendung
Einfache Übergangseffekte
import { Fade, Button } from '@smolitux/core';
import { useState } from 'react';
function FadeExample() {
const [isVisible, setIsVisible] = useState(false);
return (
<div>
<Button onClick={() => setIsVisible(!isVisible)}>
{isVisible ? 'Ausblenden' : 'Einblenden'}
</Button>
<Fade in={isVisible}>
<div className="content-box">
Dieser Inhalt wird ein- und ausgeblendet.
</div>
</Fade>
</div>
);
}
Verschiedene Animationskomponenten
import { Fade, Zoom, Slide, Collapse, Button } from '@smolitux/core';
import { useState } from 'react';
function AnimationExamples() {
const [isVisible, setIsVisible] = useState(false);
return (
<div>
<Button onClick={() => setIsVisible(!isVisible)}>
{isVisible ? 'Ausblenden' : 'Einblenden'}
</Button>
<h3>Fade</h3>
<Fade in={isVisible}>
<div className="content-box">Fade-Effekt</div>
</Fade>
<h3>Zoom</h3>
<Zoom in={isVisible}>
<div className="content-box">Zoom-Effekt</div>
</Zoom>
<h3>Slide</h3>
<Slide in={isVisible} direction="right">
<div className="content-box">Slide-Effekt</div>
</Slide>
<h3>Collapse</h3>
<Collapse in={isVisible}>
<div className="content-box">Collapse-Effekt</div>
</Collapse>
</div>
);
}
Erweiterte Funktionen
Anpassung von Übergängen
Sie können die Übergänge anpassen:
import { Fade } from '@smolitux/core';
function CustomFade() {
return (
<Fade
in={true}
timeout={500} // Dauer in Millisekunden
transition="easeOut" // Übergangstyp
appear={true} // Animation beim ersten Rendern
>
<div>Angepasster Fade-Effekt</div>
</Fade>
);
}
Verwendung des useTransition Hooks
Für mehr Kontrolle können Sie den useTransition
Hook verwenden:
import { useTransition } from '@smolitux/core';
import { useState } from 'react';
function CustomTransition() {
const [isVisible, setIsVisible] = useState(false);
const { state, isVisible: visible, ref, style } = useTransition({
in: isVisible,
timeout: 300,
transition: 'easeInOut',
appear: true,
mountOnEnter: true,
unmountOnExit: true,
onEntered: () => console.log('Transition completed'),
onExited: () => console.log('Exit completed')
});
return (
<div>
<button onClick={() => setIsVisible(!isVisible)}>
Toggle
</button>
{visible && (
<div ref={ref} style={style} data-state={state}>
Dieser Inhalt wird animiert.
</div>
)}
</div>
);
}
Benutzerdefinierte Animationen mit Motion
Für komplexere Animationen können Sie die Motion
Komponente verwenden:
import { Motion, keyframes } from '@smolitux/core';
// Definieren Sie Keyframes für die Animation
const bounce = keyframes`
0%, 20%, 50%, 80%, 100% {
transform: translateY(0);
}
40% {
transform: translateY(-30px);
}
60% {
transform: translateY(-15px);
}
`;
function BounceAnimation() {
return (
<Motion
animate={{
animation: bounce,
duration: '1s',
iterationCount: 'infinite'
}}
>
<div className="ball" />
</Motion>
);
}
Animationsvarianten
Sie können verschiedene Animationsvarianten definieren:
import { Motion } from '@smolitux/core';
import { useState } from 'react';
function VariantAnimation() {
const [isActive, setIsActive] = useState(false);
const variants = {
inactive: {
scale: 1,
backgroundColor: '#ccc'
},
active: {
scale: 1.2,
backgroundColor: '#f00'
}
};
return (
<div>
<button onClick={() => setIsActive(!isActive)}>
Toggle
</button>
<Motion
variants={variants}
animate={isActive ? 'active' : 'inactive'}
transition={{ duration: 0.3 }}
>
<div className="box" />
</Motion>
</div>
);
}
AnimatePresence für Animationen beim Entfernen von Elementen
Die AnimatePresence
Komponente ermöglicht Animationen beim Entfernen von Elementen aus dem DOM:
import { AnimatePresence, Motion } from '@smolitux/core';
import { useState } from 'react';
function AnimatePresenceExample() {
const [items, setItems] = useState([1, 2, 3]);
const removeItem = (id) => {
setItems(items.filter(item => item !== id));
};
return (
<div>
<button onClick={() => setItems([...items, items.length + 1])}>
Item hinzufügen
</button>
<ul>
<AnimatePresence>
{items.map(item => (
<Motion
key={item}
initial={{ opacity: 0, height: 0 }}
animate={{ opacity: 1, height: 'auto' }}
exit={{ opacity: 0, height: 0 }}
transition={{ duration: 0.3 }}
>
<li>
Item {item}
<button onClick={() => removeItem(item)}>Entfernen</button>
</li>
</Motion>
))}
</AnimatePresence>
</ul>
</div>
);
}
Animationsübergänge
Die Bibliothek bietet verschiedene vordefinierte Übergänge:
fade
: Ein- und Ausblendenscale
: Skalierungslide
: Gleiten von einer Seitecollapse
: Zusammenklappenrotate
: RotationeaseIn
: BeschleunigungeaseOut
: VerlangsamungeaseInOut
: Beschleunigung und Verlangsamungbounce
: Federnder Effektelastic
: Elastischer Effekt
Sie können auch benutzerdefinierte Übergänge erstellen:
import { createTransition, Fade } from '@smolitux/core';
// Benutzerdefinierter Übergang
const customTransition = createTransition({
entering: {
opacity: 1,
transform: 'translateY(0)'
},
exiting: {
opacity: 0,
transform: 'translateY(-20px)'
},
duration: 400,
easing: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)'
});
function CustomTransitionExample() {
return (
<Fade in={true} transition={customTransition}>
<div>Benutzerdefinierter Übergang</div>
</Fade>
);
}
Animationssteuerung
Mit dem useAnimation
Hook können Sie Animationen programmatisch steuern:
import { useAnimation, Motion } from '@smolitux/core';
import { useEffect } from 'react';
function ControlledAnimation() {
const controls = useAnimation();
// Animation starten
const startAnimation = () => {
controls.start({
x: 100,
transition: { duration: 0.5 }
});
};
// Animation stoppen
const stopAnimation = () => {
controls.stop();
};
// Animation zurücksetzen
const resetAnimation = () => {
controls.set({ x: 0 });
};
return (
<div>
<div>
<button onClick={startAnimation}>Start</button>
<button onClick={stopAnimation}>Stop</button>
<button onClick={resetAnimation}>Reset</button>
</div>
<Motion animate={controls}>
<div className="box" />
</Motion>
</div>
);
}
Animationssequenzen
Sie können auch Animationssequenzen erstellen:
import { useAnimation, Motion } from '@smolitux/core';
function SequenceAnimation() {
const controls = useAnimation();
const playSequence = async () => {
await controls.start({ x: 100, transition: { duration: 0.5 } });
await controls.start({ y: 100, transition: { duration: 0.5 } });
await controls.start({ x: 0, transition: { duration: 0.5 } });
await controls.start({ y: 0, transition: { duration: 0.5 } });
};
return (
<div>
<button onClick={playSequence}>Sequenz abspielen</button>
<Motion animate={controls}>
<div className="box" />
</Motion>
</div>
);
}
Zusammenfassung
Das Animationssystem der Smolitux UI Bibliothek bietet:
- Einfache Komponenten für häufig verwendete Animationseffekte
- Hooks für benutzerdefinierte Animationen
- Unterstützung für komplexe Animationen und Übergänge
- Programmatische Steuerung von Animationen
- Animationssequenzen
- Vordefinierte und benutzerdefinierte Übergänge