Вам не нужно mouseleave
на элементе. Ваша проблема в том, что mouseleave
срабатывает на элементе, и это прекращает ваше перетаскивание. Вместо этого воспользуйтесь всплывающим событием и добавьте ваш обработчик в достаточно большой родительский контейнер или в window
. Запустите mouseup
в окне / контейнере тогда и только тогда, когда было предварительно активировано с помощью mousedown
. Если вы хотите, вы также можете удалить и заново прикрепить обработчик в окне к mousedown
элемента, если вы хотите сохранить некоторые вычисления. Но я оставил это:
https://jsfiddle.net/ibowankenobi/gd1e93a3/1/
const shadowStytle = "10px 10px 12px #888888";
const appRef = document.getElementById('app');
appRef.innerHTML = `<div class="box" id="box"></div>`;
const boxRef = document.getElementById("box");
const xOffset = boxRef.clientWidth / 2;
const yOffset = boxRef.clientHeight / 2;
let selectionLocked = false;
function lockSelection() {
selectionLocked = true;
boxRef.style.boxShadow = shadowStytle;
boxRef.style.backgroundColor = "red";
}
function unlockSelection() {
selectionLocked = false;
boxRef.style.boxShadow = "none";
boxRef.style.backgroundColor = "black";
}
unlockSelection();
boxRef.addEventListener("mousedown", (arg) => {
lockSelection();
});
window.addEventListener("mouseup", (arg) => {
selectionLocked && unlockSelection();
});
boxRef.addEventListener("mouseleave", (arg) => {
/*if (selectionLocked) {
selectionLocked = false;
boxRef.style.boxShadow = "none";
}*/
});
window.addEventListener("mousemove", (arg) => {
if (selectionLocked) {
boxRef.style.left = `${arg.clientX - xOffset}px`;
boxRef.style.top = `${arg.clientY - yOffset}px`;
}
});