我一直在使用jQuery 3.1.1开发自己的JavaScript幻灯片。它工作正常,但由于某种原因,过渡动画不平滑。当只有两张照片时,它可以正常工作,但是一旦我添加了三张照片,它根本不起作用。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');});'。 –