【问题标题】:jquery draggable moves on 30 degrees onlyjquery可拖动仅在30度上移动
【发布时间】:2015-05-27 15:26:12
【问题描述】:

我想要一个在 30 度角上移动的选择器,我在网上做了一些研究,但找不到任何解决方案!。

我知道:

$( ".selector" ).draggable({ axis: 'x' });

将在 x 轴上移动它并且:

$( ".selector" ).draggable({ axis: 'y' });

将在 y 轴上移动它,但问题是如何仅在 30 度角上移动它?

我想让这个菜单工作。

【问题讨论】:

  • 我很想知道这是否可行,或者您是否需要一些自定义解决方案
  • 正如jqueryui.com/droppable 中显示的那样,没有解决方案,所以我认为我需要自定义解决方案,但不确定
  • 您是否尝试过创建对角元素并将其设置为包含元素?
  • 愚蠢的我!,一定会奏效的,让我试试吧。
  • 它确实起作用了,我将容器旋转了 30 度并且它起作用了,但是它从容器中出来并回到里面然后进入边界,它不是 30 度的急剧运动也没有成一条线:/

标签: javascript jquery jquery-ui-draggable


【解决方案1】:

其实很简单!
您所要做的就是控制您的元素在drag 事件中的位置,一点三角函数将为您完成繁重的工作......


已编辑:
这是original answer
这是new one


var rad = Math.PI / 180;

$("#Handle").draggable(
{
    drag: function(event, ui)
    {
        var offset =
        {
            x: ui.offset.left - ui.originalPosition.left,
            y: ui.offset.top - ui.originalPosition.top
        };
        
        var distance = Math.sqrt(offset.x * offset.x + offset.y * offset.y);
        distance = Math.min(distance, 150);
        
        var angle;
        
             if (offset.y > 0) { angle = 90 * rad; } // Moving downwards
        else if (offset.x < 0) { angle = 210 * rad; } // Moving leftwards
        else                   { angle = 330 * rad; } // Moving rightwards
        
        ui.position.top = Math.sin(angle) * distance + ui.originalPosition.top;
        ui.position.left = Math.cos(angle) * distance + ui.originalPosition.left;
    }
});
body { margin: 0; }
#Handle
{
    top: 150px;
    left: 200px;
    width: 25px;
    height: 25px;
    background-color: red;
}

#Background
{
    position: absolute;
    top: 150px;
    left: 200px;
}

#Background .bottom,
#Background .left,
#Background .right
{
    transform-origin: top left;
    width: 150px;
    height: 1px;
    background-color: blue;
}

#Background .bottom { transform: rotate(90deg); }
#Background .left { transform: rotate(210deg); }
#Background .right { transform: rotate(330deg); }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>

<div id="Background">
    <div class="right"></div>
    <div class="bottom"></div>
    <div class="left"></div>
</div>

<div id="Handle"></div>

【讨论】:

  • 谢谢你这是我要求的,我可以在 30 度、150 度和 90 度三个方向上移动吗,我已经更新了我想要实现的图片,谢谢你的帮助.
  • 你的有趣菜单... =D 您可以检查offset.xoffset.y 是正还是负来更改角度锁定... 我会尝试更新我的小提琴
  • 发布新代码后的几秒钟内,我注意到如果您多次拖动手柄,它将从错误的位置开始。您需要在拖动之前存储初始位置,并在开始或停止事件(或其他地方)中将其重置
  • 您可能想要一些在可拖动事件中未检测到的静态原始位置。因为,如果你在移动方块后放开它,它就会从那个点开始移动,而不是原来的点
  • 是的,我注意到问题了在 1 个方向上,直到它捕捉到中心它重置选项,因为它是 ..
猜你喜欢
  • 1970-01-01
  • 2013-04-28
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
相关资源
最近更新 更多