【问题标题】:Javascript slideshow with random first pic?带有随机第一张图片的Javascript幻灯片?
【发布时间】:2013-05-23 00:34:26
【问题描述】:

我正在尝试设置此幻灯片脚本,以便显示的第一张图片是随机的(每次访问该网站时,我都需要第一张图片是不同/随机的幻灯片),其余图片可以显示在正确的顺序,没关系。

我正在使用 Jon Raasch 的简单 jquery 幻灯片脚本,这里是:

<script type="text/javascript">
function slideSwitch() {
    var $active = $('#slideshow DIV.active');
    if ( $active.length == 0 ) $active = $('#slideshow DIV:last');
    var $next =  $active.next().length ? $active.next()
        : $('#slideshow DIV:first');
    $active.addClass('last-active');
    $next.css({opacity: 0.0})
        .addClass('active')
        .animate({opacity: 1.0}, 1000, function() {
            $active.removeClass('active last-active');
        });
}
$(function() {
    setInterval( "slideSwitch()", 2500 );
});
</script>

<div id="slideshow">
<div class="active"><img src="images/slide1.jpg"></div>
<div><img src="images/slide2.jpg"></div>
<div><img src="images/slide3.jpg"></div>
<div><img src="images/slide4.jpg"></div>
<div><img src="images/slide5.jpg"></div>
</div>

和 CSS:

#slideshow {
position:relative;
height:401px;
}
#slideshow div {
position:absolute;
top:0;
left:0;
z-index:8;
opacity:0.0;
}
#slideshow div.active {
z-index:10;
opacity:1.0;
}
#slideshow div.last-active {
z-index:9;
}

我已经尝试了一些东西,但 javascript 确实不是我的一杯茶(这里是“设计师思维”),而且我尝试过的方法不起作用。有什么想法吗?

非常感谢!

【问题讨论】:

    标签: javascript jquery random slideshow


    【解决方案1】:

    根据 jfriend00 的回答,您需要将脚本设置为:

     function slideSwitch() {
        var $active = $('#slideshow div.active');
        if ( $active.length == 0 ) {
        var slides = $('#slideshow div');
        $active = slides.eq(Math.floor(Math.random() * slides.length));
    }
        var $next =  $active.next().length ? $active.next()
            : $('#slideshow div:first');
        $active.addClass('last-active');
        $next.css({opacity: 0.0})
            .addClass('active')
            .animate({opacity: 1.0}, 1000, function() {
                $active.removeClass('active last-active');
            });
    }
    $(function() {
        slideSwitch();
        setInterval( function(){slideSwitch()}, 2500 );
    });
    

    有一些语法错误,我不得不更改调用 setInterval 的方式。

    工作小提琴:http://jsfiddle.net/f2UPm/

    【讨论】:

    • 感谢瓦鲁克!确实,您的脚本有效,但仅在 jsFiddle 中有效,尽管我知道了原因。我需要让脚本工作“onLoad”,至少这是 jsFiddle 中使它工作的选项。你能告诉我如何用脚本做到这一点吗?
    • 不管 jsFiddle onLoad 选项如何,都能在小提琴中为我工作。你能在没有的地方发布一个版本的小提琴吗?文档准备就绪时已调用 setInterval,请参阅api.jquery.com/ready 了解更多信息。
    • 没关系!感谢您指出了这一点。我认为我是一个更糟糕的 javascript 编码器。
    • 知道如何让第一张幻灯片显示得更快吗?现在,它是空白的(全白),显然它似乎在等待 2500 毫秒过去,然后出现第一张随机图片,然后是幻灯片。我认为这是因为 setInterval 函数。如何在不等待 setInterval 的情况下加载第一张图片?
    • 在上面编辑了我的答案,只需要立即调用 slideSwitch() 函数。我应该早点想到这一点,因为我们不是从活动图片开始的。
    【解决方案2】:

    从 HTML 中删除活动类,然后通过更改此行并调整 CSS 使用此代码初始设置它,以便在您的 JS 运行之前没有幻灯片可见:

    if ( $active.length == 0 ) $active = $('#slideshow DIV:last');
    

    到这里:

    if ( $active.length == 0 ) {
        var slides = $('#slideshow DIV');
        $active = slides.eq(Math.floor(Math.random() * slides.length));
    }
    

    工作演示:http://jsfiddle.net/jfriend00/mpYSL/

    【讨论】:

    • 感谢您的帮助!不幸的是,您的代码不起作用......它只是没有显示任何内容。我修复了“#slideshow DIV”(你一定打错了),但显然它仍然不起作用......
    • @live2create - 那么,也许您的问题并不清楚。如果您按照我的说明使所有幻灯片最初不可见,请从 HTML 中删除初始 class="active",插入此代码,然后在您运行第一个代码块后使幻灯片可见,此代码将随机选择起始观点。我以为这就是你要的。如果您在实现方面需要进一步的帮助,我建议您在 jsFiddle 中制作一个工作示例,以便我们可以看到您在实现中的错误在哪里。
    • 感谢 jfriend00,就像我说的那样,Javascript 不是我的最爱。我按照您的建议创建了一个 jsFiddle,请看一下:jsfiddle.net/YPKDm
    • 就像你可以看到它没有显示任何东西。这是供您比较的原始版本(没有您建议的更改):jsfiddle.net/27bqR
    • @live2create - 您需要了解 javascript 的第一件事是在错误控制台或调试控制台中查找脚本错误。这将为您节省大量时间。我的回答中有一个错字(一个额外的括号),你的 jsFiddle 有错误。它们都在这里得到更正:jsfiddle.net/jfriend00/mpYSL 并且有效。
    【解决方案3】:

    类似这样的:

    $(function() {
        var slides, index, current, last, last_index;
        slides = $('#slideshow div');
        // initialize index randomly
        index = Math.floor(Math.rand() * slides.length);
        // do a % trick to get index - 1 looping
        last_index = (index + slides.length - 1) % slides.length;
        last = slices[last_index]; // initialize last
    
        function slideSwitch() {
            current = slides[index];
            index = (index + 1) % slides.length; // % to loop
            current.addClass("active");
            last.addClass("last-active");
            current.css({ "opacity": 0.0 })
                .animate({ "opacity": 1.0}, 1000, function() {
                    current.removeClass("active");
                    last.addClass("active");
                    last.removeClass("last-active");
                    last = current;
                });
        }
        setInterval(slideSwitch, 2500);
        slideShow(); // run once now, because interval doesn't run until 2500ms
    });
    

    【讨论】:

    • 非常感谢您的帮助!不幸的是,该代码不起作用......它只显示了第一张幻灯片,但没有任何反应。
    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    相关资源
    最近更新 更多