【问题标题】:Pictures in a Jquery slideshow are stuttering and showing incorrectlyJquery 幻灯片中的图片口吃并且显示不正确
【发布时间】:2016-05-30 15:31:56
【问题描述】:

我有 5 张图片的幻灯片,每隔几秒钟。它应该转到下一个图像,然后循环。

当前发生的是显示第一张图像,然后过渡到下一张。当下一个出现时,它会闪回到第一个图像。然后它会转到该系列中的第三张图像,但再次闪回第一张图像。这一直持续到第五张图片。

但是一旦它再次循环到第一张图片(在浏览完所有五张图片之后),从那里开始一切正常。每个图像停留 3 秒,然后继续,没有跳回图像一个或任何东西。

这是我正在使用的代码。

HTML:

<div id="slideshow">
   <div>
     <img src="Images/1.gif">
   </div>
   <div>
     <img src="Images/2.gif">
   </div>
   <div>
     <img src="Images/3.gif">
   </div>
   <div>
     <img src="Images/4.gif">
   </div>
   <div>
     <img src="Images/5.gif">
   </div>
</div>

CSS:

#slideshow { 
    clear: both;
    margin: 50px auto; 
    position: relative; 
    max-width: 960px; 
    height: 643px; 
    padding: 10px; 
    box-shadow: 0 0 20px rgba(0,0,0,0.4); 
}

#slideshow > div { 
    position: absolute; 
    top: 10px; 
    left: 10px; 
    right: 10px; 
    bottom: 10px; 
}

#slideshow img {
    max-width: 100%;    
}

JS:

$("#slideshow > div:gt(0)").hide();

setInterval(function() { 
  $('#slideshow > div:first')
    .fadeOut(800)
    .next()
    .fadeIn(800)
    .end()
    .appendTo('#slideshow');
},  3000);

我正在整理的实际网站在这里,因此您可以看到它的实际效果:

schmelzerwedding.com

任何帮助使其不会像那样跳回将不胜感激。谢谢!

【问题讨论】:

  • 你能插入一个jsfiddle吗?
  • 如果我是你,我不会每次都做appendTo()。似乎不必要的复杂和性能沉重。只需跟踪您在哪张幻灯片上,并每次增加数字,直到到达终点,然后再次将其设置为 0。

标签: javascript jquery html css


【解决方案1】:

就像我在评论中提到的那样,我认为appendTo() 的使用可能是罪魁祸首。我也认为从性能方面考虑并不是最好的事情。

这是一个版本,它可以简单地跟踪我们在哪张幻灯片上并增加数字。

(function () {
  var slideshow = document.getElementById('slideshow');
  var slides = slideshow.getElementsByTagName('img');
  var currSlide = 0;
  var numSlides = slides.length;
  
  // Set first slide to active
  slides[currSlide].classList.add('active');
  
  setInterval(function () {
    slides[currSlide].classList.remove('active');
    currSlide = (currSlide + 1) >= numSlides ? 0 : currSlide + 1;
    slides[currSlide].classList.add('active');
  }, 2000);
})();
#slideshow {
  position: relative;
  width: 200px;
  height: 200px;
}

#slideshow img {
  opacity: 0;
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  transition: opacity .2s ease-out;
}

#slideshow img.active {
  opacity: 1;
}
<div id="slideshow">
<img src="http://placehold.it/199x199">
<img src="http://placehold.it/200x200">
<img src="http://placehold.it/201x201">
<img src="http://placehold.it/202x202">
</div>

编辑:如果你(出于某种原因)不想使用纯 JS,下面是 jQuery 中的相同代码:

(function () {
    var slideshow = $('#slideshow');
    var slides = slideshow.find('> *');
    var currSlide = 0;
    var numSlides = slides.length;

    slides.eq(currSlide).addClass('active');

    setInterval(function () {
        slides.eq(currSlide).removeClass('active');
        currSlide = (currSlide + 1) >= numSlides ? 0 : currSlide + 1;
        slides.eq(currSlide).addClass('active');
    }, 200);
})();

【讨论】:

    【解决方案2】:

    使用 jQuery:

    //Just for demo - takes a few secs to load the images
    setTimeout(function(){
      $('#ld').hide();
    },500);
    
    
    var cnt = 0;
    $("#slideshow > div:gt(0)").hide();
    setTimeout(showSlide, 2000);
    
    function showSlide() {
      cnt++;
      cnt = (cnt>3)?0:cnt;
      $("#slideshow > div").fadeOut();
      $("#slideshow > div:eq("+cnt+")").fadeIn();
      setTimeout(showSlide, 2000);
    }
    #slideshow {clear:both;margin:50px auto;position:relative;max-width:960px;height:643px;padding:10px;box-shadow:0 0 20px rgba(0, 0, 0, 0.4);}
    
    #slideshow > div {position:absolute;top:10px;left:10px;right:10px;bottom:10px;}
    
    #slideshow img {max-width:100%;}
    
    /* For Demo Only */
    #ld{position:absolute;top:10%;left:20%;font-size:5rem;text-shadow:5px;z-index:2;}
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <div id="slideshow">
      <div><img src="http://placekitten.com/550/200"></div>
      <div><img src="http://placekitten.com/548/200"></div>
      <div><img src="http://placekitten.com/550/202"></div>
      <div><img src="http://placekitten.com/548/202"></div>
    </div>
    <div id="ld">Loading . . . </div>

    【讨论】:

    • 对硬编码的幻灯片数量、JavaScript 动画(相对于 CSS 过渡)、嵌套 setTimeout(带有不必要的匿名函数)而不是(清洁器 (imo))setInterval 投反对票,突兀的“加载” HTML 以及不必要的 jQuery (imo) 使用。
    • @powerbuoy 当您不同意提议的解决方案时,尤其是在您在这里所做的范围内,最具有社区意识的是提出您自己改进的解决方案 (1),以便其他人可以向您学习,( 2)为OP提供更好的解决方案,以及(3)为自己获得一些支持。 否则,除了试图让别人觉得自己是垃圾之外,你到底在做什么?
    • @KyleSchmelzer 我刚刚查看了您的网站。恭喜顺理成章。 :) 您在幻灯片放映开始时也会出现一些口吃,因为幻灯片放映开始时图像没有完全加载。在$(window).load(){ //all slideshow code here }); 中尝试wrapping the code,这应该会有所帮助。 See this link for more
    • 我无意冒犯。当我被否决并且这个人甚至没有礼貌地解释原因时,我讨厌它。也许我听起来有点刺耳,如果是这样,我深表歉意。不过,我确实留下了自己的解决方案。
    • @powerbuoy 我完全同意你的看法,我真的应该感谢你诚实地说出你为什么投反对票。 Whups,我没有注意到另一个答案是你的。道歉 - 将相应地审查/投票。顺便说一句,(a) OP 要求使用 js 或 jQuery,并且已经提供了 js 解决方案,并且 (b) setInterval 有其缺点as explained here。不过,正如您所指出的,CSS 过渡是一个更好的解决方案。
    【解决方案3】:

    Boostrap 无法立即获取 jQuery,请尝试更改它们在头部调用的顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      相关资源
      最近更新 更多