国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JS實現(xiàn)圖片拖拽交換效果

2024-05-06 15:27:39
字體:
供稿:網(wǎng)友

JS實現(xiàn)圖片拖拽交換效果,供大家參考,具體內(nèi)容如下

聽 WEB前端javascript企業(yè)實戰(zhàn)班 公開課,用JS實現(xiàn)了圖片拖拽交換的目的;感謝老師的講解。

實現(xiàn)要點

鼠標點擊onmousedown:獲取鼠標在頁面上可視區(qū)域的位置(clientX, clientY)和元素外邊框距已定位父元素容器的位置(offsetLeft,offsetTop); 鼠標移動onmousemove: 獲取鼠標在頁面上可視區(qū)域的位置(clientX, clientY),并實時改變目標元素位置;進行碰撞檢測,同時計算被碰撞元素與目標元素中心點距離,將距離最小的定位交換元素; 鼠標釋放onmouseup: 進行元素交換

注意點

排除沒有碰撞成功的情況,進行特殊討論; 覆蓋html5原有的圖片拖拽功能,通過return false返回; 交換時同時勿忘記交換圖片的索引;

小技巧

進行碰撞檢測時,可以進行逆向思維,檢測未碰撞的情況,即判斷目標元素是否超過碰撞元素的邊界(如:目標元素的右側(cè)是否超過被碰撞元素的左側(cè)) 計算元素中心位置時,可以改為計算元素左上角之間的距離,從而轉(zhuǎn)變?yōu)橛嬎?offsetLeft1,offsetTop1)(offsetLeft1,offsetTop1)與(offsetLefti(offsetLefti, offsetTopi)offsetTopi)的距離,以簡化計算;

實現(xiàn)

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);    }            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 中卫市| 洛隆县| 荔浦县| 玛纳斯县| 行唐县| 北安市| 宝鸡市| 泰安市| 信阳市| 巫山县| 东乌珠穆沁旗| 平江县| 无为县| 黄梅县| 中方县| 灌云县| 双鸭山市| 武冈市| 岢岚县| 金川县| 曲麻莱县| 随州市| 定安县| 东海县| 紫金县| 上饶县| 云浮市| 周口市| 临猗县| 漳平市| 宜春市| 柳河县| 深水埗区| 南京市| 海淀区| 通城县| 昭觉县| 巴马| 万荣县| 万荣县| 共和县|