【问题标题】:Moving jQuery Slider as a div animates positions移动 jQuery Slider 作为 div 动画位置
【发布时间】:2009-04-18 13:53:12
【问题描述】:

我正在尝试创建时间线播放器。

我有一个 div 对象,它从屏幕的一侧移动到另一侧(即使用 animate() 更改 div 的“左”位置)。让我们假设这个动画需要 5 秒才能发生。

我希望 jQuery 滑块在动画旁边一点一点地递增。滑块也必须花费 5 秒才能到达其末端以匹配它正在跟踪的动画。

有人知道如何实现吗?

【问题讨论】:

    标签: javascript jquery jquery-ui


    【解决方案1】:

    嗯。滑块有一个带有style="left: X%;" 的句柄(a 元素)。
    以与其他动画相同的速度动画这个手柄怎么样?这是一个例子:

    var $slider = $('#slider').slider(); // initialize the slider
    var $handle = $slider.find('a'); // get the UI handle
    var $other  = $('#other');
    
    function moveHandle(perc, duration) {
      $slider.slider('disable').css('opacity', 1); // we don't want the user to
                                                   // move it while animating
      $handle.animate({
        left: perc + '%'
      }, duration, function() {
        $slider.slider('enable');
      });
    }
    moveHandle(100, 2000);
    
    $other.animate({
      left: 300 // replace 300px with whatever you want
    }, 2000);
    

    一个工作演示:http://jsbin.com/iwise/36
    您可以随意扩展或修改它。

    【讨论】:

      【解决方案2】:

      我质疑为什么您希望滑块由动画对象控制,而不是让滑块控制动画。如果您让播放栏控制动画,用户可以按预期随机播放。我把我的工作演示放在http://jsbin.com/ijoka。这个想法是有一个间隔计时器,在播放时增加播放头,slideslidechange 事件触发动画。

      <script type="text/javascript">
              var playing = false;
              var interval;
              var i = 0;
      
              $(function() {
                      $('#slider').slider({min: 0, max: 100});
                      $('#slider').bind('slide', function(e, ui) { i = ui.value; a(ui.value);}).bind('slidechange', function(e, ui) { a(ui.value);});
      
              });
      
              function a(p) {
               $('#box').css('left', p + "%");
              }
      
              function play() {
                  if(playing) {
                      playing = false;
                      clearInterval(interval);
                  } else {
                      i = $('#slider').slider('value');
                      playing = true;
                      interval = setInterval(step, 100);
                  }
              }
      
              function step() {
                  i = i + 2;
                  $('#slider').slider('value', i);
              }
          </script>
      

      【讨论】:

      • cbeer,你是对的。我的最终目标是让滑块“控制”动画,因此我在上面简化了问题。现在如您的示例所示,正如我在考虑类似解决方案时所怀疑的那样,动画非常生涩。我知道这可以通过具有较小的递增值进行排序,但这会像 jQuery.animate() 一样平滑吗?
      • 增加一个较小的值肯定会有所帮助——我选择了 10 个滴答声/秒,这在感知范围内很低 + 很好,所以滴答声/秒越多,它出现的抖动就越少.我想 jQuery.animate() 使用类似的刻度系统,但我没有看过那些内部结构(他们也有可能使用一些新的 css 动画来使其更加平滑)。
      猜你喜欢
      • 2012-08-13
      • 2012-03-18
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2014-05-02
      相关资源
      最近更新 更多