【问题标题】:jQuery Drag and Drop slow downjQuery拖放减慢
【发布时间】:2014-11-05 09:03:21
【问题描述】:

是否可以减慢可拖动元素的速度?

我已经用 jQuery 拖放构建了一个简单的滑块。当滑块元素(可拖动元素)移动到某些位置时,图片会淡入。因此,如果您移动可拖动元素的速度不要太快,看起来您可以使用滑块处理“图片动画”。现在,我想减慢可拖动元素的速度。所以用户永远不能太快地拖动元素。

这是我的代码示例。

$('.slider').mousemove(function(){

 if($(this).position().left >= 0 && $(this).position().left <= 2 ) {
  $('.slider_1').fadeIn();
  $('.slider_2').fadeOut();
 }
...

我希望有人可以帮助我:)

【问题讨论】:

    标签: javascript jquery jquery-ui drag-and-drop slider


    【解决方案1】:

    啊!最后是一个有趣的 jQuery 问题。

    这绝对可以实现。下面我解释了如何。如果你想直接看演示,click here


    假设您的 HTML 设置如下:

    <div id="slider">
        <div id="bar"></div>
    </div>
    

    该栏是您单击并拖动的实际内容。

    现在你需要做的是:

    • 获取$('#bar').offset().left
    • 在拖动可拖动对象时显式指定#bar的位置,使用一些额外的变量SPEED

    例如:

    ui.position.left += (ui.offset.left - ui.originalPosition.left - leftOffset)*SPEED;
    

    然后,您可以使用jQuery的.fadeTo()(或其他)函数中的$('#bar').offset().left来更改您正在谈论的图像的不透明度。

    这一切看似微不足道,但事实并非如此。尝试实现这一点时存在一些问题。例如:

    当滑块达到最大滑动距离时,它应该停止动画或重置。您可以通过多种方式执行此操作,但我认为最简单的解决方案是编写一个 .mousedown / .mouseup 侦听器来更新变量 dragging,以跟踪用户是否仍在尝试拖动 #bar。如果不是,请重置#bar。如果是,请将滑块保持在最大距离,直到.mouseup 被触发。

    此外,您必须小心预定义的边框。

    我建议的代码如下:

    // Specify your variables here
    var SPEED = -0.6;
    var border = 1;           // specify border width that is used in CSS
    var fadeSpeed = 0;        // specify the fading speed when moving the slider
    var fadeSpeedBack = 500;  // specify the fading speed when the slider reverts back to the left
    
    // Some pre-calculations
    var dragging = false;
    var slider = $('#slider');
    var leftOffset = slider.offset().left + border;
    var adjustedSliderWidth = 0.5*slider.width();
    
    // the draggable function
    $('#bar').draggable({
        axis: "x",
        revert : function(event, ui) {
                $(this).data("draggable").originalPosition = {
                    top : 0,
                    left : 0
                };
                $('#image').fadeTo(fadeSpeedBack, 0);
                return !event;
            },
        drag: function (event, ui) {
            var barOffset = $('#bar').offset().left - leftOffset;
            if (barOffset >= 0) {
                if (barOffset < adjustedSliderWidth) {
                  ui.position.left += (ui.offset.left - ui.originalPosition.left - leftOffset)*SPEED;    
                } else {
                  if (!dragging) { return false; } 
                    else { ui.position.left = adjustedSliderWidth; }
                }
            }
            // fading while moving:
            $('#image').fadeTo(fadeSpeed, (ui.position.left/adjustedSliderWidth));
            
            // remove this if you don't want the information to show up:
            $('#image').html(ui.position.left/adjustedSliderWidth
                            +"<br \><br \>"
                            +ui.position.left);
        }
    });
    
    // the mouse listener
    $("#bar").mousedown(function(){ dragging = true; });
    $("#bar").mouseup(function(){ dragging = false; });
    

    我还在draggable 上实现了revert 选项,因此当用户释放#bar 时,滑块会很好地归零。当然,如果你愿意,你可以删除它。

    现在,您的整个问题所涉及的变量是变量:SPEED

    您可以通过为该变量指定一个数字来指定拖动的速度。

    例如:

    var SPEED = 0.0;         // the normal dragging speed
    var SPEED = 0.5;         // the dragging speed is 1.5 times faster than normal
    var SPEED = -0.5;        // the dragging speed is 0.5 times faster than normal
    

    因此,值给出较慢拖动速度,值给出更快拖动速度。 p>

    不幸的是(或者实际上:幸运的是),不可能改变鼠标指针的速度。这是因为只有操作系统才能控制鼠标坐标和速度。浏览器无法影响这一点。我个人认为这无关紧要:您想要实现的是将滑块移动得比正常速度慢,因此您可以忽略鼠标指针。


    为了看到这一切的实际效果,我为你准备了一个可以工作的 jsFiddle:

    DEMO

    希望对你有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多