Нет смысла использовать $(document).ready()
внутри функции, и для анимации всех изображений у вас должна быть начальная точка.
Затем вы анимируете, используя setInterval
, который, как известно, не пощадит ваш браузер, даже если он свернут или переключен.
Используйте requestAnimationframe
для более плавной и плавной анимации, это также помогает контролировать такие факторы, как переход ноутбука в ноутбук / телефон / планшет в режим работы от аккумулятора и снижение его производительности. Факторы, такие как другая вкладка, принимающая фокус. Подробнее Здесь
Также вместе с requestAnimationframe
, если вам тоже нужно остановить анимацию, используйте cancelAnimationFrame
.
- Начните с добавления изображений в документ, а затем скройте все, кроме первого изображения.
- Запустите анимацию, позвонив по номеру
requestAnimationFrame(animationFunction)
.
- Используйте SetTimeout для постановки анимации в очередь и рекурсивного вызова
requestAnimationFrame(animationFunction)
.
См. Демонстрацию ниже. Я использовал FontAwesome Icons для демонстрации, поэтому измените несколько вещей в следующем
Заменить имя класса на путь к изображению
var backgroundImage = new Array(
"fa fa-address-book",
"fab fa-accessible-icon",
"fa fa-ambulance",
"fab fa-amilia",
"fa fa-anchor",
"fab fa-android",
"fab fa-angellist",
);
и измените строку
$("#images").append('<div class = "sp"><i class = "' + value + '"></i></div>');
до
$("#images").append('<div class = "sp"><img src= "' + value + '" ></div>');
$(document).ready(function() {
//background images
var backgroundImage = new Array(
"fa fa-address-book",
"fab fa-accessible-icon",
"fa fa-ambulance",
"fab fa-amilia",
"fa fa-anchor",
"fab fa-android",
"fab fa-angellist",
);
// store your requestAnimatFrame request ID value
var requestId;
//add images to the document
$.each(backgroundImage, function(index, value) {
$("#images").append('<div class = "sp"><i class = "' + value + '"></i></div>');
});
// hide all but not the first image
$('#images div.sp').not(':first-child').hide();
//start animation
requestAnimationFrame(animate);
});
//the animation function
function animate() {
setTimeout(function() {
//save the id returned from the function to use it
//for canceling or stopping the animation
requestId = requestAnimationFrame(animate);
// animating/drawing code goes here
animateIcons(requestId);
}, 2000);
}
function animateIcons(requestId) {
//get the visile element
let curElem = $("#images div.sp:visible");
//if next element exists
let hasNext = curElem.next().length > 0;
//if has next sibling
if (hasNext) {
//fade out the current element
curElem.fadeOut(1000, function() {
//fade in the next sibling
curElem.next().fadeIn(1000);
});
} else {
// //start animating from the start again
let firstElem = $("#images div.sp:first-child");
//fade out the current element
curElem.fadeOut(1000, function() {
//fade in the first element again
firstElem.fadeIn(1000);
});
//or you can use the following alternatively
// to stop the animation
// stopAnimation(requestId);
}
}
function stopAnimation(requestId) {
// use the requestID to cancel the requestAnimationFrame call
cancelAnimationFrame(requestId);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
<style>
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 1.9em;
}
</style>
<div id="container" align="center">
<div id="slider-wrapper">
<div id="slider">
<div class="backgoundImage">
<div id="images"></div>
</div>
</div>
</div>
</div>
Я добавил функцию stopAnimation()
с кодом, поэтому, если вы хотите остановить анимацию после того, как она оживила все изображения, которые вы можете вызвать, я передал requestId
в функцию animateIcons(requestId)
для того же Для этого вы можете откомментировать код в других функциях, чтобы использовать его, или вы можете полностью удалить его, если планируете его не использовать.