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
};
}
何时