【问题标题】:jQuery's draggable gridjQuery的可拖动网格
【发布时间】:2010-06-14 09:43:18
【问题描述】:

看起来Draggable的构造函数中的'grid'选项相对绑定到被拖动元素的原始坐标 - 简单地说,如果你有三个可拖动的div,它们的top 相对于其父级分别设置为 100、200、254 像素:

<div class="parent-div" style="position: relative;">
    <div id="div1" class="draggable" style="top: 100px; position: absolute;"></div>
    <div id="div2" class="draggable" style="top: 200px; position: absolute;"></div>
    <div id="div3" class="draggable" style="top: 254px; position: absolute;"></div>
</div>

所有这些都可以在“网格”设置为 [1, 100] 的情况下进行拖动:

draggables = $('.draggable');
$.each(draggables, function(index, elem) {
    $(elem).draggable({
                       containment: $('#parent-div'),
                       opacity: 0.7,
                       revert: 'invalid',
                       revertDuration: 300,
                       grid: [1, 100],
                       refreshPositions: true
    });
});

这里的问题是,只要你拖动 div3,比如说,向下拖动,它的顶部就会增加 100,移动到 354px 而不是仅仅增加46px (254 + 46 = 300),如果我们查看 parent-div 作为参考点和“网格持有者”。

我查看了可拖动源,它似乎是一个内置缺陷 - 它们只是相对于可拖动元素的原始位置进行所有计算。

我想避免猴子修补可拖动库的代码,我在这里真正寻找的是如何使 Draggable 计算相对于包含父级的网格位置的方法。但是,如果猴子补丁是不可避免的,我想我将不得不忍受它。

【问题讨论】:

    标签: javascript jquery drag-and-drop jquery-ui-draggable quirks-mode


    【解决方案1】:

    由于@Pez 的答案丢失 (404),我是这样做的:

    $('#elem').draggable({
        ....,
        drag: function(e, ui) {
            ui.position.left = Math.floor(ui.position.left / 10) * 10;
            ui.position.top = Math.floor(ui.position.top / 10) * 10;
        }
    });
    

    演示:http://jsfiddle.net/ThiefMaster/yGsSE/

    【讨论】:

    • 我正在尝试实现你上面提到的小提琴,但我很难知道我需要哪些资源。 1.5.2 似乎足够了,如果我也有 1.8.9 UI,但是哪些 UI 文件?我喜欢你的解决方案,因为它非常精简和优雅,这正是我一直在寻找的。​​span>
    • 通常没有充分的理由使用旧的 jQuery 版本。因此,请使用 1.6.1 以及最新的 UI 版本。除此之外,使用 UI 包生成器并包含 Draggable - 它应该选择所有必要的内容。
    • 如果网格大小大于 10 像素,可能希望元素对齐到两个方向,而不仅仅是向左对齐(@9​​87654324@ 会发生这种情况):ui.position.left = Math.round((ui.position.left - offset) / 100) * 100 + offset(其中 offset 是网格的左边框)。
    【解决方案2】:

    我通过简单地添加我自己的脚本来解决这个问题:在draggable下并将其设置为

    divide math.Floor(x/100)*100 
    

    Y 也是如此。

    【讨论】:

      【解决方案3】:

      在过去的几天里,我开始使用可拖动的 JQuery,并找到了一个简单的解决方法。

      将 position 属性设置为 absolute 并添加您的小部件,并将 top 和 left 设置为与您的网格对齐的值。

      由于 top/left 的值是绝对值,因此它们在关闭并将它们存储在 db 中时也更有意义。

      【讨论】:

        【解决方案4】:

        Jquery 桌面:

        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
        <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.min.js"></script>
        <link rel="stylesheet/less" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/themes/base/jquery-ui.css">
        
        <div class="parent-div" style="position: relative;">
            <div id="div1" class="draggable" style="top: 100px; position: absolute;">1</div>
            <div id="div2" class="draggable" style="top: 200px; position: absolute;">2</div>
            <div id="div3" class="draggable" style="top: 254px; position: absolute;">3</div>
        </div>
        
        <script>
        var Z_INDEX_APP = 0;
        var Z_INDEX_WINDOW_COUNTER = 1;
        var Z_INDEX_NOTE_COUNTER = 999;
        var Z_INDEX_FOR_DRAGGED = 99999;
        var Z_INDEX_FOR_NOTIF = 999999; 
        var ICONS_GRID_CELL_SIZE = 75;
        var ICONS_GRID_PADDING_LEFT = 20;
        var ICONS_GRID_PADDING_TOP = 50; 
        draggables = $('.draggable');
        $.each(draggables, function(index, elem) {
            $(elem).draggable({
                containment: $('#parent-div'),
                start: function(event) {
                icon = $(this);
                icon.css('z-Index', Z_INDEX_FOR_DRAGGED);
                dragStartLeft = icon.css('left');
                dragStartTop = icon.css('top');
                icon.addClass('desktop-app-dragging');
                icon.removeClass('desktop-app-pressed');
            },
            stop: function(event) {         
                icon.css('z-Index', Z_INDEX_APP);
                var appId = icon.attr('id').split('_')[1];
                icon.removeClass('desktop-app-dragging');
                var alignedX = ICONS_GRID_PADDING_LEFT + Math.floor(parseInt(icon.css('left'))/ICONS_GRID_CELL_SIZE) * ICONS_GRID_CELL_SIZE;
                var alignedY = ICONS_GRID_PADDING_TOP + Math.floor(parseInt(icon.css('top'))/ICONS_GRID_CELL_SIZE)  * ICONS_GRID_CELL_SIZE;
                if ( alignedX < ICONS_GRID_PADDING_LEFT ) alignedX = ICONS_GRID_PADDING_LEFT;
                if ( alignedY < ICONS_GRID_PADDING_TOP ) alignedY = ICONS_GRID_PADDING_TOP;         
                var iconToSwitch = null;
                $(".desktop-app").each(function(index, app) {           
                    if ( app.style.top == ( alignedY + 'px' ) && app.style.left == ( alignedX + 'px' ) ) {
                        iconToSwitch = app;
                    }
                });
                if ( iconToSwitch != null ) {
                    var appToSwitchId = iconToSwitch.id.split('_')[1];
                    var updateUrl = 'api/desktop?cmd=update&id=' + appToSwitchId + '&x=' + parseInt(dragStartLeft) + '&y=' + parseInt(dragStartTop);
                    //$.getJSON(updateUrl);
                    iconToSwitch.style.left = dragStartLeft;
                    iconToSwitch.style.top = dragStartTop;
                }       
                icon.css('left', alignedX + 'px');
                icon.css('top', alignedY + 'px');
                var updateUrl = 'api/desktop?cmd=update&id=' + appId + '&x=' + alignedX + '&y=' + alignedY;
                //$.getJSON(updateUrl);
            }
        
            });
        });
        </script>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-26
          • 1970-01-01
          • 2020-07-26
          相关资源
          最近更新 更多