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

首頁 > 編程 > JavaScript > 正文

javascript動畫之模擬拖拽效果篇

2019-11-20 08:52:35
字體:
來源:轉載
供稿:網友

先看看實現效果圖, 模擬拖拽最終效果和在桌面上移動文件夾的效果類似

原理介紹

鼠標按下時,拖拽開始。鼠標移動時,被拖拽元素跟著鼠標一起移動。鼠標抬起時,拖拽結束

所以,拖拽的重點是確定被拖拽元素是如何移動的

假設,鼠標按下時,鼠標對象的clientX和clientY分別為x1和x2。元素距離視口左上角x軸和y軸分別為x0和y0

鼠標移動的某一時刻,clientX和clientY分別為x2和y2

所以,元素移動的x軸和y軸距離分別為x2-x1和y2-y1

元素移動后,元素距離視口左上角x軸和y軸的位置分別為

 X = x0 + (x2-x1) Y = y0 + (y2-y1)

代碼實現

  將上面的原理用代碼實現如下

  鼠標按下時,初始態的x0和y0分別用offsetLeftoffsetTop表示

  鼠標移動時,瞬時態的x和y分別賦值為定位后元素的left和top

<div id="test" style="height: 100px;width: 100px;background:pink;position:absolute;top:0;left:0;"></div><script>test.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; test.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);  //將X和Y的值賦給left和top,使元素移動到相應位置  test.style.left = X + 'px';  test.style.top = Y + 'px'; } test.onmouseup = function(e){  //當鼠標抬起時,拖拽結束,則將onmousemove賦值為null即可  test.onmousemove = null; }}</script>

代碼優化

  使用上面的代碼時,會出現一個問題。當鼠標拖動的太快,比onmousemove事件的觸發間隔還要快時,鼠標就會從元素上離開。這樣就停止了元素的拖拽過程

  此時,如果把mousemovemouseup事件都加在document上時,即可解決

<div id="test" style="height: 100px;width: 100px;background:pink;position:absolute;top:0;left:0;"></div><script>test.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; 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);  //將X和Y的值賦給left和top,使元素移動到相應位置  test.style.left = X + 'px';  test.style.top = Y + 'px'; } document.onmouseup = function(e){  //當鼠標抬起時,拖拽結束,則將onmousemove賦值為null即可  document.onmousemove = null; }}</script>

拖拽沖突

  由于文字和圖片默認支持原生拖放,如果將原生拖放和模擬拖拽摻雜在一起,將造成與預想效果不符的情況

  如果拖放的元素內容存在文字,且文字被選中會觸發文字的原生拖放效果

  在文字上面雙擊鼠標,即可選中文字,再移動鼠標時,會觸發文字的原生拖放效果,如下所示

  只要在onmousedown事件阻止瀏覽器的默認行為即可

<div id="test" style="height: 100px;width: 100px;background:pink;position:absolute;top:0;left:0;">測試文字</div><script>test.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; 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);  //將X和Y的值賦給left和top,使元素移動到相應位置  test.style.left = X + 'px';  test.style.top = Y + 'px'; } document.onmouseup = function(e){  //當鼠標抬起時,拖拽結束,則將onmousemove賦值為null即可  document.onmousemove = null; } //阻止默認行為 return false;}</script>

IE兼容

  以上代碼在IE8-瀏覽器中仍然無法阻止默認行為。此時,為了實現IE兼容,需要使用全局捕獲setCapture()和釋放捕獲releaseCapture()

  首先,先看一下全局捕獲的效果

  下面代碼中,開啟全局捕獲之后,頁面中的所有點擊效果,都相當于針對按鈕一的點擊效果。釋放捕獲后,效果消失

  [注意]IE瀏覽器完全支持全局捕獲;chrome不支持,使用全局捕獲會報錯;firefox不報錯,但靜默失敗

<button id="btn1">按鈕一</button><button id="btn2">開啟按鈕一的全局捕獲</button><script>btn1.onclick = function(){ alert(1);}btn2.onclick = function(){ if(btn1.setCapture){  if(btn2.innerHTML.charAt(0) == '開'){   btn1.setCapture();   btn2.innerHTML = '關閉按鈕一的全局捕獲';  }else{   btn1.releaseCapture();   btn2.innerHTML = '開啟按鈕一的全局捕獲';   } }}</script>

  通過在IE瀏覽器設置全局捕獲來達到取消文字原生拖放的默認行為

<div id="test" style="height: 100px;width: 100px;background:pink;position:absolute;top:0;left:0;">測試文字</div><script>test.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; 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);  //將X和Y的值賦給left和top,使元素移動到相應位置  test.style.left = X + 'px';  test.style.top = Y + 'px'; } document.onmouseup = function(e){  //當鼠標抬起時,拖拽結束,則將onmousemove賦值為null即可  document.onmousemove = null;  //釋放全局捕獲  if(test.releaseCapture){   test.releaseCapture();  } } //阻止默認行為 return false; //IE8-瀏覽器阻止默認行為 if(test.setCapture){  test.setCapture(); }}</script>

總結

以上就是Javascript模擬拖拽的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 都匀市| 青浦区| 和硕县| 望江县| 永和县| 隆尧县| 田林县| 平阳县| 读书| 高邑县| 丹江口市| 苏尼特左旗| 阜新| 宁南县| 泸水县| 德昌县| 龙里县| 西藏| 开远市| 阜南县| 龙门县| 酒泉市| 黄山市| 潢川县| 永清县| 邹城市| 余干县| 陆川县| 台湾省| 化德县| 双鸭山市| 肥东县| 搜索| 兴隆县| 台中县| 舞钢市| 法库县| 永新县| 永安市| 宁强县| 武平县|