console
function setCss(obj,cssList){
for (var attr in cssList) {
obj.style[attr] = cssList[attr];
}
}
function addClass(obj,_classname){
var classNames = obj.className
var tf = classNames.search(_classname)>=0?true:false;
if(!tf){
classNames = classNames+' '+_classname;
obj.className = classNames;
}
}
function removeClass(obj,_classname){
var classNames = obj.className.split(' ');
var index = classNames.indexOf(_classname);
classNames.splice(index,1);
classNames = classNames.toString().replace(',',' ');
obj.className = classNames;
}
window.onload = function(){
var dd1 = new DragDrop('dd1');
var dd2 = new DragDrop('dd2');
dd1.init();
dd2.init();
}
function DragDrop(id){
this.parentBox = document.getElementById(id)
this.editSwith = this.parentBox.querySelector('.editOrder');
this.save = this.parentBox.querySelector('.save');
this.list = this.parentBox.querySelector('.list');
this.li = this.list.querySelectorAll('li');
this.aPosXY=[];
this.aPosXYClone=[];
this.moveStatus = false;
this.editAble = false;
this.dashedBox = null;
this.moveItem = null;
this.moveItemH = null;
this.mouseDownPos=[];
this.inScope = false;
}
DragDrop.prototype.init = function(){
var _this = this;
this.list.style.height = this.li.length*(this.li[0].offsetHeight+parseInt(document.defaultView.getComputedStyle(this.li[0]).marginBottom))+'px';
for (var i=0; i<this.li.length; i++) {
var posXY = [];
var posX = this.li[i].offsetLeft;
var posY = this.li[i].offsetTop;
posXY.x = posX+'px';
posXY.y = posY+'px';
this.aPosXY.push(posXY);
this.li[i].setAttribute('data-index',i)
}
for(var i in this.aPosXY ){
setCss(this.li[i],{'position':'absolute','left':this.aPosXY[i].x,'top':this.aPosXY[i].y})
}
this.editSwith.onclick = function(){
_this.edit();
}
for (var i=0; i<this.li.length; i++) {
this.li[i].onmousedown = function(event,t){
if(_this.editAble){
_this.mouseDown(event,this);
}
}
this.li[i].onmouseup = function(){
if(_this.editAble){
_this.moveStatus = false;
_this.mouseUp(_this.moveItem);
}
}
}
this.list.onmousemove = function(event){
if(_this.moveStatus){
_this.mouseMove(event,_this.moveItem);
}
}
}
DragDrop.prototype.mouseMove = function(e,obj){
var relativeListX = e.pageX-this.list.offsetLeft;
var relativeListY = e.pageY-this.list.offsetTop;
var objIndex = obj.getAttribute('data-index');
var objLeft = this.aPosXY[objIndex].x;
var objTop = this.aPosXY[objIndex].y;
var relativeObjX = this.mouseDownPos.x-parseInt(objLeft);
var relativeObjY = this.mouseDownPos.y-parseInt(objTop);
var objMoveX = relativeListX-relativeObjX;
var objMoveY = relativeListY-relativeObjY;
setCss(obj,{'left': objMoveX+'px','top':objMoveY+'px'});
for(var i=0; i<this.aPosXYClone.length; i++ ){
if(!(i==objIndex)){
if(objMoveY+obj.offsetHeight>=parseInt(this.aPosXYClone[i].y)+this.li[i].offsetHeight/2&&objMoveY+obj.offsetHeight<parseInt(this.aPosXYClone[i].y)+this.li[i].offsetHeight||objMoveY>=parseInt(this.aPosXYClone[i].y)&&objMoveY<parseInt(this.aPosXYClone[i].y)+this.li[i].offsetHeight/2){
var ts = [];
ts.x = this.dashedBox.style.left;
ts.y = this.dashedBox.style.top;
this.aPosXYClone[objIndex] = this.aPosXYClone[i];
this.aPosXYClone[i]=ts;
setCss(this.dashedBox,{'left': this.aPosXYClone[objIndex].x,'top':this.aPosXYClone[objIndex].y});
setCss(this.li[i],{'left': ts.x,'top':ts.y});
return false;
}
}
}
}
DragDrop.prototype.mouseUp = function(t){
if(this.moveItem){
this.list.removeChild(this.dashedBox)
this.moveItem.style.zIndex = null;
removeClass(t,'move-item');
this.aPosXY.splice(0,this.aPosXY.length);;
for (var i=0; i<this.aPosXYClone.length; i++) {
this.aPosXY.push(this.aPosXYClone[i]);
}
addClass(t,'edit-able');
for(var i in this.aPosXY ){
setCss(this.li[i],{'position':'absolute','left':this.aPosXY[i].x,'top':this.aPosXY[i].y})
}
this.moveItem = null;
}
}
DragDrop.prototype.mouseDown = function(e,t){
var thisIndex = t.getAttribute('data-index');
this.dashedBox = document.createElement('div');
var tWidth = t.offsetWidth+'px';
var tHeight = t.offsetHeight+'px';
this.dashedBox.className = 'dashed-box';
setCss(this.dashedBox,{'width':tWidth,'height':tHeight,'left':this.aPosXY[thisIndex].x, 'top':this.aPosXY[thisIndex].y});
this.list.appendChild(this.dashedBox);
this.moveStatus = true;
this.moveItem = t;
this.mouseDownPos.x = e.pageX-this.list.offsetLeft;
this.mouseDownPos.y = e.pageY-this.list.offsetTop;
t.style.zIndex = 100;
addClass(t,'move-item');
this.moveItemH = t.offsetHeight;
this.aPosXYClone.splice(0,this.aPosXYClone.length);
for (var i=0; i<this.aPosXY.length; i++) {
this.aPosXYClone.push(this.aPosXY[i]);
}
removeClass(t,'edit-able');
console.log(this.mouseDownPos);
}
DragDrop.prototype.edit = function(){
var classNames = this.editSwith.className;
var aClassNames = classNames.split(' ');
var index = aClassNames.indexOf('on');
var tf = index>=0?true:false;
if(!tf){
this.editSwith.className = classNames+' on';
this.editAble = true;
}else{
aClassNames.splice(index,1);
this.editSwith.className = aClassNames.toString().replace(',',' ');
this.editAble = false;
}
this.setClass(!tf);
console.log(this.editAble==true?'可编辑':'不可编辑');
}
DragDrop.prototype.setClass = function(tf){
for (var i=0;i<this.li.length;i++) {
if(tf){
this.li[i].className = 'edit-able';
}else{
this.li[i].className = '';
}
}
}
<div id="dd1" class="parent-box">
<button class="editOrder ddd" data-for="#dd1" >编辑顺序</button>
<ul class="list ee">
<li>01</li>
<li>02</li>
<li>03</li>
<li>04</li>
<li>05</li>
<li>06</li>
<li>07</li>
<li>08</li>
<li>09</li>
<li>10</li>
</ul>
</div>
<div id="dd2" class="parent-box">
<button class="editOrder" data-for="#dd1" >编辑顺序</button>
<ul class="list">
<li>01</li>
<li>02</li>
<li>03</li>
<li>04</li>
<li>05</li>
<li>06</li>
<li>07</li>
<li>08</li>
<li>09</li>
<li>10</li>
</ul>
</div>
.parent-box{ width: 400px; float: left; margin: 40px;-moz-user-select: none; -ms-user-select: none; -webkit-user-select: none;}
.list{ width: 100%; padding: 10px; margin: 0; position: relative; padding-bottom: 0; border: 1px solid #999;}
.list li{ display: block; width: 400px; height: 50px; border: 1px solid #999; margin-bottom: 10px; background: #ccc; box-sizing: border-box; }
li.edit-able{ cursor: move; border-style: dashed; border-color: #eee; transition: all .3s ease;}
.list li.move-item{ box-shadow: 4px 4px 4px #AAAAAA; opacity: 0.5;}
button{ padding: 0 10px; height: 30px; margin-bottom: 30px; margin-right: 10px; border: none; background: #aaa; cursor: pointer; outline: none;}
button.on{ background: #eee;}
.dashed-box{ position: absolute; background: #fff9c4; border: 1px dashed #ff9800; box-sizing: border-box; z-index: -1;}