Я создал область перетаскивания, которая генерирует элементы списка при перетаскивании, которая работает вертикально, но мне нужна горизонтальная поддержка. Я просто хочу, чтобы элемент "переместился" в сторону , когда над ним находится другой элемент.
Я пытался создать невидимую сетку, чтобы определить, где находится поле, но это не работает при сортировке элементов
<div id="jvformbuilder_menu">
<div id="jvformbuilder-element-menu">
<div class="formField drag-drop input">
<p>
<i class="fas fa-fw fa-pencil-alt"></i>
Field
<i class="fas fa-fw fa-grip-lines"></i>
</p>
</div>
<div class="formField drag-drop form-button">
<p>
<i class="far fa-fw fa-dot-circle"></i>
Button
<i class="fas fa-fw fa-grip-lines"></i>
</p>
</div>
<div class="formField drag-drop slider">
<p>
<i class="fas fa-fw fa-sliders-h"></i>
Slider
<i class="fas fa-fw fa-grip-lines"></i>
</p>
</div>
<div class="formField drag-drop list">
<p>
<i class="fas fa-fw fa-list-ul"></i>
List
<i class="fas fa-fw fa-grip-lines"></i>
</p>
</div>
</div>
</div>
<div id="contentWrap">
<ul id="outer-dropzone" class="jvformbuilder_results dropzone">
<li class="builder-elements-wrap empty-insert"></li>
</ul>
</div>
Файл JS:
function drag() {
$(".drag-drop").draggable({
helper: "clone",
revert: "invalid",
connectToSortable: '.dropzone',
revertDuration: 300,
start: function (e) {
$(e.target).css({ opacity: 0.5 });
},
stop: function (e) { // need to put it back on stop
$(e.target).css({ opacity: 1 });
},
});
if($('.dropzone').length == 1){
$('.dropzone').append(
$('<p class="noDropText">').text("You haven't added any elements yet, add some!")
)
}
$('.builder-elements-wrap').sortable({
placeholder: "ph",
opacity: 0.5,
});
$(".dropzone").sortable({
placeholder: "ph",
opacity: 0.5,
stop: function( event, ui ) {
if($('.noDropText').length){
$('.noDropText').remove();
}
var id = ui.item.attr("class");
if (id == "formField drag-drop input ui-draggable ui-draggable-handle ui-draggable-dragging") {
var myElement = $('<li class="builder-elements-wrap item">').append(
$('<div class="builder-elements" id="input-element">').append(
$('<input class="builder-input" type="text" name="data[builderField]" placeholder ="Write something..." />'),
$('<div class="dragHandle"><i class="fas fa-arrows-alt">')
)
);
$(ui.item).replaceWith(myElement);
$(myElement).children('.builder-elements').animate({ width: '98.5%' })
}
else if (id == "formField drag-drop form-button ui-draggable ui-draggable-handle ui-draggable-dragging") {
var myElement = $('<li class="builder-elements" id="button-element">').append(
$('<input class="builderButton" type="submit" value="Submit">'),
$('<div class="dragHandle"><i class="fas fa-arrows-alt">')
);
$(ui.item).replaceWith(myElement);
$('.builder-elements').animate({ width: '99.5%' });
}
else if (id == "formField drag-drop slider ui-draggable ui-draggable-handle ui-draggable-dragging") {
var myElement = $('<li class="builder-elements" id="slider-element">').append(
$('<input type="range" min="1" max="100" value="50" class="builderSlider" id="range"><p>Value: <span id="sliderValue"></span></p>'),
$('<div class="dragHandle"><i class="fas fa-arrows-alt">')
);
$(ui.item).replaceWith(myElement);
$('.builder-elements').animate({ width: '99.5%' });
// JS for formbuilder's slider element.
var slider = document.getElementById("range");
var output = document.getElementById("sliderValue");
output.innerHTML = slider.value;
slider.oninput = function () {
output.innerHTML = this.value;
}
}
else if (id == "formField drag-drop list ui-draggable ui-draggable-handle ui-draggable-dragging") {
var myElement = $('<li class="builder-elements" id="list-element">').append(
$('<ul class="builderList">').append(
$('<li class="builderListItem">').text("item 1"),
$('<li class="builderListItem">').text("item 2"),
$('<li class="builderListItem">').text("item 3")
),
$('<div class="dragHandle"><i class="fas fa-arrows-alt">')
);
$(ui.item).replaceWith(myElement);
$('.builder-elements').animate({ width: '99.5%' });
}
$(".dropzone").droppable({
activeClass: "dropActive",
hoverClass: "dropHover",
over: function(event, ui) {
$('.noDropText').css('display', 'none');
},
out: function () {
if ($('.dropzone').find('.builder-elements').length === 0) {
$('.noDropText').css('display', 'block');
}
}
});
}
Прямо сейчас код работает по вертикали, но я не знаю, как это сделать. Желаемый результат будет таким: https://codepen.io/devpriya/pen/zGdrzP, но он встроен в Node и Angular. В настоящее время я работаю над плагином Wordpress, который создает формы, поэтому у меня нет этих двух доступных для моего текущего стека.