Я разрабатываю функцию для перетаскивания элементов, но столкнулся с затруднением. Элементы корректно перетаскиваются и меняются местами в одном списке, но не удается создать отдельную зону для сброса элементов из основного контейнера.
const перемещаемыеЭлементы = document.querySelectorAll('.перемещаемый')
const исходныеКонтейнеры = document.querySelectorAll('.ящик-элементов')
const зоныСброса = document.querySelectorAll('.зона-сброса')
перемещаемыеЭлементы.forEach(элемент => {
элемент.addEventListener('dragstart', () => {
элемент.classList.add('перетаскиваемый')
})
элемент.addEventListener('dragend', () => {
элемент.classList.remove('перетаскиваемый')
})
})
исходныеКонтейнеры.forEach(контейнер => {
контейнер.addEventListener('dragover', e => {
e.preventDefault()
const следующийЭлемент = получитьПозициюДляВставки(контейнер, e.clientY)
const перетаскиваемыйЭлемент = document.querySelector('.перетаскиваемый')
if (следующийЭлемент == null) {
контейнер.appendChild(перетаскиваемыйЭлемент)
} else {
контейнер.insertBefore(перетаскиваемыйЭлемент, следующийЭлемент)
}
})
})
зоныСброса.forEach(зона => {
зоныСброса.addEventListener('dragover', function (e) {
e.preventDefault();
});
зоныСброса.addEventListener("drop", function (e) {
e.appendChild(текущийЭлемент);
текущийЭлемент = null;
});
});
function получитьПозициюДляВставки(обертка, yPos) {
const доступныеЭлементы = [...обертка.querySelectorAll('.перемещаемый:not(.перетаскиваемый)')]
return доступныеЭлементы.reduce((ближайший, элемент) => {
const прямоугольник = элемент.getBoundingClientRect()
const расстояние = yPos - прямоугольник.top - прямоугольник.height / 2
if (расстояние < 0 && расстояние > ближайший.расстояние) {
return { расстояние: расстояние, элемент: элемент }
} else {
return ближайший
}
}, { расстояние: Number.NEGATIVE_INFINITY }).element
}
<body>
<div class="основной-обертка">
<div class="исходная-панель">
<div class="контейнер-элементов">
<div class="мех-область" data-scroll="true">
<ul class="список-элементов scroll-content">
<div class="ящик-элементов">
<div class="перемещаемый" draggable="true">элемент</div>
</div>
<div class="ящик-элементов">
<div class="перемещаемый" draggable="true">элемент</div>
</div>
<div class="ящик-элементов">
<div class="перемещаемый" draggable="true">элемент</div>
</div>
</ul>
</div>
</div>
</div>
<div class="целевой-панель">
<div class="зона-сброса"></div>
<div class="управление">
<button class="кнопка-отправить">
Отправить
</button>
</div>
</div>
</div>
</body>
Я пытался добавить обработчики для зоны сброса, но что-то идет не так. Можете подсказать, в чем проблема в коде?