1

这是我想做的事情:我正在使用gridster来创建表单创建 IDE。用户拖动网格中的元素,并可以移动它们。

在编辑器中一切正常,但是当我尝试使用这些表单时,当网格位置内的元素变得大于包含它们的网格块时,我遇到了问题,从而使一个元素与另一个元素重叠。

我正在寻找的是一个自动化的解决方案,当给定一堆绝对定位的元素时,它会向上或向下移动它们,这样它们就不会重叠。这样的事情存在吗?

4

2 回答 2

0

绝对定位的全部意义在于它覆盖了客户端重排布局的能力。您所要求的与绝对定位的目的直接冲突。

从理论上讲,您可以在每次发生变化时运行一些 javascript 并重新计算所有布局并四处移动,但要做到这一点需要做很多工作。

您可能还会与 Gridster 的代码发生冲突。所以你需要考虑到这一点,甚至可能需要重写 Gridster 代码。

于 2012-10-04T16:49:59.177 回答
0

我自己做了一个解决方法

我写了这段代码,并将它放在一个一直循环的区间内,使属于同一列的元素不重叠。

请注意,这.gs_w是 gridster 网格单元的类,其中包含.form_row又包含输入元素本身并缩小以适应它。

最后,如果启用了拖动,这将不起作用,在我的情况下这是可以的,因为只有我构建的表单编辑器使用拖动。不是表格本身。

setInterval(collision_checks);

/**
 * Handles vertical collisions of gridster elements
 */
function collision_checks()
{
    var elements = $('.gs_w');
    if(!$(elements).length)
    {
        return;
    }

    var columns = {};
    // Group the elements in columns
    $(elements).each(function(){
        //If an element takes more than one columns, add it in all of them
        //so collision gets handled properly
        for(var i = 0; i < $(this).data('sizex'); i++)
        {
            columns[parseInt($(this).data('col'), 10) + i] = columns[parseInt($(this).data('col'), 10) + i] || [];
            columns[parseInt($(this).data('col'), 10) + i].push(this);
        }

    });

    // For each column, handle if it's elements collides with the element below it
    for(var i in columns)
    {
        if(!columns.hasOwnProperty(i)){continue;}
        var column = columns[i];
        for(var j in column)
        {
            if(!column.hasOwnProperty(j)){continue;}
            var element = column[j];
            var element_below = column[parseInt(j,10) + 1];

            if(!$(element).is(':visible'))
            {
                continue;
            }

            if(element == element_below)
            {
                continue;
            }

            var depth = penetration_depth(element, element_below);
            if(depth)
            {
                var offset = $(element_below).position();
                $(element_below).css('top', offset.top + depth);
            }
        }
    }
}


/**
 * if the top element overlaps the bottom one, this function returns their penetration depth
 */
function penetration_depth(el_top, el_bottom)
{
    if(!el_bottom){return 0;}
    if($(el_top).find('.form_row').offset().top + $(el_top).find('.form_row').outerHeight(true) > $(el_bottom).find('.form_row').offset().top)
    {
        return $(el_top).find('.form_row').offset().top + $(el_top).find('.form_row').outerHeight(true) - $(el_bottom).find('.form_row').offset().top;
    }
    else
    {
        return 0;
    }
}

欢迎任何建议或改进!

于 2012-10-05T11:37:59.073 回答