Я думаю, что для карусели функция useTransition лучше, чем useSprings. Вы можете определить входящую и выходящую анимацию с помощью useTransition. При нажатии кнопки «Далее» предыдущее и следующее изображение должны перекрываться, поэтому я изменил положение на абсолютное. Таким образом, макет страницы немного изменился. Вы должны это исправить.
export default function App() {
const [count, setCount] = useState(0);
const transitions = useTransition([count], item => item, {
from: { opacity: 0, marginTop: 10, position: 'absolute', boxShadow: "0px 100px 20px 0px rgba(0,0,0,0.4)" },
enter: { opacity: 1, marginTop: 50},
leave: {opacity: 0, marginTop: 100}
});
const prevSlide = () => {
let prevSlide = count - 1 < 0 ? cards.length - 1 : count - 1;
setCount(prevSlide);
};
const nextSlide = () => {
let nextSlide = count + 1 < cards.length ? count + 1 : 0;
setCount(nextSlide);
};
return (
<div>
<div className="container">
{transitions.map(({item, props, key}) => (
<animated.div key={key} style={props}>
{item}
<img src={cards[item]} alt="carousel-img" />
</animated.div>
))}
</div>
<div className="carousel__prev" onClick={prevSlide}>
◀︎
</div>
<div className="carousel__next" onClick={nextSlide}>
▶︎
</div>
</div>
);
}
Это пример codeSandbox: https://codesandbox.io/s/image-carousel-with-react-spring-usetransition-q1ndd
В примере с кодами и ящиками я также ввел реверсивное состояние, потому что было бы лучше, если бы я изменил анимацию с помощью кнопки prev.