【问题标题】:jquery infinite slider imagesjquery 无限滑块 图片
【发布时间】:2023-03-22 17:12:01
【问题描述】:

我正在尝试使用 jquery 创建一个无限滑块。我的页面有一些标签,宽度等于窗口宽度。

我想在 10 秒后滑动每张图片,当最后一张图片出现并且该显示第一张图片时,我希望它从右侧静止。

现在我创建了一个宽度为 10000 像素的 div 来保存我的无序列图像列表,并且它们具有 display:none。我的问题是为什么当我为一个列表项提供 margin-left: -1000px 时,图像似乎重叠在另一个之上,而不是一个接一个地出现。我试图截取屏幕截图,但我不知道我的 Dropbox 发生了什么。

这是我的 CSS:

.slider {
    position: relative;
    height: 498px;
    /*display: inline-block;*/
    overflow: hidden;
}
 .slider-list  {
    /*display: inline-block;*/
    float: left;
    padding: 0;
    margin: 0;
    width: 10000px
    /*height: 496px;*/
}

.slider-list li{
    display: inline-block;
    /*float: left;*/
    /*width: 100%;*/
    height: 496px;  
    z-index: 1;

这是我的 HTML:

<div class="slider">
        <ul class="slider-list">
            <li><img class="homepage-img"src="images/homepage.jpg"></li>
            <li><img class="homepage-img"src="images/image1.jpg"></li>
            <li><img class="homepage-img"src="images/image2.jpg"></li>
            <li><img class="homepage-img"src="images/image3.jpg"></li>
            <li><img class="homepage-img"src="images/image4.jpg"></li>

        </ul>

类 .slider 的 div 将在更多元素后关闭。

更新:

这是我写这篇文章后的 jQuery 代码:

$(document).ready(function(){
        slide();

});

    slide = function() {
    var img = $('.homepage-img');
    var content = $('.slider-content');
    var slider = $('.slider-list');
    var elements = $('.slider-list li').children();
    var auto_slide_speed = 100;//ms
    var timer;
    var i = 0;

    img.width($(window).width());
    $("li").width($(window).width());
    img.height($('.slider-list').height());
    content.height($('.slider-list').height());

    var img_width = $('.slider-list li').outerWidth();
    console.log($('.slider-list li').length);
    console.log(elements);
    //calculam margin-left = -latimea unei imagini
    // while(1)
    // {
        var left = parseInt(slider.css('margin-left')) - img_width;
    for(i = 0; i <= $('.slider-list li').length; i++)
    {
        console.log(i);

        slider.animate({
        "margin-left": "+=" + left}, 
        1500, 
        function() {
        // $('.slider-list li:last').after($('.slider-list li:first'));
        // $('slider').css({'margin-left' : '0px'});  

        });
        // left = left + left;
        // $('slider li').append($(elements[i]).clone());
    }

    console.log(i);

}

有了这个,我的滑块就和我的列表一样。如何在最后一项之后附加第一项,依此类推,使其可以是无限的?

【问题讨论】:

  • 当你打到最后一项时;您可以克隆第一个列表项并将其附加到无序列表的末尾。每当动画滑到克隆的项目并完成动画时,将位置移动到开始(您不会注意到它从例如 -3000px 跳转到 0px)并再次删除克隆。
  • 一个常见的技巧是在第一个和最后一个相同的情况下拥有 X+1 个图像(假设您有 X 个不同的图像)。在最后一张图片滑入的时候,偷偷重置滑块列表,因为最后一张和第一张图片是一样的,用户不会注意到。
  • 我似乎无法成功将图像附加到列表末尾,因此我可以无限滑动。

标签: javascript jquery html css


【解决方案1】:

如果您的目标是支持转换和转换的现代浏览器,我会这样做..

演示地址 http://jsfiddle.net/gaby/dbLu5/

jQuery

var slides = $('.slider-list li'); // cache a reference to the slides

setInterval(function(){
    var current = slides.filter('.current'), // find slide in view
        next = current.next(); // find next slide

    if (!next.length){next = slides.first();} // loop if at last slide

    slides.removeClass('off'); // reposition already viewed slides to the right
    current.removeClass('current').addClass('off'); // set current slide to animate left
    next.removeClass('off').addClass('current'); // set next slide to slide in view
}, 10000); // set the interval

CSS(您需要为转换和过渡属性添加供应商前缀)

.slider-list {
    position:relative;
    padding: 0;
    margin: 0;
    overflow:hidden;
    height: 496px;
}
.slider-list li {
    width:100%;
    height: 100%;
    display: block;
    z-index: 1;
    transition:transform 1s;
    transform:translateX(100%);
    left:0; top:0;
    position:absolute;
    overflow:hidden;
}
.slider-list li.current{
    transform:translateX(0%);
    z-index:100;
}
.slider-list li.off{
    transform:translateX(-100%);
    z-index:100;
}

【讨论】:

    【解决方案2】:

    这是一个FIDDLE,可以帮助您入门。

    1. 将所有图片放在一个隐藏的 div 中

    2. 克隆它们并将它们放在可见的 div 中

    3. 通过更改左边距为图像设置动画

    4. 您可以通过设置间隔功能调整图像之间的时间

    5. 您可以通过动画时间调整滑入时间。

    6. 因为它是一个无限循环,所以我把按钮放在你想要的任何时候停止动画。

    JS

    var pictxtnumber = 1;
    loadpictxt(pictxtnumber);
    
    var fadeintime = 500;
    animatediv();
    
    function animatediv()
    {
        var number = 0;
        var interval = setInterval(function() { 
                                               pictxtnumber = pictxtnumber + 1;
                                               if(pictxtnumber > 6)
                                                 {
                                                  pictxtnumber = 1;
                                                  }
                                               loadpictxt(pictxtnumber);
                                               $('#stopanim').on('click', function(){
                                                                                     clearInterval(interval);
                                                                                     });
                                               }, 1000);
    }
    
    function loadpictxt(num)
    {
      $('.picturediv').html('');
      $(".hiddenimage img:nth-child(" + num + ") ").clone().appendTo('.picturediv');
      $('.picturediv img').css('margin-left', '100px');
      $('.picturediv img').animate({marginLeft: "0"}, 100);    
    }
    

    【讨论】:

    • 这看起来很可靠。我一直在尝试使用动画功能来做到这一点。你能看看我的代码并告诉我为了达到我需要的结果我可以改进哪些地方吗?谢谢先生。
    • 嗯,我看到很多代码都与尺寸和测量尺寸有关。我认为您可能会将大部分内容移至 CSS 以使 js 更简单。就循环而言,您正在使用 for 循环,这将限制您一次通过图像列表。在无限循环中,您可以任意设置一个变量,例如“计数器”,递增计数器,然后当您到达图像数量的末尾时,将计数器重置为第一个图像。我在这个论坛上学到的一件事是尝试在 HTML 和 CSS 中尽你所能,从而使 JS 更简单。
    【解决方案3】:

    我为此制作了两个简单的 jquery 插件:

    我推荐项目滑块,因为项目是强制对齐的,最后更简单。

    现在回答您的问题:如何将第一项附加到最后一项之后,依此类推,这样它就可以无限?

    您可以连续显示滑块项目两次(或更多次)。 鉴于您的 html 代码:

    var jSliderList = $(".slider-list");
    var jSliderOriginalItems = $("li", jSliderList); // keep track of this one
    
    function init(){
        jSliderList.append(jSliderOriginalItems.clone()); // should work, not tested
    }
    

    然后使用 css,您可以将滑块缩小到您选择的宽度。

    建议:

    我建议您附加一个页面而不仅仅是一个项目。

    一种基本的方法是将事物封装成函数,如下所示:

    slideToRight()
        appendItemsToTheRight()
        removeUnecessaryItemsToTheLeft()
        slide()
    

    要执行幻灯片,您可以使用 css 过渡。 在您的 CSS 中,输入如下内容:

    .sliderContainer {   
        transition: transform 2s ease;
    }
    

    然后在你的js代码中,要滑动,只需使用如下函数:

    function moveSlider(the_offset) {
        jSliderContent.css({
            transform: "translate3d(" + the_offset + "px, 0px, 0px)"
        });
    }
    

    现在要实际附加一个项目,您可以使用 renderItem 函数来生成它们,而不是克隆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 2018-07-30
      相关资源
      最近更新 更多