javascript拖放缩放元素时的错误行为

javascript拖放缩放元素时的错误行为,javascript,drag-and-drop,scale,Javascript,Drag And Drop,Scale,我的应用程序中有一个拖放功能,其中主容器被缩小。请查看具有相同功能的。 HTML: <div id="container"> <div class="droppable object0"></div> <div class="droppable object1"></div> <div class="draggable object0" id="object0"></div> </d

我的应用程序中有一个拖放功能,其中主容器被缩小。请查看具有相同功能的。

HTML:

<div id="container">
    <div class="droppable object0"></div>
    <div class="droppable object1"></div>
    <div class="draggable object0" id="object0"></div>
</div>
#container{
    height: 600px;
    width: 600px;
    border: 3px solid green;
    transform: scale(.8);
}

.droppable{
    width: 75px;
    height: 75px;
    border: 3px solid red;
}

#object1{
  position: absolute;
  left: 100px;
}

.draggable{
  width: 200px;
  height: 200px;
  border: 3px solid blue;
  top: 100px;
  left: 100px;
  position: relative;
}

.location-correct{
  background: green;
}
.location-incorrect{
  background: red;
}
JS

 var scaleCoefficient = .8;
 var DragManager = new function() {

 /**
 * составной объект для хранения информации о переносе:
 * {
*   elem - элемент, на котором была зажата мышь
*   avatar - аватар
*   downX/downY - координаты, на которых был mousedown
*   shiftX/shiftY - относительный сдвиг курсора от угла элемента
* }
*/
var dragObject = {};

var self = this;

function onMouseDown(e) {

    if (e.which != 1) return;

    var elem = e.target.closest('.draggable');
    console.log("a = ",elem)
    if (!elem) return;

    dragObject.elem = elem;

    // запомним, что элемент нажат на текущих координатах pageX/pageY
    dragObject.downX = e.pageX;
    dragObject.downY = e.pageY;

    return false;
}

function onMouseMove(e) {
    if (!dragObject.elem) return; // элемент не зажат

    if (!dragObject.avatar) { // если перенос не начат...
        var moveX = e.pageX - dragObject.downX;
        var moveY = e.pageY - dragObject.downY;

        // если мышь передвинулась в нажатом состоянии недостаточно далеко
        if (Math.abs(moveX) < 3 && Math.abs(moveY) < 3) {
            return;
        }

        // начинаем перенос
        dragObject.avatar = createAvatar(e); // создать аватар
        if (!dragObject.avatar) { // отмена переноса, нельзя "захватить" за эту часть элемента
            dragObject = {};
        return;
    }

        // аватар создан успешно
        // создать вспомогательные свойства shiftX/shiftY
        var coords = getCoords(dragObject.avatar);
        dragObject.shiftX = dragObject.downX - coords.left;
        dragObject.shiftY = dragObject.downY - coords.top;

        startDrag(e); // отобразить начало переноса
    }

    // отобразить перенос объекта при каждом движении мыши
    dragObject.avatar.style.left = e.pageX - dragObject.shiftX + 'px';
    dragObject.avatar.style.top = e.pageY - dragObject.shiftY + 'px';

    return false;
}

function onMouseUp(e) {
    if (dragObject.avatar) { // если перенос идет
        finishDrag(e);
    }

    // перенос либо не начинался, либо завершился
    // в любом случае очистим "состояние переноса" dragObject
    dragObject = {};
}

function finishDrag(e) {
    var dropElem = findDroppable(e);

    if (!dropElem) {
        onDragCancel(dragObject);
    } else {
        onDragEnd(dragObject, dropElem);
    }
}

function createAvatar(e) {

    // запомнить старые свойства, чтобы вернуться к ним при отмене переноса
    var avatar = dragObject.elem;
    var old = {
        parent: avatar.parentNode,
        nextSibling: avatar.nextSibling,
        position: avatar.position || '',
        left: avatar.left || '',
        top: avatar.top || '',
        zIndex: avatar.zIndex || ''
    };

    // функция для отмены переноса
    avatar.rollback = function() {
        old.parent.insertBefore(avatar, old.nextSibling);
        avatar.style.position = old.position;
        avatar.style.left = old.left;
        avatar.style.top = old.top;
        avatar.style.zIndex = old.zIndex
    };

    return avatar;
}

function startDrag(e) {
    var avatar = dragObject.avatar;

    //avatar.style.width = avatar.offsetWidth * scaleCoefficient;
    var id = avatar.id;
    $('#' + id).css('transform', 'scale(' + scaleCoefficient + ')');


    var topPos = $('#' + id).css('top');
    var leftPos = $('#' + id).css('left');
    $('#' + id).css('top', '-300px');
    $('#' + id).css('left', '-300px');
    // инициировать начало переноса
    document.body.appendChild(avatar);
    avatar.style.zIndex = 9999;
    avatar.style.position = 'absolute';



    //avatar.style.top = "-200px";
    //avatar.style.left = "-300px";
}

function findDroppable(event) {
    // спрячем переносимый элемент
    dragObject.avatar.hidden = true;

    // получить самый вложенный элемент под курсором мыши
    var elem = document.elementFromPoint(event.clientX, event.clientY);

    // показать переносимый элемент обратно
    dragObject.avatar.hidden = false;

    if (elem == null) {
        // такое возможно, если курсор мыши "вылетел" за границу окна
        return null;
    }

    return elem.closest('.droppable');
}

document.onmousemove = onMouseMove;
document.onmouseup = onMouseUp;
document.onmousedown = onMouseDown;

function onDragEnd(dragObject, dropElem) {
    if (dropElem.classList.contains(dragObject.avatar.classList.item(1))) {
        dragObject.elem.style.display = 'none';
        dropElem.classList.add("location-correct");
    } else {
        dragObject.avatar.rollback();
        dropElem.classList.add('location-incorrect');
        setTimeout(function(){
            dropElem.classList.remove('location-incorrect');
        }, 1000);
    }
};
  function onDragCancel(dragObject) {
    dragObject.avatar.rollback();
  };
};


function getCoords(elem) { // кроме IE8-
    var box = elem.getBoundingClientRect();

    return {
        top: box.top + pageYOffset,
        left: box.left + pageXOffset
    };

}
var-scaleCoefficient=.8;
var DragManager=新函数(){
/**
* составной объект для хранения информации о переносе:
* {
*要素-要素,要素
*阿凡达-阿凡达
*羽绒服/羽绒服-鼠标向下
*shiftX/shiftY-ааааааааааааааааа
* }
*/
var dragObject={};
var self=这个;
函数onMouseDown(e){
如果(e.which!=1)返回;
var elem=e.target.closest('.Dragable');
console.log(“a=”,elem)
如果(!elem)返回;
dragObject.elem=elem;
//第页/第页
dragObject.downX=e.pageX;
dragObject.downY=e.pageY;
返回false;
}
移动鼠标的功能(e){
如果(!dragObject.elem)返回;//
如果(!dragObject.avatar){//。。。
var moveX=e.pageX-dragObject.downX;
var moveY=e.pageY-dragObject.downY;
// если мышь передвинулась в нажатом состоянии недостаточно далеко
if(Math.abs(moveX)<3&&Math.abs(moveY)<3){
返回;
}
// начинаем перенос
dragObject.avatar=createAvatar(e);//
如果(!dragObject.avatar){//
dragObject={};
返回;
}
// аватар создан успешно
//变速箱/变速箱
var coords=getCoords(dragObject.avatar);
dragObject.shiftX=dragObject.downX-coords.left;
dragObject.shiftY=dragObject.downY-coords.top;
标准草案(e);//
}
// отобразить перенос объекта при каждом движении мыши
dragObject.avatar.style.left=e.pageX-dragObject.shiftX+'px';
dragObject.avatar.style.top=e.pageY-dragObject.shiftY+'px';
返回false;
}
函数onMouseUp(e){
if(dragObject.avatar){//
完成阻力(e);
}
// перенос либо не начинался, либо завершился
//排水工程
dragObject={};
}
函数finishDrag(e){
var dropElem=FindDropTable(e);
如果(!dropElem){
onDragCancel(dragObject);
}否则{
onDragEnd(dragObject,dropElem);
}
}
函数createAvatar(e){
// запомнить старые свойства, чтобы вернуться к ним при отмене переноса
var avatar=dragObject.elem;
var old={
父节点:avatar.parentNode,
nextSibling:avatar.nextSibling,
位置:avatar.position | |“”,
左:阿凡达,左,
头像:阿凡达,头像,
zIndex:avatar.zIndex | |“
};
// функция для отмены переноса
avatar.rollback=函数(){
old.parent.insertBefore(化身,old.nextSibling);
avatar.style.position=old.position;
avatar.style.left=old.left;
avatar.style.top=old.top;
avatar.style.zIndex=old.zIndex
};
返回化身;
}
功能启动图(e){
var avatar=dragObject.avatar;
//avatar.style.width=avatar.offsetWidth*缩放效率;
var id=化身id;
$('#'+id).css('transform','scale('+scaleCoefficient+');
var topPos=$('#'+id).css('top');
var leftPos=$('#'+id).css('left');
$('#'+id).css('top','-300px');
$('#'+id).css('left','-300px');
// инициировать начало переноса
文件.身体.儿童(化身);
avatar.style.zIndex=9999;
avatar.style.position='绝对';
//avatar.style.top=“-200px”;
//avatar.style.left=“-300px”;
}
函数finddropable(事件){
// спрячем переносимый элемент
dragObject.avatar.hidden=true;
// получить самый вложенный элемент под курсором мыши
var elem=document.elementFromPoint(event.clientX,event.clientY);
// показать переносимый элемент обратно
dragObject.avatar.hidden=false;
if(elem==null){
// такое возможно, если курсор мыши "вылетел" за границу окна
返回null;
}
返回元素最近('.dropable');
}
document.onmousemove=onmousemove;
document.onmouseup=onmouseup;
document.onmousedown=onmousedown;
拉根(dragObject,dropElem)的功能{
if(dropElem.classList.contains(dragObject.avatar.classList.item(1))){
dragObject.elem.style.display='none';
dropElem.classList.add(“位置正确”);
}否则{
dragObject.avatar.rollback();
dropElem.classList.add('location-error');
setTimeout(函数(){
dropElem.classList.remove('location-error');
}, 1000);
}
};
功能取消(dragObject){
dragObject.avatar.rollback();
};
};
函数getCoords(elem){//БöМIE8-
var box=elem.getBoundingClientRect();
返回{
顶部:box.top+pageYOffset,
左:box.left+pageXOffset
};
}
何时