@Incold

Почему анимация срабатывает один раз?

Пытаюсь сделать fade эффект на слайдере. Но анимация срабатывает только один раз.
Компонента:
const [activeSlide, setActiveSlide] = useState(1);
    const [intervalId, setIntervalId] = useState(null);
    const {t} = useTranslation();

    const slides = useMemo(() => [
        {id: 1, text: t('abclass.lessonsPerMonth'), icon: <CalendarIcon />},
        {id: 2, text: t('abclass.learnChess'), icon: <CalendarIcon />},
        {id: 3, text: t('abclass.certificates'), icon: <CalendarIcon />},
        {id: 4, text: t('abclass.statistic'), icon: <CalendarIcon />},
        {id: 5, text: t('abclass.homework'), icon: <CalendarIcon />}
    ], []);

    const images = useMemo(() => [
        "https://avatars.mds.yandex.net/get-zen_doc/1222645/pub_5b95308bf3ce7200aad896cd_5b953eb746f39d00aa674b68/scale_1200",
        "https://img3.goodfon.ru/wallpaper/nbig/d/8a/kasatka-pryzhok-gory.jpg",
        "http://quick-trips.com/wp-content/uploads/2017/12/4444444444444445.jpg",
        "https://images.wallpaperscraft.ru/image/mclaren_p1_krasnyj_sportkar_vid_sboku_109728_4000x2667.jpg",
        "https://avatars.mds.yandex.net/get-zen_doc/34175/pub_5c07951379557300aa9629b6_5c07abd381ae5000a9d16f79/scale_1200"
    ], [])


    useEffect(() => {
        let interval = setTimeout(() => {
            if (activeSlide === slides.length) setActiveSlide(1)
            else setActiveSlide(activeSlide + 1)
        }, 5000)
        setIntervalId(interval)
        return () => {
            clearInterval(interval)
        }
    }, [activeSlide])

    return (
        <div className={style.container}>
            <div className={style.img}>
                <img className={style[`img__slide${activeSlide}`]} alt="slide" src={images[activeSlide-1]}/>
            </div>
            <div className={style.slides}>
                {
                    slides.map(slide => (
                        <div
                            key={slide.id}
                            className={classnames(style.slides__slide, {
                                [style.slides__slide_active]: activeSlide === slide.id
                            })}
                            onClick={() => {
                                clearInterval(intervalId)
                                setActiveSlide(slide.id)
                            }}
                        >
                            {slide.icon}
                            <p>{slide.text}</p>
                        </div>
                    ))
                }
            </div>
        </div>


Стили:
.container {
  display: flex;
  width: 100%;
  margin: 0 auto 145px;
  max-width: 1090px;
}

.img {
  flex: 1;
  margin-right: 45px;
  height: 500px;
  img {
    width: 100%;
    height: 100%;
    object-fit: contain;
  }
  @for $i from 1 through 5 {
    .img__slide#{$i} {
      opacity: 0;
      animation: fade .3s ease-in forwards;
    }
  }
}

.slides {
  display: flex;
  flex: none;
  flex-direction: column;
  width: 250px;
  padding: 15px 0;
  &__slide {
    display: flex;
    cursor: pointer;
    align-items: center;
    font-size: 16px;
    width: 100%;
    height: 75px;
    line-height: 18px;
    position: relative;
    color: #676767;
    border-bottom: 1px solid #E8E8E8;
    svg {
      flex: none;
    };
    p {
      margin-left: 20px;
    }
    &:hover {
      color: #000
    }
    &_active {
      color: #000 !important;
      &::before {
        content: '';
        position: absolute;
        bottom: 0;
        left: 0;
        height: 2px;
        background: #89DAE2;
        width: 0;
        animation: progress 5s linear;
        transform: translateY(1px);
      }
    }
  }
}

@keyframes progress {
  from {
    width: 0;
  }
  to {
    width: 100%;
  }
}

@keyframes fade {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

Почему анимация срабатывает один раз, если у меня класс меняется? Как это поправить? Заранее, спасибо, за любую помощь!
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ответы на вопрос 1
valgerofficial
@valgerofficial
animation: 5s linear infinite;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы