最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript動畫之磁性吸附效果篇

 更新時間:2016年12月09日 15:29:00   作者:小火柴的藍色理想  
在實際應用中,常常需要為拖拽的元素限定范圍。而通過限定范圍,再增加一些輔助的措施,就可以實現(xiàn)磁性吸附的效果。本文將詳細介紹javascript的磁性吸附,有需要的朋友可以參考借鑒。

前面的話

上一篇,我們介紹了javascript動畫之模擬拖拽效果篇。但在實際應用中,常常需要為拖拽的元素限定范圍。而通過限定范圍,再增加一些輔助的措施,就可以實現(xiàn)磁性吸附的效果

范圍限定

  如果我們限定元素只可以在可視范圍內移動,那么就需要對其進行范圍限定

  首先,先要搞清楚是可視區(qū)域限定被拖拽元素

  左側范圍L0 = 0

  右側范圍R0 = document.documentElement.clientWidth

  上側范圍T0 = 0

  下側范圍B0 = document.documentElement.clientHeight

  元素的上下左右四邊分別為

  左側邊 L = offsetLeft

  右側邊 R = offsetLeft + offsetWidth

  上側邊 T = offsetTop

  下側邊 B = offsetTop + offsetHeight

function limitedRange(obj,fn){
  var L0 = 0;
  var R0 = document.documentElement.clientWidth;
  var T0 = 0;
  var B0 = document.documentElement.clientHeight;
  var L = obj.offsetLeft;
  var R = obj.offsetLeft + obj.offsetWidth;
  var T = obj.offsetTop;
  var B = obj.offsetTop + obj.offsetHeight;
  if(L >= L0 && R <= R0 && T >= T0 && B <= B0){
    fn(obj);
  }
}

拖拽范圍

如果將范圍限定用在拖拽元素上,則需要一些改變

首先,限定條件并不是在范圍內執(zhí)行什么,而是不在范圍內時,應該執(zhí)行什么

由于在拖拽實現(xiàn)中,已經獲取了元素距離可視區(qū)域左上角的X軸和Y軸的距離,所以不需要再通過offsetLeft和offsetTop進行重新獲取

<div id="test" style="height: 100px;width: 100px;background:pink;position:absolute;top:0;left:0;">測試文字</div>
<script>
function drag(obj){
  obj.onmousedown = function(e){
    e = e || event;
    //獲取元素距離定位父級的x軸及y軸距離
    var x0 = this.offsetLeft;
    var y0 = this.offsetTop;
    //獲取此時鼠標距離視口左上角的x軸及y軸距離
    var x1 = e.clientX;
    var y1 = e.clientY;
    //鼠標按下時,獲得此時的頁面區(qū)域
    var L0 = 0;
    var R0 = document.documentElement.clientWidth;
    var T0 = 0;
    var B0 = document.documentElement.clientHeight;
    //鼠標按下時,獲得此時的元素寬高
    var EH = obj.offsetHeight;
    var EW = obj.offsetWidth;
    document.onmousemove = function(e){
      e = e || event;
      //獲取此時鼠標距離視口左上角的x軸及y軸距離
      x2 = e.clientX;
      y2 = e.clientY;  
      //計算此時元素應該距離視口左上角的x軸及y軸距離
      var X = x0 + (x2 - x1);
      var Y = y0 + (y2 - y1);
      /******范圍限定*******/
      //獲取鼠標移動時元素四邊的瞬時值
      var L = X;
      var R = X + EW;
      var T = Y;
      var B = Y + EH;
      //在將X和Y賦值給left和top之前,進行范圍限定
      //只有在范圍內時,才進行相應的移動
      //如果脫離左側范圍,則left置L0
      if(L < L0){X = L0;}
      //如果脫離右側范圍,則left置為R0
      if(R > R0){X = R0 - EW;}
      //如果脫離上側范圍,則top置T0
      if(T < T0){Y = T0;}
      //如果脫離下側范圍,則top置為B0
      if(B > B0){Y = B0 - EH;}
      obj.style.left = X + 'px';
      obj.style.top = Y + 'px';
    }
    document.onmouseup = function(e){
      //當鼠標抬起時,拖拽結束,則將onmousemove賦值為null即可
      document.onmousemove = null;
      //釋放全局捕獲
      if(obj.releaseCapture){
        obj.releaseCapture();
      }
    }
    //阻止默認行為
    return false;
    //IE8-瀏覽器阻止默認行為
    if(obj.setCapture){
      obj.setCapture();
    }
  }  
}
drag(test);
</script>

磁性吸附

磁性吸附只需要在范圍限定的基礎上,做一些修改即可

下列代碼中,只要元素的四邊,距離可視區(qū)域范圍的四邊小于50px,則元素將直接吸附對應的邊上

<div id="test" style="height: 100px;width: 100px;background:pink;position:absolute;top:0;left:0;">測試文字</div>
<script>
function drag(obj){
  obj.onmousedown = function(e){
    e = e || event;
    //獲取元素距離定位父級的x軸及y軸距離
    var x0 = this.offsetLeft;
    var y0 = this.offsetTop;
    //獲取此時鼠標距離視口左上角的x軸及y軸距離
    var x1 = e.clientX;
    var y1 = e.clientY;
    //鼠標按下時,獲得此時的頁面區(qū)域
    var L0 = 0;
    var R0 = document.documentElement.clientWidth;
    var T0 = 0;
    var B0 = document.documentElement.clientHeight;
    //鼠標按下時,獲得此時的元素寬高
    var EH = obj.offsetHeight;
    var EW = obj.offsetWidth;
    document.onmousemove = function(e){
      e = e || event;
      //獲取此時鼠標距離視口左上角的x軸及y軸距離
      x2 = e.clientX;
      y2 = e.clientY;  
      //計算此時元素應該距離視口左上角的x軸及y軸距離
      var X = x0 + (x2 - x1);
      var Y = y0 + (y2 - y1);
      /******磁性吸附*******/
      //獲取鼠標移動時元素四邊的瞬時值
      var L = X;
      var R = X + EW;
      var T = Y;
      var B = Y + EH;
      //在將X和Y賦值給left和top之前,進行范圍限定
      //只有在范圍內時,才進行相應的移動
      //如果到達左側的吸附范圍,則left置L0
      if(L - L0 < 50){X = L0;}
      //如果到達右側的吸附范圍,則left置為R0
      if(R0 - R < 50){X = R0 - EW;}
      //如果到達上側的吸附范圍,則top置T0
      if(T - T0 < 50){Y = T0;}
      //如果到達右側的吸附范圍,則top置為B0
      if(B0 - B < 50){Y = B0 - EH;}
      obj.style.left = X + 'px';
      obj.style.top = Y + 'px';
    }
    document.onmouseup = function(e){
      //當鼠標抬起時,拖拽結束,則將onmousemove賦值為null即可
      document.onmousemove = null;
      //釋放全局捕獲
      if(obj.releaseCapture){
        obj.releaseCapture();
      }
    }
    //阻止默認行為
    return false;
    //IE8-瀏覽器阻止默認行為
    if(obj.setCapture){
      obj.setCapture();
    }
  }  
}
drag(test);
</script>

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關文章

最新評論

福海县| 龙游县| 梁山县| 鹤壁市| 莎车县| 泗洪县| 丹江口市| 淮南市| 惠东县| 民权县| 益阳市| 卫辉市| 乌拉特中旗| 玉屏| 谢通门县| 荃湾区| 禹城市| 新田县| 西和县| 蕲春县| 卓尼县| 张家口市| 焦作市| 龙海市| 永康市| 威海市| 额济纳旗| 观塘区| 镇宁| 永昌县| 巩留县| 紫金县| 景谷| 阳春市| 津市市| 探索| 永胜县| 肃宁县| 孝义市| 铜梁县| 咸宁市|