【问题标题】:Animations in my slideshow will play again at the end of a slide我的幻灯片中的动画将在幻灯片结束时再次播放
【发布时间】:2021-09-05 23:30:16
【问题描述】:

我创建了一个自动播放的图像幻灯片,每张幻灯片之间都有一个简单的淡入淡出。问题是每张幻灯片似乎都在转换到下一张之前“重新加载”。因此,如果我向幻灯片添加动画,例如从左侧滑入,图像 1 将滑入,然后随着图像 2 的淡入,图像 1 将消失并再次从左侧滑入。 Here it is on JSfiddle,当第二张出现时,您可以看到第一张图像再次隐约滑入。任何帮助表示赞赏。

<div id="slideshow">

  <div class=slidein-left>
    <img src="https://www.port.ac.uk/-/media/images/news-events-and-blogs/news/2020/october/cat-eyes-closed-600x400.jpg">
  </div>

  <div>
    <img src="https://cdn.shopify.com/s/files/1/0997/4496/files/Untitled_design_19_grande.jpg">
  </div>

</div>
html,
body {
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0;
}

#slideshow {
  position: relative;
  width: 100%;
  height: 80%;
  margin: 0;
  padding: 0;
}

#slideshow>div {
  position: absolute;
  overflow-x: hidden;
  overflow-y: hidden;
  width: 100%;
  height: 100%;
}

.slidein-left {
  position: relative;
  left: -100%;
  overflow-x: hidden;
  overflow-y: hidden;
  -webkit-animation: slideleft 1s forwards 0.5s;
  animation: slideleft 1s forwards 0.5s;
}

@-webkit-keyframes slideleft {
  100% {
    left: 0;
  }
}

@keyframes slideleft {
  100% {
    left: 0;
  }
}
$("#slideshow > div:gt(0)").hide();

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

【问题讨论】:

    标签: html jquery css css-animations


    【解决方案1】:

    在 setInterval 中:

    1. 首先要隐藏第一张图片
    2. 然后显示第二张图片
    3. 然后将第一张图片附加到滑块

    问题出在第 3 步。 当您附加第一张图片时,它的显示将被阻止,并且根据您的 css,当第一张图片显示时,它肯定有“slideleft”动画,并且在下一个周期开始之前,您的第一张图片会再次显示。

    您可以通过在第二张图片之后隐藏第一张图片来解决此问题:

    #slideshow > div:not(.slidein-left) + .slidein-left {
      display: none !important;
    }
    

    在css中的关键帧上方添加上面的代码,你就可以开始了。

    而不是

    #slideshow > div:not(.slidein-left)
    

    您可以为您的第二个 div(在 #slideshow 内)分配一个类,并改用 .that_class。


    ============================

    更新

    更好的解决方案是延迟第 3 步。

    $("#slideshow > div:gt(0)").hide();
    
    setInterval(function() { 
      $('#slideshow > div:first')
      .fadeOut(1000)
      .next()
      .fadeIn(1000)
    
      setTimeout(function() {$('#slideshow > 
      div:first').appendTo("#slideshow")}, 1000)
    
    }, 3000);
    

    并删除我之前提到的css代码。

    最好去掉 css 动画延迟,因为它会破坏图像 1 的淡入淡出效果。

      animation: slideleft 1s forwards;
    

    =====================

    更新 2

    我在上一次更新中提供的 javascript 代码的 setTimeout 部分在我上传时发生了变化。

    setTimeout 函数的 $("") 部分必须在一行中,并且其中包含换行符(由 Stackoverflow 生成)会破坏整个代码。

    【讨论】:

    • 感谢您的回答。这似乎解决了图像 1 再次滑入的问题,但它仍然在图像 2 淡入之前突然消失,我希望每张图像都相互淡入。
    • 不客气。是啊,你说得对。我更新了我的答案。但请确保您删除了我之前的解决方案中的 css 代码。
    • 我删除了你的初始 CSS 和动画延迟,并用你的 jquery 替换了我的 jquery,但幻灯片根本没有播放,它卡在第一张图片上。
    • 其实这是 Stackoverflow 的错。在我更新我的答案之前,代码运行良好,但由于某种原因,Stackoverflow 在 setTimeout 函数中的“#slideshow >”之后放置了一个换行符并破坏了代码。我仍然无法将 setTimeout 部分放在一行中。尝试将 setTimeout 的 $('') 部分放在一行中,它会正常工作。我在 fiddleJs 和本地机器上又测试了一遍,没有发现问题。
    • 哈哈,亲爱的。这似乎工作得很好。非常感谢您对此的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2012-04-07
    • 1970-01-01
    • 2015-08-08
    相关资源
    最近更新 更多