jQuery水平滚动(点击和动画)

8
我有一系列的div悬浮在水平线上,我有一个固定宽度的div容器,overflow:hidden。最终,我想按左右div/button来滚动这些项目(而不是使用滚动条)。我无法让 .animate() 正常工作。我希望每次点击都可以使列表项移动。它应该类似于亚马逊的“购买此商品的顾客还买了”列表,您可以以同样的方式滚动它。我曾尝试过使用 .mousedown 并在按住时移动它(类似于真正的滚动),但想先尝试更简单的方法。以下是fiddle和代码:http://jsfiddle.net/stfzy/16/ HTML:
<div id="container">
<div id="arrowL">
</div>
<div id="arrowR">
</div>
<div id="list-container">
    <div class='list'>
        <div class='item'>
        </div>
        <div class='item'>
        </div>
        <div class='item'>
        </div>
        <div class="item">
        </div>
    </div>
</div>

CSS:
 #container{
width:340px;
    height:50px;
}

#list-container {
overflow:hidden;    
width: 300px;  
float:left;    
}

.list{
    background:grey;
min-width:700px;
    float:left;
}


#arrowR{
background:yellow;
    width:20px;
    height:50px;
    float:right;
    cursor:pointer;
}


#arrowL{
background:yellow;
    width:20px;
    height:50px;
    float:left;
    cursor:pointer;
}

.item{
    background:green;
width:140px;
    height:40px;
    margin:5px;
    float:left;
}

jQuery

$(document).ready(function() {

    $('div#arrowR').click(function(){

        $('div.item').animate({'left':'-=300px'});

    });

    $('div#arrowR').click(function(){

        $('div.item').animate({'left':'+=300px'});

    });

});

任何帮助都将不胜感激。谢谢!
1个回答

19

.item添加position:relative样式,如下所示:

.item{
    background:green;
    width:140px;
    height:40px;
    margin:5px;
    float:left;
    position:relative; /* Put me here! */
}

工作示例:http://jsfiddle.net/mattblancarte/stfzy/21/

你的设置中还有一些错误,但这应该可以让你不再卡住了。 :)

编辑:

这是一个快速解决方案,用于解决列表向任一方向滑动过多的错误:

$(document).ready(function() {

    var $item = $('div.item'), //Cache your DOM selector
        visible = 2, //Set the number of items that will be visible
        index = 0, //Starting index
        endIndex = ( $item.length / visible ) - 1; //End index (NOTE:: Requires visible to be a factor of $item.length... You can improve this by rounding...)

    $('div#arrowR').click(function(){
        if(index < endIndex ){
          index++;
          $item.animate({'left':'-=300px'});
        }
    });

    $('div#arrowL').click(function(){
        if(index > 0){
          index--;            
          $item.animate({'left':'+=300px'});
        }
    });

});

太棒了!我明白你说的更多错误是什么意思了...我猜你指的是我的列表有一个开始和结束。然而,它需要循环才能有效地工作。嗯...是时候想出解决方法了。再次感谢。 - jstacks
@jstacks 很高兴能帮忙!如果您还没有找到解决方法,您可以通过将起始索引分配为0来跟踪滚动条的位置,然后根据列表中有多少项计算出最大索引。如果达到最小值,请禁用左侧按钮。如果达到最大值,请禁用右侧按钮。希望这样说得清楚!这不是唯一的解决方法,但这是一个解决方案。 :) - Matthew Blancarte
@jstacks 不用担心。关于如何做这个的文档实际上并没有太多。你可能可以通过谷歌搜索找到一些,但我已经为你构建了一个解决方案。看看这个fiddle。如果你对它的工作原理有任何疑问,请告诉我! - Matthew Blancarte
@jstacks 很好!很高兴我能帮到你。我只是少了一点,在计算 endIndex 时没有考虑“n”个列表项。我会让你自己解决这个问题...(提示:查看一些原生 JS Math 对象方法 - Matthew Blancarte
如果您不想跟踪索引,您也可以使用以下代码:如果 (($('div.box:last').width() + $('div.box:last').offset().left) < ($('#wrapper').width() + $('#wrapper').offset().left)),则禁用右侧按钮。否则,使用第一个而不是最后一个同样禁用左侧按钮。当然,在缓存和优化方面进行大量重构是可能的。 - msanjay
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接