<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div {
100px;
height: 100px;
text-align: center;
line-height: 100px;
border: 1px solid red;
margin-right: 15px;
}
</style>
</head>
<body>
<div class="d1" draggable="true">div1</div>
<div draggable="true" class="d2">div2</div>
<div draggable="true" class="d3">div3</div>
<div draggable="true" class="d4">div4</div>
<div draggable="true" class="d5">div5</div>
</body>
<script>
var div = document.getElementsByTagName('div')
var container = null; // 存放拖拽元素的容器
for (let i = 0; i < div.length; i++) {
// 开始拖拽时把元素用容器存放
div[i].ondragstart = function () {
container = this;
}
// 默认当我dragover的时候会阻止我做drop操作,这里取消默认事件
div[i].ondragover = function (e) {
e.preventDefault()
}
// 当拖动结束的时候,给拖动的div所在位置的下面的div做drop事件
div[i].ondrop = function () {
if (container != null && container != this) {
let temp = document.createElement('div')
document.body.replaceChild(temp, this)
document.body.replaceChild(this, container)
document.body.replaceChild(container, temp)
}
}
}
</script>
</html>
再来一个参考
<!DOCTYPE html>
<html>
<head>
<title></title>
<style>
body {
margin: 0;
}
.box {
display: flex;
justify-content: flex-start;
flex-wrap: wrap;
}
.card {
flex: 1;
min- 26%;
max- calc(33.3% - 40px);
height: 200px;
margin: 30px 10px;
position: relative;
padding: 10px;
box-shadow: 0 2px 5px 0 #999;
border-radius: 5px;
border: 2px dashed transparent;
}
.card-name {
position: absolute;
top: 10px;
left: 10px;
line-height: 20px;
height: 20px;
}
.card-img {
position: relative;
padding-top: 20px;
box-sizing: border-box;
100%;
height: 100%;
overflow: hidden;
}
.card-img img {
100%;
height: 100%;
}
.dragging-over * {
pointer-events: none;
}
</style>
</head>
<body>
<div class="box">
</div>
</body>
<script>
const htmlArr = [
{ title: '示例1-风景', src: 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2756575517,833879878&fm=200&gp=0.jpg' },
{ title: '示例2-风景', src: 'https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=328517395,2303970886&fm=26&gp=0.jpg' },
{ title: '示例3-风景', src: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1554369684535&di=1c1dbfbd4545ad0a05e12cbbbfe3eeef&imgtype=0&src=http%3A%2F%2Fpic41.nipic.com%2F20140601%2F18681759_143805185000_2.jpg' },
{ title: '示例4-风景', src: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1554369684534&di=d6e34af6fce6564f9df6c4eecc27d2ce&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimgad%2Fpic%2Fitem%2F4d086e061d950a7b9138ff1000d162d9f3d3c9d1.jpg' },
]
let fromDom = null,
toDom = null,
lastDom = null;
function handleDragStart(e, dom) {
lastDom = fromDom = dom;
dom.style.border = "2px dashed #999";
dom.style.opacity = 0.4;
}
function handleDrop(e, dom) {
//只有在可放置的元素上面松开鼠标才会触发drop事件
console.log('drop');
dom.style.opacity = "";
fromDom = null;
toDom = null;
}
function handleDragEnd(e, dom) {
//拖拽时松开鼠标就会会触发dragend事件
console.log('end');
dom.style.border = "2px dashed transparent";
dom.style.opacity = "";
toDom = null;
}
function handleDragEnter(e, dom) {
toDom = dom;
if (fromDom == lastDom) {
//第一次调换
swapDom(lastDom, toDom);
lastDom = toDom;
} else {
//第N+1次调换,要先把上一个div的东西还原回去,再跟第三个div互换
//这个防止enter多次触发
if (lastDom == toDom) { return; }
swapDom(fromDom, lastDom);
swapDom(fromDom, toDom);
lastDom = toDom;
}
}
function handleDragOver(e, dom) {
//默认无法把元素放置到其他元素当中,所以需要prevent
e.preventDefault();
e.dataTransfer.effectAllowed = "move";
}
function swapDom(a, b) {
//a和b的innerHTML互换
let temp = a.innerHTML;
a.innerHTML = b.innerHTML;
b.innerHTML = temp;
}
//生成dom结构
function createDom(arr) {
let body = document.getElementsByClassName('box')[0];
let html = [];
for (let i = 0, len = arr.length; i < len; i++) {
html.push(template(arr[i].title, arr[i].src));
}
body.innerHTML = html.join('');
}
//html模板,根据该模板动态生成dom节点
function template(title, src) {
let tpl = `<div class="card" draggable="true" ondragstart="handleDragStart(event,this)" ondragover="handleDragOver(event,this)" ondragend="handleDragEnd(event,this)" ondrop="handleDrop(event,this)" ondragenter="handleDragEnter(event,this)">
<span class="card-name">
${title}
</span>
<div class="card-img">
<img src="${src}" draggable="false" alt="">
</div>
</div>`
return tpl;
}
window.onload = function () {
createDom(htmlArr);
}
</script>
</html>