Я работаю над своим собственным слайд-шоу JavaScript, используя jQuery 3.1.1. Он работает нормально, но почему-то переходная анимация негладкая. Когда есть только две фотографии, она работает нормально, но как только я добавлю третий, она не работает хорошо.JavaScript слайд-шоу не является гладким
Я сделал эту скрипку, если бы кто-то мог предложить некоторое понимание, было бы весьма полезно.
!function($) {
"use strict";
$.slideshow = function(container) {
let $container = $(container);
let children = $container.find('.slide').length;
$container.find('.slide').each(function(index) {
let zIndex = 210 - index;
let bg = $(this).data('bg');
$(this).css('background-image', 'url(' + bg + ')');
});
let settings = {
'transition': 500,
'delay': 6000,
};
let currentSlide = 0;
$.fn.showNext = function() {
let nextSlide = ((currentSlide + 1) < children) ? (currentSlide + 1) : 0;
let $current = $container.find('.slide:nth-child(' + (currentSlide + 1) + ')');
let $next = $container.find('.slide:nth-child(' + (nextSlide + 1) + ')');
$current.animate({
'opacity': 0
}, settings.transition);
setTimeout(function() {
$current.css('z-index', 200);
$current.css('opacity', 1);
$next.css('z-index', 210);
}, settings.transition + 100);
console.log(currentSlide, nextSlide);
currentSlide = ((currentSlide + 1) < children) ? (currentSlide + 1) : 0;
setTimeout(function() {
$container.showNext();
}, settings.delay);
};
setTimeout(function() {
$container.showNext();
}, settings.delay);
};
}(jQuery);
$.slideshow('.slideshow');
.slideshow-wrapper {
height: 100vh;
overflow: hidden;
position: relative;
width: 100%;
}
.slideshow {
height: 100%;
position: relative;
width: 100%;
}
.slide {
background-position: center;
background-size: cover;
height: 100%;
left: 0;
overflow: hidden;
position: absolute;
top: 0;
width: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<div class="slideshow-wrapper">
<div class="slideshow">
<div class="slide" data-bg="https://s3.amazonaws.com/StartupStockPhotos/uploads/20160503/6.jpg"></div>
<div class="slide" data-bg="https://s3.amazonaws.com/StartupStockPhotos/uploads/20160503/5.jpg"></div>
<div class="slide" data-bg="https://s3.amazonaws.com/StartupStockPhotos/uploads/20160503/4.jpg"></div>
</div>
</div>
Я очень ценю, что вы внимательно изучаете мой код. Использование 'setInteval' определенно то, что я хотел вместо нескольких тайм-аутов. Я думаю, что фрагмент здесь ведет себя несколько иначе, чем мой фактический продукт, но то, что я закончил, - это получить предыдущий образ и сделать его z-индекс ниже следующего в очереди с переходом; они были такими же, чтобы иногда показывать неправильный образ. Спасибо огромное! –
Добро пожаловать! Раньше я сталкивался с подобными проблемами со слайд-шоу. Рад, что я могу помочь вам сегодня! – Clomp
«Это бежит в состояние гонки» -> Условия гонки в Javascript невозможны из-за однопоточной природы. То, что вы описываете, не ждет, пока ресурс будет доступен, прежде чем действовать на него, так же, как и то, что произойдет, если вы попытаетесь открыть файл до его существования, просмотрите диск до его установки и т. Д. В этом случае Метод 'setTimeout()' следует избегать, потому что нет гарантии, что DOM будет готов к следующему тику. Вы хотите перенести инициализатор слайд-шоу в событие 'document.ready', например:' $ (function() {$ .slideshow ('. Slideshow');}); '. –