var div = document.getElementsByClassName(‘name‘)[0];
// var arr = []; // indexP 数值和 div次序的对应关系,交换顺序后再寄回换数组顺序
initDrag({
parentDom: div,
num: 3,
classList: ‘age‘
}, {
attrList: {
id: 10,
gmcc: 22
}
})
/**
* 父级中不能有 col-md-*的定位元素 position 如果没有将 以table body为参考
pointer-events: none; 当元素包含iframe时,,父类的拖拽事件,将不会触发,,
此css属性会将 实践和hover 取消
* @param _parentDom 需相对定位
* @param _num 阶数
* @param _classList 需要添加的类名 字符串用空格分割
*/
/**
* @param base{
* parentDom 需相对定位
* num 阶数
* classList 需要添加的类名 字符串用空格分割
* }
*
* @param option{
* eventList{
* type 类型:fn 引用方法
* }
* ...
* ],
* attrList{
* attrName : value,
* ....
* },
* }
*
*/
function initDrag(base, option) {
var _parentDom = base.parentDom,
_num = base.num,
_classList = base.classList
var _parentW = _parentDom.offsetWidth,
_parentH = _parentDom.offsetHeight;
var _sonW = Math.floor(parseInt(_parentW) / _num),
_sonH = Math.floor(parseInt(_parentH) / _num),
arr = [],
isMove = false;
createDiv();
addEvent();
function createDiv() {
for (var i = 0; i < _num; i++) {
for (var j = 0; j < _num; j++) {
var div = document.createElement(‘div‘);
div.style.position = ‘absolute‘;
div.style.width = _sonW + ‘px‘;
div.style.height = _sonH + ‘px‘;
div.style.transitionProperty = ‘left,top‘;
div.style.transitionDuration = ‘0.3s‘;
div.style.cursor = ‘pointer‘;
div.className = _classList;
div.indexP = i * _num + j;
arr.push(div);
// div.innerText = i * _num + j;
setPosition(i, j, div);
_parentDom.appendChild(div);
}
}
}
function addEvent() {
for (var i = 0; i < _parentDom.children.length; i++) {
if (option.attrList) {
setOption(option.attrList, _parentDom.children[i], i + 1);
}
if (option.eventList) {
setOption(option.eventList, _parentDom.children[i], ‘‘, true);
}
_parentDom.children[i].onmousedown = function(e) {
var tempDiv = this;
var _relativeL = e.pageX - _parentDom.offsetLeft - tempDiv.offsetLeft,
_relativeT = e.pageY - _parentDom.offsetTop - tempDiv.offsetTop;
console.log(_parentDom.offsetLeft)
tempDiv.style.zIndex = 9999;
document.onmousemove = move;
function move(e1) {
// 移动
tempDiv.style.left = e1.pageX - _parentDom.offsetLeft - _relativeL + ‘px‘;
tempDiv.style.top = e1.pageY - _parentDom.offsetTop - _relativeT + ‘px‘;
isMove = true;
}
tempDiv.onmouseup = function(e1) {
document.onmousemove = null;
this.onmouseup = null;
tempDiv.style.zIndex = 0;
if (isMove) {
var targetX = e1.pageX - _parentDom.offsetLeft;
var targetY = e1.pageY - _parentDom.offsetTop;
var originIndex = tempDiv.indexP;
changePosition(originIndex, getTargetIndex(targetX, targetY, originIndex));
isMove = false;
}
// document.removeEventListener(‘mousemove‘,move,false);
};
}
}
}
function setOption(_obj, _dom, increment, _isAddEvent) {
for (var prop in _obj) {
if (_obj.hasOwnProperty(prop)) {
if (_isAddEvent) {
_dom.addEventListener(prop, _obj[prop], ‘fasle‘)
} else {
_dom.setAttribute(prop, _obj[prop] + increment);
}
}
}
}
function getTargetIndex(_x, _y, _originIndex) {
if (_x < 0 || _x > _parentW || _y < 0 || _y > _parentH) {
return _originIndex;
}
var l = Math.floor(_x / _sonW),
t = Math.floor(_y / _sonH);
var targetIndex = t * _num + l;
return targetIndex;
}
/**
* @param _o _t index 值 改变 自定义属性,,来改变位置
*/
function changePosition(_o, _t) {
var i = Math.floor(_o / _num),
j = _o % _num,
temp;
if (_o === _t) {
setPosition(i, j, arr[_o]);
return;
}
var _tI = Math.floor(_t / _num),
_tJ = _t % _num;
setPosition(i, j, arr[_t]);
arr[_t].indexP = _o;
setPosition(_tI, _tJ, arr[_o]);
arr[_o].indexP = _t;
temp = arr[_t];
arr[_t] = arr[_o];
arr[_o] = temp;
}
function setPosition(_i, _j, _dom) {
_dom.style.left = _j * _sonW + ‘px‘;
_dom.style.top = _i * _sonH + ‘px‘;
}
}
原文:https://www.cnblogs.com/guyuedashu/p/11738994.html