自分で回避策を作成しました
このコードを作成し、常にループする間隔内に配置して、同じ列に属する要素が重ならないようにしました。
.gs_w
はグリッドスターグリッドセルのクラスであり、.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;
}
}
提案や改善は大歓迎です!