Я создал ротатор изображений JS / CSS, который вращает 5 разных изображений в разделе моего веб-сайта с эффектом постепенного появления / исчезновения в CSS.
На настольном компьютере / ноутбуке изображения вращаются идеально плавно, хотя примерно один раз в каждом цикле изображения мерцают и быстро переходят к следующему. Какова причина этого?
Источник:-
CSS
@keyframes fadeinout {
0%, 100% { opacity: 0; }
50% { opacity: 1; }
}
#rotator {
animation: fadeinout 3s;
}
JS
function clientRotator(){
var section = document.getElementById("clients");
var clientImg = document.createElement("img");
clientImg.setAttribute("id", "rotator");
section.appendChild(clientImg);
clientImg.src = "assets/exxon-mobil.png";
var imgArray = ["assets/shell.png", "assets/bp.png", "assets/talisman.png", "assets/cnr-international.png", "assets/exxon-mobil.png"];
var delaySeconds = 3;
var iteration = 0;
setInterval(function(){
section.removeChild(clientImg);
clientImg = document.createElement("img");
clientImg.setAttribute("id", "rotator");
section.appendChild(clientImg);
clientImg.src = imgArray[iteration];
clientImg.setAttribute("alt", "Oil & Gas - Gas Turbine Overhauls");
if (iteration < imgArray.length-1){
iteration += 1;
}
else {
iteration = 0;
}
}, delaySeconds * 1000)
}
Вам следует подумать об использовании requestAnimationFrame вместо setInterval: developer.mozilla.org/en-US/docs/Web/API/window/…
@RandyCasburn Я действительно думал, что это возможно, но анимация CSS запускается только тогда, когда JS создает элемент, поэтому этого не должно быть. Единственная причина, по которой я его воссоздаю, - заставить CSS работать плавно, поскольку он не работает с простым изменением источника изображения. Думаю, я мог бы сделать затухание в jQuery.
Вот почему вам следует подумать о добавлении / удалении имен классов, а не полагаться на идентификатор. Это изменение, вероятно, решит вашу проблему, потому что вы не будете воссоздавать узел.
Взгляните на это решение, которое вообще использует НЕТ JavaScript. (это не моя работа): codepen.io/Ahrengot/pen/bKdLC
@RandyCasburn ах, я не подумал попробовать добавить / удалить имена классов - спасибо. Другая проблема, с которой я столкнулся, была на некоторых старых телефонах, мой ротатор очень глючный, но он отлично работает, когда я отключил анимацию затухания после того, как прочитал, что некоторые старые платформы телефонов плохо обрабатывают CSS3, но я дам имя класса и нет -JS попробуй и посмотри, что получится.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Мерцание вызвано небольшой рассинхронизацией js и css, вы можете вызвать мерцание (для тестирования), уменьшив анимацию css с 3 до 2 с.
Чтобы исправить это, просто добавьте в #rotator свойство opacity: 0;.
Возможно, таймер
setIntervalи таймер CSS теряют синхронизацию. Другой вопрос: зачем вы воссоздаете элемент изображения в каждом интервале? В этом нет смысла.