亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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模擬拖拽的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人短视频| 97在线视频一区| 亚洲精品国产拍免费91在线| 福利二区91精品bt7086| 久久精品美女视频网站| 性欧美长视频免费观看不卡| 亚洲综合精品伊人久久| 91精品综合视频| 久久躁狠狠躁夜夜爽| 久久久精品亚洲| 日本伊人精品一区二区三区介绍| 亚洲xxxxx电影| 热久久这里只有精品| 亚洲精品99999| 亚洲天堂男人天堂女人天堂| 成人网页在线免费观看| 亚洲精品电影网在线观看| 国产色婷婷国产综合在线理论片a| 精品免费在线视频| 国产中文欧美精品| 欧美大码xxxx| 精品国产一区久久久| 国产精品久久国产精品99gif| 精品国产成人在线| 欧美一区二区三区免费视| 日韩在线视频线视频免费网站| 一区二区中文字幕| 亚洲最大福利网| 国产精品久久久久久av下载红粉| 色婷婷综合成人| 欧美日韩国产精品| 97香蕉超级碰碰久久免费的优势| 久久久久久久一区二区| 久久久之久亚州精品露出| 国产精品视频最多的网站| 97在线免费观看视频| 亚洲www视频| 成人黄色中文字幕| 亚洲高清一区二| 国产伦精品一区二区三区精品视频| 欧洲日本亚洲国产区| 国产日韩欧美中文| 91久久精品国产| 亚洲国产另类久久精品| 国产欧美日韩最新| 亚洲国产精品悠悠久久琪琪| 97超碰国产精品女人人人爽| 成人黄色免费网站在线观看| 欧美成人性色生活仑片| 亚洲精品久久在线| 国产精品成人v| 欧美激情在线视频二区| 欧美亚洲日本网站| 亚洲欧洲日产国码av系列天堂| 国产日韩换脸av一区在线观看| 久久久久久久国产精品视频| 久久夜精品va视频免费观看| 亚洲黄页视频免费观看| 高清欧美一区二区三区| 日韩欧美成人精品| 亚洲精品suv精品一区二区| 欧美日韩午夜激情| 久久久久久久久久久av| 精品久久国产精品| 国产精品主播视频| 久久精品视频在线| 中文字幕九色91在线| 日韩在线观看免费高清完整版| 日韩免费视频在线观看| 国产丝袜一区二区三区免费视频| 色与欲影视天天看综合网| 中文字幕成人在线| 1769国内精品视频在线播放| 欧美—级a级欧美特级ar全黄| 欧美视频在线看| 欧美成aaa人片在线观看蜜臀| 久久免费视频在线| 国产精品免费电影| 国产亚洲精品久久久久久777| 欧美日韩中文字幕在线视频| 成人夜晚看av| 色哟哟网站入口亚洲精品| 在线亚洲国产精品网| 日韩av免费观影| 欧美福利小视频| 久久九九全国免费精品观看| 精品动漫一区二区三区| 欧美精品videosex牲欧美| 91情侣偷在线精品国产| 国产精品亚洲自拍| 中文字幕一区日韩电影| 在线观看91久久久久久| 91视频88av| 2025国产精品视频| 久久久久www| 91av在线国产| 亚洲精品中文字幕女同| 97国产真实伦对白精彩视频8| 亚洲精品有码在线| 麻豆精品精华液| 91国产视频在线播放| 亚洲精品视频久久| 国产精品男女猛烈高潮激情| 亚洲国产日韩欧美在线图片| 国产日韩欧美在线| 91日本在线观看| 色偷偷噜噜噜亚洲男人的天堂| 中文字幕日韩电影| www.日韩欧美| 一区二区日韩精品| 黑人极品videos精品欧美裸| 91精品国产高清久久久久久久久| 国产香蕉97碰碰久久人人| 精品视频偷偷看在线观看| 国产精品视频99| 亚洲综合av影视| 不卡av在线播放| 欧美成人在线免费视频| 欧美日韩成人网| 岛国av一区二区三区| 国产精品视频男人的天堂| 国产精品男人爽免费视频1| 久久免费成人精品视频| 久久深夜福利免费观看| 国产美女久久久| 2025国产精品视频| 日韩免费观看视频| 久久国产精品影片| 亚洲午夜精品久久久久久性色| 欧美自拍视频在线观看| 国产午夜精品全部视频在线播放| 久久中文字幕在线视频| 精品网站999www| 久久精品国产欧美激情| 精品无人区乱码1区2区3区在线| 国产剧情日韩欧美| 国产精品久久久久久久av电影| 国产日韩精品在线播放| 亚洲电影免费观看高清完整版在线观看| 国产精品久久久久久久久| 欧美日韩亚洲精品内裤| 影音先锋欧美在线资源| 国产精品一区二区av影院萌芽| 欧美日韩国产91| 久久人人爽人人爽人人片亚洲| 日本一欧美一欧美一亚洲视频| 精品国产乱码久久久久久婷婷| 丝袜美腿亚洲一区二区| 久久999免费视频| 欧美成人免费播放| 91高清在线免费观看| 欧美乱大交做爰xxxⅹ性3| 国产精品九九久久久久久久| 亚洲欧美一区二区激情| 日韩av成人在线| 91地址最新发布| 成人激情综合网| 欧美日韩久久久久| www.亚洲天堂| 亚洲精品理论电影| 亚洲的天堂在线中文字幕| 色综合久久中文字幕综合网小说| 亚洲精品久久久久国产| 久久精品一偷一偷国产|