欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS實現圖片拖拽交換效果

 更新時間:2018年11月30日 14:56:55   作者:偽偽的喵喵  
這篇文章主要為大家詳細介紹了JS實現圖片拖拽交換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下

JS實現圖片拖拽交換效果,供大家參考,具體內容如下

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

實現要點

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

注意點

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

小技巧

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

實現

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?定義自己的ajax函數

    使用JavaScript?定義自己的ajax函數

    這篇文章主要為大家介紹了JavaScript定義ajax函數,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>
    2021-11-11
  • 理解Javascript_02_理解undefined和null

    理解Javascript_02_理解undefined和null

    其實在 ECMAScript 的原始類型中,是有Undefined 和 Null 類型的。 這兩種類型都分別對應了屬于自己的唯一專用值,即undefined 和 null。
    2010-10-10
  • 詳解JavaScript基于面向對象之繼承實例

    詳解JavaScript基于面向對象之繼承實例

    這篇文章主要介紹了JavaScript基于面向對象之繼承實例,需要的朋友可以參考下
    2015-12-12
  • js將滾動條滾動到指定位置的簡單實現方法

    js將滾動條滾動到指定位置的簡單實現方法

    下面小編就為大家?guī)硪黄猨s將滾動條滾動到指定位置的簡單實現方法。小編覺得挺不錯的, 現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • 原生Javascript和jQuery做輪播圖簡單例子

    原生Javascript和jQuery做輪播圖簡單例子

    這篇文章主要為大家詳細介紹了原生Javascript和jQuery做輪播圖簡單例子,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • BootStrap與Select2使用小結

    BootStrap與Select2使用小結

    這個select2組件的功能確實很強大,可以將圖片放入到select里面隨著文字一起顯示。接下來通過本文給大家分享BootStrap與Select2使用小結,需要的朋友參考下
    2017-02-02
  • JS中生成隨機數的用法及相關函數

    JS中生成隨機數的用法及相關函數

    這篇文章主要為大家介紹了JS中生成隨機數的用法,為大家提供了相關函數的使用方法,感興趣的朋友可以參考一下
    2016-01-01
  • JS庫之wow.js使用方法

    JS庫之wow.js使用方法

    近日,在做項目中,需要做到滾動條滑到某個位置時,才能顯示動畫,網上查詢到有個wow.js可以達到要求,現在把使用方法做如下總結,需要的朋友參考下吧
    2017-09-09
  • 如何基于filter實現網站整體變灰功能

    如何基于filter實現網站整體變灰功能

    這篇文章主要介紹了如何基于filter實現網站整體變灰功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 微信小程序tabBar 返回tabBar不刷新頁面

    微信小程序tabBar 返回tabBar不刷新頁面

    這篇文章主要介紹了微信小程序tabBar 返回tabBar不刷新頁面,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07

最新評論