js实现图片拖拽交换效果,供大家参考,具体内容如下
听 web前端javascript企业实战班 公开课,用js实现了图片拖拽交换的目的;感谢老师的讲解。
实现要点
注意点
小技巧
实现
html
<div id="photo"> <ul> <li><img src="" alt=""></li> <li><img src="" alt=""></li> <li><img src="" alt=""></li> <li><img src="" alt=""></li> <li><img src="" alt=""></li> <li><img src="" alt=""></li> <li><img src="" alt=""></li> <li><img src="" alt=""></li> <li><img src="" alt=""></li> </ul> </div>
css
* { margin:0; padding: 0; } body { user-select: none; /*阻止文本选中*/ } #photo { width: 600px; height: 600px; border: 2px solid #000; margin: 20px auto; } #photo ul li { list-style:none; width: 180px; height: 180px; margin: 10px; float: left; } #photo ul li:hover { background: #c0c; } #photo ul li img { width: 180px; height: 180px; border: 1px solid #ccc; }
js
var photo = document.getelementbyid("photo"); var oul = photo.getelementsbytagname("ul")[0]; var ali = oul.getelementsbytagname("li"); var z = 2; var arr = []; for (var i = 0; i < ali.length; i++) { arr.push([ali[i].offsetleft, ali[i].offsettop]); } for (var i = 0; i < ali.length; i++) { ali[i].style.position = "absolute"; ali[i].style.left = arr[i][0] + "px"; ali[i].style.top = arr[i][1] + "px"; ali[i].style.margin = 0; } for (var i = 0; i < ali.length; i++) { ali[i].index = i; drag(ali[i]); } function drag(obj) { obj.onmousedown = function(ev) { ev = ev || window.ev; var x = ev.clientx; var y = ev.clienty; var l = obj.offsetleft; var t = obj.offsettop; this.style.zindex = z++; document.onmousemove = function(ev) { ev = ev || window.ev; var _left = ev.clientx - x + l; var _top = ev.clienty - y + t; obj.style.left = _left + "px"; obj.style.top = _top + "px"; var li = near(obj); for (var i = 0; i < ali.length; i++) { ali[i].style.background = ""; } if (li) { li.style.background = "#df971f"; } } document.onmouseup = function() { document.onmousemove = null; document.onmousedown = null; var nearli = near(obj); var tmp = 0; if (nearli) { move(nearli, {left:arr[obj.index][0], top:arr[obj.index][1]}); move(obj, {left:arr[nearli.index][0], top:arr[nearli.index][1]}); nearli.style.background = ""; tmp = obj.index; obj.index = nearli.index; nearli.index = tmp; } else { move(obj, {left:arr[obj.index][0], top:arr[obj.index][1]}); } } return false; } } function impact(obj1, obj2) { var l1 = obj1.offsetleft; var r1 = obj1.offsetleft + obj1.offsetwidth; var t1 = obj1.offsettop; var b1 = obj1.offsettop + obj1.offsetheight; var l2 = obj2.offsetleft; var r2 = obj2.offsetleft + obj2.offsetwidth; var t2 = obj2.offsettop; var b2 = obj2.offsettop + obj2.offsetheight; if (l2 > r1 || t2 > b1 || r2 < l1 || b2 < t1) { return false; } else { return true; } } function near(obj) { var tmp = 5000; var oli = ''; for (var i = 0; i < ali.length; i++) { if (impact(obj, ali[i]) && obj != ali[i]) { var c = discalc(obj, ali[i]); if (tmp > c) { tmp = c; oli = ali[i]; } } } return oli; } function discalc(obj1, obj2) { var x = obj1.offsetleft - obj2.offsetleft; var y = obj1.offsettop - obj2.offsettop; return math.sqrt(x * x + y * y); }
move.js
function move(obj, json, endfn) { clearinterval(obj.timer); obj.timer = setinterval(function() { var bbtn = true; for (var attr in json) { var icur = 0; if (attr == 'opacity') { if (math.round(parsefloat(getstyle(obj,attr)) * 100) == 0) { icur = math.round(parsefloat(getstyle(obj,attr)) * 100); } else { icur = math.round(parsefloat(getstyle(obj,attr)) * 100) || 100; } } else { icur = parseint(getstyle(obj,attr)) || 0; } var ispeed = (json[attr] - icur) / 8; ispeed = ispeed >0 ? math.ceil(ispeed) : math.floor(ispeed); if (icur != json[attr]) { bbtn = false; } if (attr == 'opacity') { obj.style.filter = 'alpha(opacity=' +(icur + ispeed)+ ')'; obj.style.opacity = (icur + ispeed) / 100; } else { obj.style[attr] = icur + ispeed + 'px'; } } if (bbtn) { clearinterval(obj.timer); if (endfn) { endfn.call(obj); } } }, 30); } function getstyle(obj, attr) { if (obj.currentstyle) { return obj.currentstyle[attr]; } else { return getcomputedstyle(obj, false)[attr]; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问, 点击进行留言回复!!
JavaScript 好题汇总分享(持续更新,看到好题就写)
XMLHttpRequest 2级 &&进度事件&&JSONP
使用递归原生实现拷贝&&最简单的方法实现深拷贝
网友评论