【问题标题】:jQuery: infinite loop animation -For a photo slideshowjQuery:无限循环动画 - 用于照片幻灯片
【发布时间】:2011-12-30 20:38:00
【问题描述】:

我正在尝试创建一个简单的照片幻灯片...但我无法让它无限循环并浏览所有图像(和链接)。

我尝试了一个 for() 函数 http://jsfiddle.net/2TPTX/,也没有它,http://jsfiddle.net/2TPTX/1/ 。但我仍然无法让它正常工作。

你们能帮帮我吗?

它在我提供的小提琴中的代码(http://jsfiddle.net/2TPTX/http://jsfiddle.net/2TPTX/,但为了您的方便,我也将其包含在此处。

HTML:

<div id="slideshow">
    <a id="slideshow_lnk" href="www.mysite.com/some_link_1.html">
    <div id="slideshow_img"></div>
    </a>
</div>

CSS:

#slideshow {
    width: 50px;
    height: 50px;
}
#slideshow_img {
    background-repeat:no-repeat;
    background-size:100% 100%;

    width: 50px;
    height: 50px;
    }

jQuery:

var $slide = $("#slideshow_img");
var $link = $("#slideshow_lnk");

//$photos Array
var $photos = [['photo', 'link']]; //[0] = Header
$photos[1] = ['http://img510.imageshack.us/img510/2497/54208035.jpg', 'http://www.stackoverflow.com/'];
$photos[2] = ['http://img265.imageshack.us/img265/3355/62320763.jpg', 'http://www.google.com/'];
$photos[3] = ['http://img411.imageshack.us/img411/1237/75707805.jpg', 'http://www.yahoo.com/'];

//Loop variables
$photos.count = $photos.length - 1;
var $fade_time = 3500;
var $i = 1;

function slideshow() {
    $i = ($i > $photos.count ? 1 : $i++);
    $photos.css_url = "url('" + $photos[$i][0] + "')";
    $link.attr("href", $photos[$i][1]);

    $slide.fadeOut($fade_time);
    $slide.css("background-image", $photos.css_url);
    $slide.fadeIn($fade_time);
}

slideshow();

【问题讨论】:

  • 忘了提及这一点:在加载时,我希望 &lt;div id="slideshow_img"&gt;&lt;/div&gt; 显示图像 1,然后(在 $fade_time 之后)显示图像 2 的 fadeOut()fadeIn(),而不是 fadeOut()然后fadeIn() 和图片 1

标签: jquery animation slideshow infinite-loop


【解决方案1】:

jQuery 是异步的, 所以你需要使用它的.queue() 方法来安排下一步在动画完成后发生。我可能会像下面那样做(包括一些你可以接受或忽略的风格变化)。

Here’s a fiddle,如果您有任何问题,请告诉我。

function slideshow($slide, $link, fade_time, images){
    var i = 0;
    function step(next){
        if (i === images.length) {
            i = 0;
        }
        $slide
            .fadeOut(fade_time)
            .queue(function(nextSlide){ return function(next){
                $slide.css("background-image", "url('" + nextSlide.image + "')");
                $link.attr("href", nextSlide.link);
                next();
            }; }(images[i]))
            .fadeIn(fade_time)
            .queue(step);
        i++;
        next();
    }
    $slide.queue(step);
}

var photos = [
    { image: "http://img510.imageshack.us/img510/2497/54208035.jpg", link: "http://www.stackoverflow.com/" },
    { image: "http://img265.imageshack.us/img265/3355/62320763.jpg", link: "http://www.google.com/" },
    { image: "http://img411.imageshack.us/img411/1237/75707805.jpg", link: "http://www.yahoo.com/" }
];

slideshow($("#slideshow_img"), $("#slideshow_lnk"), 3500, photos);

【讨论】:

  • 我是个初学者,你可能已经知道了。我在哪里可以了解您对照片阵列所做的事情? -我看不懂:var photos = [ { image: ..., link: ....... } ]
  • @Omar:您可能知道数组是事物的有序列表,创建数组的最简单方法是将列表放在方括号之间:[ "one", "two", "three" ] .这些东西可以是字符串、数字、其他数组或其他对象。 JavaScript 中的大多数东西都是对象,但最简单的对象是一组具有 。它们很像数组,除了不是用数字访问每个事物,而是用它的键来访问它,它可以是任何字符串。 (续……)
  • @Omar:创建对象的最简单方法是使用大括号:{ name: "Omar", id: 931377 }。在我的代码中,photos 是一个包含三个对象的数组。它们每个都有一个image 属性和一个link 属性。您可以通过photos[0].linkphotos[0]["link"] 获得一个链接(在括号形式中,您放入括号中的内容可以是任何表达式,例如photos[0]["li" + "nk"]photos[0][someVariable]。您可以learn more about object literals here。跨度>
  • @Omar:你可以使用 jQuery 的.delay() 函数,它会在运行元素效果队列中的下一件事之前等待一定的时间。只需在.fadeIn(fade_time).queue(step) 之间添加.delay(delayTime)
  • 谢谢!!!你的解释真的很有帮助!顺便说一句,我怎样才能将 var transition_time 添加到组合中? - div 淡入淡出之前的时间段。 (在下一个图像之前保留图像的时间段)。 PS。我喜欢你的风格变化
【解决方案2】:

这是一个 JS Fiddle,它可以完成您想要的大部分工作,您可能仍然需要进行一些调整才能完全按照您的意愿进行操作,但这实现了所描述的“无限循环”:http://jsfiddle.net/tGLMF/4/

仅供参考 - 在那个小提琴中,我还更新了你的淡入和淡出功能,在你之前:

$slide.fadeOut($fade_time);
$slide.css("background-image", $photos.css_url);
$slide.fadeIn($fade_time);
$timeout = setTimeout(function(){slideshow(slideNumber+1);}, ( $fade_time * 2) + 1000 );

我将其更新为:

$slide.fadeOut($fade_time, function(){
    $slide.css("background-image", $photos.css_url);
    $slide.fadeIn($fade_time);
    $timeout = setTimeout(function(){slideshow(slideNumber+1);}, ( $fade_time * 2) + 1000 );
});

我这样做的原因是因为动画是异步发生的,所以你调用了fadeOut,但是当它淡出时,你又调用了fadeIn,这引起了一些奇怪的是显示的内容和时间

编辑以显示从图片 1 开始 新小提琴 - http://jsfiddle.net/tGLMF/5/

【讨论】:

  • 如何修改代码以使 div 带有图像 1,然后淡出并使用下一张图像?
  • Omar - 您应该接受其中一种解决方案作为答案,因为您的问题已经解决。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 2011-08-15
  • 2022-11-08
  • 2018-07-10
  • 2015-04-21
相关资源
最近更新 更多