Guías · 06
Líneas de tiempo Ejecuta muchas pistas desde un reloj que se puede posicionar: reproducir, pausar, buscar, invertir y cambiar la velocidad.
Pistas sobre un reloj useTimeline(tracks, options, deps) crea una línea de tiempo que pertenece al componente. Cada pista es una lista de keyframes, o { values, times, at, duration } con at y duration en milisegundos.
progress es una variable CSS, y las pistas numéricas o de longitud son expresiones calc() de ella, así que una línea de tiempo en un style normal escribe una variable por fotograma.
JavaScript está desactivado. El código de abajo es el ejemplo completo.
App.jsx import { useRef } from 'react' ;
import { useTimeline } from '@kkwaenggwari/animated' ;
import './styles.css' ;
export default function App ({ duration = 3000 , repeat = true } ) {
const timeline = useTimeline (
{
x : ['0px' , '220px' , '220px' , '0px' , '0px' ],
y : ['0px' , '0px' , '110px' , '110px' , '0px' ],
turn : ['0deg' , '90deg' , '180deg' , '270deg' , '360deg' ],
round : ['50%' , '12%' , '50%' , '12%' , '50%' ],
},
{ duration, repeat : repeat ? Infinity : 0 },
[duration, repeat],
);
const bar = useRef (null );
const seek = (event ) => {
const box = bar.current .getBoundingClientRect ();
const ratio = Math .min (1 , Math .max (0 , (event.clientX - box.left ) / box.width ));
timeline.pause ();
timeline.seek (ratio * timeline.duration );
};
const { x, y, turn, round } = timeline.values ;
return (
<div className ="stage" >
<div className ="canvas" >
<span
className ="shape"
style ={{ transform: `translate (${x }, ${y }) rotate (${turn })`, borderRadius: round }}
/>
</div >
<div className ="player" >
<button type ="button" onClick ={() => timeline.play()}>
Play
</button >
<button type ="button" onClick ={() => timeline.pause()}>
Pause
</button >
<div
ref ={bar}
className ="scrub"
onPointerDown ={(event) => {
event.currentTarget.setPointerCapture(event.pointerId);
seek(event);
}}
onPointerMove={(event) => {
if (event.buttons) seek(event);
}}
>
<span style ={{ transform: `scaleX (${timeline.progress })` }} />
</div >
</div >
</div >
);
}styles.css .stage {
display : grid;
gap : 16px ;
padding : 28px ;
}
.canvas {
height : 190px ;
padding : 20px ;
border-radius : 16px ;
background : #0b1440 ;
}
.shape {
display : block;
width : 60px ;
height : 60px ;
background : #5c7cff ;
}
.player {
display : flex;
align-items : center;
gap : 8px ;
}
.player button {
min-height : 40px ;
padding : 0 16px ;
border : 1px solid #e4e6ef ;
border-radius : 999px ;
background : #fff ;
font : inherit;
cursor : pointer;
}
.scrub {
flex : 1 ;
height : 12px ;
border-radius : 999px ;
background : #eef2ff ;
overflow : hidden;
cursor : pointer;
touch-action : none;
}
.scrub span {
display : block;
height : 100% ;
background : #2854ff ;
transform-origin : left center;
}Control de la reproducción play({ from, rate }), pause(), seek(ms) y reverse() controlan el reloj. state, currentTime, duration y la promesa finished lo describen. repeat y repeatDelay lo repiten.
Title.jsx Copiar código const intro = useTimeline (
{
y : ['24px' , '0px' ],
fade : { values : [0 , 1 ], at : 0 , duration : 300 },
line : { values : [0 , 1 ], at : 200 , duration : 600 },
},
{ duration : 800 },
);
intro.seek (400 );
intro.play ({ rate : 0.5 });
intro.reverse ();Fuera de React createTimeline es el mismo reloj sin componente. Llama a dispose() cuando termines.