我刚刚制作了具有以下样式的图像幻灯片:
几秒钟后移动的图像。
单击某些圆形按钮时,转到相应的图像。
单击左右箭头时,转到下一张图像。
幻灯片可以正常工作。但是,当在网上冲浪大约3分钟后,我回到系统选项卡,并且滑块的移动速度比正常情况快得多时,就会发生问题。使它恢复正常的唯一方法是更新页面。
我留下代码看是否有错误:
HTML:
<!--=====================================
SLIDESHOW
======================================-->
<div class="container-fluid" id="slide">
<div class="row">
<!--=====================================
SLIDESHOW
======================================-->
<ul>
<?php
$servidor = Ruta::ctrRutaServidor();
$slide = ControladorSlide::ctrMostrarSlide();
foreach ($slide as $key => $value) {
$estiloImgProducto = json_decode($value["estiloImgProducto"], true);
$estiloTextoSlide = json_decode($value["estiloTextoSlide"], true);
$titulo1 = json_decode($value["titulo1"], true);
$titulo2 = json_decode($value["titulo2"], true);
$titulo3 = json_decode($value["titulo3"], true);
echo '<li>
<img src="'.$servidor.$value["imgFondo"].'">
<div class="slideOpciones '.$value["tipoSlide"].'">';
if($value["imgProducto"] != ""){
echo '<img class="imgProducto" src="'.$servidor.$value["imgProducto"].'" style="top:'.$estiloImgProducto["top"].'%; right:'.$estiloImgProducto["right"].'%; width:'.$estiloImgProducto["width"].'%; left:'.$estiloImgProducto["left"].'%">';
}
echo '<div class="textosSlide" style="top:'.$estiloTextoSlide["top"].'%; left:'.$estiloTextoSlide["left"].'%; width:'.$estiloTextoSlide["width"].'%; right:'.$estiloTextoSlide["right"].'%">
<h1 style="color:'.$titulo1["color"].'">'.$titulo1["texto"].'</h1>
<h2 style="color:'.$titulo2["color"].'">'.$titulo2["texto"].'</h2>
<h3 style="color:'.$titulo3["color"].'">'.$titulo3["texto"].'</h3>';
if($value["boton"] != ""){
echo '<a href="'.$value["url"].'">
<button class="btn btn-default backColor text-uppercase">
'.$value["boton"].' <span class="fa fa-chevron-right"></span>
</button>
</a>';
}
echo '</div>
</div>
</li>';
}
?>
</ul>
<!--=====================================
PAGINATION
======================================-->
<ol id="paginacion">
<?php
for($i = 1; $i <= count($slide); $i++){
echo '<li item="'.$i.'"><span class="fa fa-circle"></span></li>';
}
?>
</ol>
<!--=====================================
ARROWS
======================================-->
<div class="flechas" id="retroceder"><span class="fa fa-chevron-left"></span></div>
<div class="flechas" id="avanzar"><span class="fa fa-chevron-right"></span></div>
</div>
</div>
<center>
<button id="btnSlide" class="backColor">
<i class="fa fa-angle-up"></i>
</button>
</center>
JS
/*=============================================
VARIABLES
=============================================*/
var item = 0;
var itemPaginacion = $("#paginacion li");
var interrumpirCiclo = false;
var imgProducto = $(".imgProducto");
var titulos1 = $("#slide h1");
var titulos2 = $("#slide h2");
var titulos3 = $("#slide h3");
var btnVerProducto = $("#slide button");
var detenerIntervalo = false;
var toogle = false;
$("#slide ul li").css({"width":100/$("#slide ul li").length + "%"})
$("#slide ul").css({"width":$("#slide ul li").length*100 + "%"})
/*=============================================
INITIAL ANIMATION
=============================================*/
$(imgProducto[item]).animate({"top":-10 +"%", "opacity": 0},100)
$(imgProducto[item]).animate({"top":30 +"px", "opacity": 1},600)
$(titulos1[item]).animate({"top":-10 +"%", "opacity": 0},100)
$(titulos1[item]).animate({"top":30 +"px", "opacity": 1},600)
$(titulos2[item]).animate({"top":-10 +"%", "opacity": 0},100)
$(titulos2[item]).animate({"top":30 +"px", "opacity": 1},600)
$(titulos3[item]).animate({"top":-10 +"%", "opacity": 0},100)
$(titulos3[item]).animate({"top":30 +"px", "opacity": 1},600)
$(btnVerProducto[item]).animate({"top":-10 +"%", "opacity": 0},100)
$(btnVerProducto[item]).animate({"top":30 +"px", "opacity": 1},600)
setTimeout(function(){
$(btnVerProducto[item]).mouseover(function(){
$(this).css({"background":"#3CB484"});
})
$(btnVerProducto[item]).mouseout(function(){
$(this).css({"background":"#35A679"});
})
},100)
/*=============================================
PAGINATION
=============================================*/
$("#paginacion li").click(function(){
item = $(this).attr("item")-1;
movimientoSlide(item);
})
/*=============================================
MOVE FORWARD
=============================================*/
function avanzar(){
if(item == $("#slide ul li").length -1){
item = 0;
}else{
item++
}
interrumpirCiclo = true;
movimientoSlide(item);
}
$("#slide #avanzar").click(function(){
avanzar();
})
/*=============================================
BACK
=============================================*/
$("#slide #retroceder").click(function(){
if(item == 0){
item = $("#slide ul li").length -1;
}else{
item--
}
movimientoSlide(item);
})
/*=============================================
MOVEMENT SLIDE
=============================================*/
function movimientoSlide(item){
// http://easings.net/es
$("#slide ul").animate({"left": item * -100 + "%"}, 1000, "easeOutQuart")
$("#paginacion li").css({"opacity":.5})
$(itemPaginacion[item]).css({"opacity":1})
interrumpirCiclo = true;
$(imgProducto[item]).animate({"top":-10 +"%", "opacity": 0},100)
$(imgProducto[item]).animate({"top":30 +"px", "opacity": 1},600)
$(titulos1[item]).animate({"top":-10 +"%", "opacity": 0},100)
$(titulos1[item]).animate({"top":30 +"px", "opacity": 1},600)
$(titulos2[item]).animate({"top":-10 +"%", "opacity": 0},100)
$(titulos2[item]).animate({"top":30 +"px", "opacity": 1},600)
$(titulos3[item]).animate({"top":-10 +"%", "opacity": 0},100)
$(titulos3[item]).animate({"top":30 +"px", "opacity": 1},600)
$(btnVerProducto[item]).animate({"top":-10 +"%", "opacity": 0},100)
$(btnVerProducto[item]).animate({"top":30 +"px", "opacity": 1},600)
}
/*=============================================
INTERVAL
=============================================*/
setInterval(function(){
if(interrumpirCiclo){
interrumpirCiclo = false;
}else{
if(!detenerIntervalo){
avanzar();
}
}
},3000)
/*=============================================
APPEAR ARROWS
=============================================*/
$("#slide").mouseover(function(){
$("#slide #retroceder").css({"opacity":1})
$("#slide #avanzar").css({"opacity":1})
detenerIntervalo = true;
})
$("#slide").mouseout(function(){
$("#slide #retroceder").css({"opacity":0})
$("#slide #avanzar").css({"opacity":0})
detenerIntervalo = false;
})
最佳答案
页面暂时处于非激活状态(不在前台)后,事件队列中的setInterval
事件可能未得到处理。然后,当您回到它时,将处理所有未决事件,从而产生“竞赛”效果。
您可以通过使用setTimeout
链而不是一个setInterval
来防止这种情况。仅当当前循环代码已有效执行时,才会调用下一个setTimeout
:
function nextCycle(){
if(interrumpirCiclo){
interrumpirCiclo = false;
}else{
if(!detenerIntervalo){
avanzar();
}
}
setTimeout(nextCycle, 3000);
}
setTimeout(nextCycle, 3000);