【问题标题】:Horizontal jquery scroller using position:absolute; with constant scroll使用位置的水平 jquery 滚动条:绝对;不断滚动
【发布时间】:2012-12-20 16:21:09
【问题描述】:

我已经做到了这一点,它适用于实心宽度的 div,但不知道如何在 div 的宽度发生变化时对其进行操作。

问题:如何让这个函数考虑每个“轮”后不同的 div 宽度?

var horizontalScroller = function($elem) {
    var left = parseInt($elem.css("left"));
    var temp = -1 * $('#horizontalScroller li').width();
    if(left < temp) {
        left = $('#horizontalScroller').width();
        $elem.css("left", left);
    }
    $elem.animate({ left: (left-60) }, 2000, 'linear', function () {
      horizontalScroller($(this));
    });
}


$(document).ready(function() {
    var i = 0;
    $("#horizontalScroller li").each(function () {
          $(this).css("left", i);
          i += $(this).width();
          horizontalScroller($(this));
    });

});

工作示例(固定宽度):http://jsfiddle.net/GL5V3/
工作示例(不同宽度):http://jsfiddle.net/wm9gt/

【问题讨论】:

  • 你想做什么,“让它工作”是什么意思?
  • 如果你看一下 jsfiddle,你会看到不同的宽度是如何相互碰撞的。这是我试图避免的,因此使它像固定宽度的例子。
  • 好吧 - 我知道您需要将 i+=60 更改为反映每个列表项的各个宽度的值。
  • 它不应该与(left-60)有任何关系,只是当它有另一个“回合”要做时,这一切都很奇怪。
  • 你在做水平滚动有点奇怪。我认为要求是水平环绕和基于时间的“运动”?

标签: javascript jquery horizontal-scrolling absolute


【解决方案1】:

嗯,这有点有趣,了解您的代码是如何工作的,但在我这样做之前......

我改写成这样:(working fiddle)

function horizontalScroller(ulSelector) {
  var horizontalSpan=0;
  var collection=[];
  function animate(index) {
    var cur=collection[index];
    var left=parseInt(cur.elem.css('left'));
    if(left < cur.reboundPos) {
        left+=horizontalSpan;
        console.log(left);
        cur.elem.css('left',left);
    }
    cur.elem.animate(
      { left: (left-60) },
      2000,
      'linear',
      function () {animate(index)}
    );
  }
  $(ulSelector).find('li').each(function() {
    var $this=$(this);
    var width=$this.width();
    $this.css('left',horizontalSpan);
    collection.push({reboundPos: -1 * width, elem: $this});
    horizontalSpan+=width;
    animate(collection.length-1);
  });
  console.log(collection);
  console.log(horizontalSpan);
}


$(document).ready(function() {
    horizontalScroller('#horizontalScroller');
});

然后我回到你的代码并做了这个:

var horizontalSpan = 0;// swapped i for a "global" variable
var horizontalScroller = function($elem) {
    var left = parseInt($elem.css("left"));
    var temp = -1 * $elem.width();// updated to the correct width
    if(left < temp) {// now out of bounds is properly calculated
        left += horizontalSpan;// proper "wrapping" with just one addition
        $elem.css("left", left);
    }
    $elem.animate({ left: (left-60) }, 2000, 'linear', function () {
      horizontalScroller($(this));
    });
}


$(document).ready(function() { 
    $("#horizontalScroller li").each(function () {
          $(this).css("left", horizontalSpan);// horizontalSpan!!!
          horizontalSpan += $(this).width();// horizontalSpan!!!
          horizontalScroller($(this));
    });
});

如果您有任何问题或想稍微调整一下。我很高兴你能帮助你。但我希望你能自己管理。

附:我最初的评论很粗鲁,您可以水平滚动竖起大拇指(但您希望其中一些 .width() 调用的值会有所不同)

【讨论】:

  • 这是完美的,正是我所需要的。非常感谢。赏金将在接下来的 10 小时内奖励给您(因为在此之前网站不会让我这样做)。
  • 我有一个问题,你的函数第 13 行和我更新函数的第 9 行的 -60 到底是什么?为什么是 60?
  • 1.不是来自您的初始功能吗? 2. 这是我们想要动画的新左边,它基本上是说在 2 秒内向左移动 60 像素....
  • 是的,你是对的,它来自我原来的功能。我忘了我把它放在那里了,但我认为这会根据li 的宽度而改变?显然改变它会改变速度,我认为这是我感到困惑的地方。
猜你喜欢
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多