使用Drag随意拖拽图片到页面的任意处:
方案一:
<html>
<head>
<title>Drag</title>
<style type="text/css">
</style>
</head>
<body>
<div id="r" style="position:absolute; left:100px; top:100px; background-color:red; height:80px; width:80px;"></div>
<div id="g" style="position:absolute; left:250px; top:100px; background-color:green; height:80px; width:80px;"></div>
<div id="b" style="position:absolute; left:400px; top:100px; background-color:blue; height:80px; width:80px;"></div>
</body>
<script type="text/javascript">
var Drag = {
//当前被drag的对象
obj: null,
//当前所有可脱拽对象中最大的zIndex;
maxZIndex: 100,
//初始化
init: function (id) {
var o = document.getElementById(id);
//当onmousedown开始拖拽
o.onmousedown = Drag.start;
o.style.zIndex = Drag.maxZIndex;
//alert(Drag.maxZIndex);
Drag.maxZIndex += 1;
},
start: function (e) {
var o = Drag.obj = this;
//lastMouseX,lastMouseY记录上次鼠标的位置
o.lastMouseX = Drag.getEvent(e).x;
o.lastMouseY = Drag.getEvent(e).y;
//提高当前被推拽对象的zIndex使之处于最顶层
o.style.zIndex = Drag.maxZIndex;
Drag.maxZIndex += 1;
//status = o.maxZIndex;
//当onmousemove开始移动
document.onmousemove = Drag.move;
//当onmouseup终止拖拽
document.onmouseup = Drag.end;
},
move: function (e) {
//alert(this.maxZIndex);
var o = Drag.obj;
//dx, dy表示鼠标移动的距离
var dx = Drag.getEvent(e).x - o.lastMouseX;
var dy = Drag.getEvent(e).y - o.lastMouseY;
//因为element.style.left通常返回的结果是'200px'的形式,所以要用parseInt转化
var left = parseInt(o.style.left) + dx;
var top = parseInt(o.style.top) + dy;
o.style.left = left;
o.style.top = top;
o.lastMouseX = Drag.getEvent(e).x;
o.lastMouseY = Drag.getEvent(e).y;
},
end: function (e) {
document.onmousemove = null;
document.onMouseup = null;
Drag.obj = null;
},
//辅助函数,处理IE和FF不同的event模型
getEvent: function (e) {
if (typeof e == 'undefined') {
e = window.event;
}
//alert(e.x?e.x : e.layerX);
if (typeof e.x == 'undefined') {
e.x = e.layerX; //复制了n遍,到了csdn就变成ee.x了
}
if (typeof e.y == 'undefined') {
e.y = e.layerY; //复制了n遍,到了csdn就变成ee.x了
}
return e;
}
};
</script>
<script type="text/javascript">
//测试代码开始,使三个div具有drag and drop的能力。
Drag.init('r');
Drag.init('g');
Drag.init('b');
</script>
</html>
方案一效果图:
方案2:照片墙
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>drag案例的演示</title>
<style>
img {
background: #e54d26;
width: 300px;
height: 200px;
margin: 0;
padding: 0;
}
#cun {
margin: 0;
padding: 0;
width: 602px;
height: 403px;
border: 2px solid #D2D2D2;
box-shadow: 1px 4px 8px #646464;
}
</style>
</head>
<section>
<p>你可以把喜欢的图片拖放到下面的框中!</p>
<p>也可以随意的把拖进来的图片换位置,按自己的喜欢排版</p>
</section>
<div id="cun" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<br />
<img src="banana.jpg" id="tuo1" draggable="true" ondragstart="drag(event)" />
<img src="dog.jpg" id="tuo2" draggable="true" ondragstart="drag(event)" />
<img src="dog2.jpg" id="tuo3" draggable="true" ondragstart="drag(event)" />
<img src="cat.jpg" id="tuo4" draggable="true" ondragstart="drag(event)" />
<script>
function allowDrop(ev) {
//不执行默认处理(拒绝被拖放)
ev.preventDefault();
}
function drag(ev) {
//使用setData(数据类型,携带的数据)
//方法将要拖放的数据存入datatransfer对象
// var dragid = document.getElementById(id).value;
ev.dataTransfer.setData("Text", ev.target.id);
}
function drop(ev) {
//不执行默认处理(拒绝被拖放)
ev.preventDefault();
//使用getData()获取到数据,然后赋值给data
var data = ev.dataTransfer.getData("Text");
//判断target的id是否和下面图片中的id相等的 相等说明是要把两张图片换一下
var flag = 0;
for (var i = 0; i < document.getElementsByTagName("img").length; i++) {
if (document.getElementsByTagName("img")[i].id == ev.target.id) {
flag = 1;
}
}
if (flag == 1) {
var temp = document.getElementById(data).src;
document.getElementById(data).src = document.getElementById(ev.target.id).src;
document.getElementById(ev.target.id).src = temp;
} else {
//使用appendChild方法把拖动的节点放到元素节点中成为他的子节点
ev.target.appendChild(document.getElementById(data));
}
}
</script>
</body>
</html>
方案二效果:
方案三:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1,
maximum-scale=1, user-scalable=no">
<link rel="icon" href="https://xlzy520.cn/icons/lo.ico">
<title>drag</title>
<style>
html,
body {
margin: 0;
padding: 0;
background: #000;
}
#dance {
cursor: pointer;
height: 30px;
width: 30px;
background-color: aqua
}
</style>
</head>
<body ondrop="drop(event)" ondragover="allowDrop(event)" ontouchmove="drop(event) ">
<div class="main">
<img style="position: absolute;left: 0;top: 0;" src="" draggable="true" id="dance" ondragstart="drag(event)"
ontouchstart="drag(event)">
</div>
<script>
(function () {
document.getElementsByTagName('body')[0].style.height = window.innerHeight + 'px'
document.getElementsByTagName('body')[0].style.width = window.innerWidth + 'px'
})()
let dance = document.getElementById('dance')
let dragOffset = {
X1: null,
Y1: null
}
function drag(e) {
if (e.type === 'dragstart') { //根据e.type判断是PC端还是移动端
e = event ? event : e
} else {
if (event.touches) {
e = event.touches[0] ? event.touches[0] : event;
}
}
dragOffset.X1 = e.clientX - parseInt(dance.style.left)
dragOffset.Y1 = e.clientY - parseInt(dance.style.top)
// 鼠标点击的位置在整个页面上的坐标是(e.clientX,e.clientY)
// 鼠标点击的位置在图片的位置坐标为(X1,Y1)
}
function drop(e) {
if (e.type === 'drop') {
e = event ? event : e
e.preventDefault()
} else {
if (event.touches) {
e = event.touches[0] ? event.touches[0] : event;
}
}
dance.style.left = e.clientX - dragOffset.X1 + 'px'
dance.style.top = e.clientY - dragOffset.Y1 + 'px'
// 根据鼠标点击的位置在整个页面上的坐标和在图片上的坐标来确定整个图片的坐标
}
function allowDrop(e) {
e = event ? event : e
// 移动过程中触发
}
document.ondragover = function () {
//取消事件的默认行为
return false;
}
document.ondrop = function () {
//取消事件的默认行为
return false
}
</script>
</body>
</html>
方案三效果图:
案例四:
<!DOCTYPE html>
<html lang="en">
<head>
<title></title>
<style type="text/css">
div>div {
display: inline-block;
padding: 10px;
background-color: #aaa;
margin: 3px;
}
</style>
</head>
<body>
<div style="width:600px;border:1px solid black;">
<h2>可将喜欢的项目拖到收藏夹</h2>
<div draggable="true" ondragstart="dsHandler(event)">勿忘心安</div>
<div draggable="true" ondragstart="dsHandler(event)">照顾自己</div>
<div draggable="true" ondragstart="dsHandler(event)">Number 9</div>
<div draggable="true" ondragstart="dsHandler(event)">崇拜</div>
</div>
<div id="dest" style="width:400px;height:400px;border:1px solid black;float:left;">
<h2 οndragleave="return false;">收藏夹</h2>
</div>
<div id="gb" draggable="false" style="width:100px;height:100px;border:1px solid red;float:left;">我是垃圾桶</div>
<script>
var dest = document.getElementById("dest");
var dsHandler = function (evt) {
evt.dataTransfer.setData("text/plain", "<item>" + evt.target.innerHTML);
console.log(evt.dataTransfer.setData("text/plain", "<item>" + evt.target.innerHTML));
}
dest.ondrop = function (evt) {
var text = evt.dataTransfer.getData("text/plain");
if (text.indexOf("<item>") == 0) {
var newEle = document.createElement("div");
newEle.id = new Date().getUTCMilliseconds();
newEle.innerHTML = text.substring(6);
newEle.draggable = "true";
newEle.ondragstart = function (evt) {
evt.dataTransfer.setData("text/plain", "<remove>" + newEle.id);
console.log(evt.dataTransfer.setData("text/plain", "<remove>" + newEle.id));
}
dest.appendChild(newEle);
}
}
document.getElementById("gb").ondrop = function (evt) {
var id = evt.dataTransfer.getData("text/plain");
if (id.indexOf("<remove>") == 0) {
var target = document.getElementById(id.substring(8));
dest.removeChild(target);
}
}
document.ondragover = function (evt) {
return false;
}
document.ondrop = function (evt) {
return false;
}
</script>
</body>
</html>
效果图:
案例五:
<!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>
.main {
display: flex;
justify-content: space-around;
}
.left {
width: 300px;
height: 500px;
margin-right: 10px;
border: 1px solid red;
text-align: center;
box-sizing: border-box;
padding: 1px;
}
.right {
width: 300px;
height: 500px;
border: 1px solid lightseagreen;
text-align: center;
box-sizing: border-box;
padding: 1px;
}
.txt {
border: 1px solid gray;
margin: 1px;
padding: 5px;
cursor: move;
}
</style>
</head>
<body>
<main class="main">
<div class="left" id="left">
<div class="txt-show">左边区域</div>
<div id='txt1' draggable="true" class="dragable txt txt1">可移动的文字一</div>
<div id='txt2' draggable="true" class="dragable txt txt2">可移动的文字二</div>
<div id='txt3' draggable="true" class="dragable txt txt3">可移动的文字三</div>
<div id='txt4' draggable="true" class="dragable txt txt4">可移动的文字四</div>
<div id='txt5' draggable="true" class="dragable txt txt5">可移动的文字五</div>
</div>
<div class="right" id='right'>
<div class="txt-show">右边区域</div>
</div>
</main>
<script>
let txtObj = document.getElementsByClassName('txt')
for (let i = 0; i < txtObj.length; i++) {
txtObj[i].ondragstart = handle_start
txtObj[i].ondrag = handle_drag
txtObj[i].ondragend = handle_end
}
function handle_start(e) {
e.dataTransfer.setData('Text', e.target.id)
console.log('handle_start-拖动开始')
}
function handle_drag(e) {
console.log('handle_drag-拖动中')
}
function handle_end(e) {
console.log('handle_end-拖动结束')
}
let target = document.getElementById('right')
target.ondragenter = handle_enter
target.ondragover = handle_over
target.ondragleave = handle_leave
target.ondrop = handle_drop
let leftTarget = document.getElementById('left')
leftTarget.ondragenter = handle_enter
leftTarget.ondragover = handle_over
leftTarget.ondragleave = handle_leave
leftTarget.ondrop = handle_drop
function handle_enter(e) {
e.preventDefault()
console.log('handle_enter-进入目的地')
}
function handle_over(e) {
e.preventDefault()
let returnObj = e.dataTransfer.getData('Text')
console.log(returnObj + '-handle_over-在目的地范围内')
}
function handle_leave(e) {
e.preventDefault()
let returnObj = e.dataTransfer.getData('Text')
console.log(returnObj)
console.log('handle_leave-没有放下就离开目的地')
}
function handle_drop(e) {
e.stopPropagation(); // 不再派发事件。解决Firefox浏览器,打开新窗口的问题。
e.preventDefault()
let returnObj = e.dataTransfer.getData('Text')
if (returnObj) {
e.target.appendChild(document.getElementById(returnObj))
}
console.log(returnObj + '-handle_drop-在目的地区释放')
}
</script>
</body>
</html>
效果图五