В настоящее время у меня есть код, который выглядит примерно так:
import React from 'react';
import testimonials from './testimonials';
import {INTERVAL, FADE_OUT_ANIMATION_TIME, FADE_IN_ANIMATION_TIME} from './config';
class Carousel extends React.PureComponent {
constructor(props) {
super(props);
this.startCarousel = this.startCarousel.bind(this);
this.currentIdx = 0;
}
startCarousel = () => {
this.intervalID = setInterval(() => {
const {currentIdx, carouselContainer} = this;
const testimonials = carouselContainer.children;
const nextIdx = currentIdx + 1 !== testimonials.length ? currentIdx + 1 : 0;
testimonials[currentIdx].classList.add('fadeOut');
setTimeout(() => {
testimonials[currentIdx].classList.add('hide');
testimonials[currentIdx].classList.remove('fadeOut');
testimonials[nextIdx].classList.remove('hide');
testimonials[nextIdx].classList.add('fadeIn');
setTimeout(() => testimonials[nextIdx].classList.remove('fadeIn'), FADE_IN_ANIMATION_TIME);
}, FADE_OUT_ANIMATION_TIME);
this.currentIdx = nextIdx;
}, INTERVAL);
}
componentDidMount() {
this.startCarousel();
}
componentWillUnmount() {
clearInterval(this.intervalID);
}
render() {
return (
<div className="Carousel__container" ref={(ele) => this.carouselContainer = ele} >
{testimonials.map(renderTestimonials)}
</div>
);
}
}
export default Carousel;
Все, что я делаю, - это циклический просмотр различных элементов, визуализируемых внутри моего контейнера с каруселью, изменение имен классов вокруг каждого интервала для запуска анимации искрыть / показать элементы.Интервал и время ожидания для справки:
export const INTERVAL = 8500;
export const FADE_OUT_ANIMATION_TIME = 800;
export const FADE_IN_ANIMATION_TIME = 1200;
Это работает в Chrome, Safari, Firefox, Edge, но не в Internet Explorer 11. Карусель никогда не зацикливается на первом элементе.Из того, что я могу сказать, похоже, что это не проблема CSS, поскольку анимации правильно запускаются и анимируются, когда я вручную добавляю соответствующие имена классов в консоли разработчика.Методы [DOMElement].classList.add/remove
, похоже, тоже хорошо работают.Я попытался вручную воссоздать вышеупомянутый setInterval
код в консоли IE11, и кажется, что может быть проблема с вложенными setTimeout
s в setInterval
?
. Из того, что я заметил, похоже, чтоfadeIn
имя класса добавлялось правильно, но имя класса hide
не удалялось, за исключением случаев, когда оно возвращалось к самому первому элементу в контейнере.
Кто-нибудь имеет представление о том, что здесь может происходить?Любой совет, как я мог бы сделать эту работу, как задумано?