传递/更改 jQuery UI 拖动事件

Passing / altering a jQuery UI drag event

我希望用户能够左右拖动水平菜单栏。我意识到有很多旋转木马和滑块库都有这种行为——但是 none 它们符合这种情况。

当用户拖动一个LI时,是否可以将新的x-offset信息传递到first[=26=的left margin ] LI?

我在这里试了一下:http://jsfiddle.net/n92ng9uz/

上述 fiddle 的主要问题是偏移仍然应用于个人 LI,如果我阻止事件冒泡,拖动将不再平滑。

这不行吗?将边距添加到 ul?似乎适用于 fiddle!

var ul = $('ul');

ul.draggable({
    axis: 'x',
    drag: function(e, ui) {
        ul.css({marginLeft: ui.position - ui.originalPosition});
    }
});

如果您希望用户能够自由拖动导航栏然后它应该落在同一个地方那么您可以试用 jquery 爸爸插件。它是迄今为止我使用过的最好的拖放插件,代码简单。

Click here 如果您愿意,可以查看它的演示和文档。

编辑:没关系...弄明白了...您需要将每个项目向左移动位置差异。我认为这就是您所追求的:http://jsfiddle.net/xwesf1Lt/。告诉我,如果我错了。请注意,我将 diff 变量更改为左侧位置。

另外,我们不改变边距,而是改变左边的属性。

var firstLI = $('ul:first-child')[0];
firstLI.style.marginLeft = 0;

$('li').draggable({
    axis: 'x',
    drag: function(e, ui) {
        var diff = ui.position.left;
        console.log(diff);
        var currentLeft = parseInt(firstLI.style.marginLeft, 10);
        var offset = currentLeft + diff + 'px';
        //firstLI.style.marginLeft = diff;
        //  to drag all of them:

        $("li").each(function(index) {
            $(this).css("left", offset);
        });

        // with this enabled, can only be moved 1px at a time..?
        // e.preventDefault();
    }
});

由于您在评论中指定要求在第一个 li 元素上使用 margin-left,而不是修改 ul 的位置,我很确定使用 jQuery UI 可拖动无法轻松完成。如果我们要使 li 可拖动,我们就不会在其他 li 上捕获鼠标事件,如果我们要使 ul 可拖动,我们就不能轻易地它只影响第一个 limargin-left 而不是 ul.

的位置

这是一个 现场演示 解决方案,它直接使用鼠标事件而不是使用 jQuery UI:

var firstLI = $('li:first-child');

var initx = 0;
var dragstartx = 0;
var dragging = false;

$("ul").mousedown(function(e) {
    dragging = true;
    dragstartx = e.pageX;
    initx = parseInt(firstLI.css("marginLeft"), 10);
});

$("ul").mousemove(function(e) {
    if (dragging) {
        firstLI.css("marginLeft", (initx + e.pageX - dragstartx) + "px");
    }
});

$("ul").mouseleave(function(e) {
    dragging = false;
});

$("ul").mouseup(function(e) {
    dragging = false;
});
ul {
    list-style: none;
    margin: 0;
    padding: 0;
    overflow: hidden;
    white-space: nowrap;
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}

ul > li {
    display: inline-block;
    padding: 10px;
}

ul > li:nth-child(odd) {
    background: orangered;
}

ul > li:nth-child(even) {
    background: gold;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul>
    <li>Link 1</li>
    <li>Link 2</li>
    <li>Link 3</li>
    <li>Link 4</li>
    <li>Link 5</li>
    <li>Link 6</li>
    <li>Link 7</li>
    <li>Link 8</li>
    <li>Link 9</li>
    <li>Link 10</li>
</ul>

JSFiddle 版本:https://jsfiddle.net/n92ng9uz/2/