日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

手机端touch事件实现元素拖拽效果

發布時間:2023/12/13 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 手机端touch事件实现元素拖拽效果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這段時間在做一個手機相冊的效果,然后網上各種搜,而結果不盡人意,后來我突然想手機事件是否可以自己寫,就開始從拖拽做起了

我先從網上搜到了一份手機的touchstart和touchmove的方法。如下:

                //touchstart事件  
		function touchSatrtFunc(e) {  
		    e.preventDefault(); //阻止觸摸時瀏覽器的縮放、滾動條滾動等  
		    var touch = e.touches[0]; //獲取第一個觸點  
		    var x = Number(touch.pageX); //頁面觸點X坐標  
		    var y = Number(touch.pageY); //頁面觸點Y坐標
		    //記錄觸點初始位置  
		    startX = x;
		    startY = y;
		}  
		//touchmove事件 
		function touchMoveFunc(e) {  
		    e.preventDefault(); //阻止觸摸時瀏覽器的縮放、滾動條滾動等
		    var touch = e.touches[0]; 	//獲取第一個觸點  
		    var x = Number(touch.pageX); //頁面觸點X坐標  
		    var y = Number(touch.pageY); //頁面觸點Y坐標 

		   
		    //判斷滑動方向  
		    if (x - startX != 0) {
		    	console.log('左右滑動 :' + (x - startX) )//左右滑動 
		    }  
		    if (y - startY != 0) { 
		    	console.log('上下滑動 : '+ (y - startY) ) //上下滑動  
		    } 
		}  

 然后在此基礎上我又寫了需要的html結構代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" name="viewport">
    <style type="text/css">
  	*{margin: 0;padding: 0}
	div{ 100px;height: 100px;background: #f00;position: absolute;top: 5%;left: 5%}
    </style>
</head>
<body>
	<input type="text">
	<input type="text">
	<div></div> 
</body>
</html>

  我一開始的思路是:

    1,div實現拖動就要計算出div的left與top

    2,首先我取到觸摸屏幕的點的坐標

    3,其次我通過觸摸屏幕點的坐標和div的offsetTop與offsetLeft計算出觸摸點相對div頂部邊緣與左側邊緣的距離

    4,最后我用觸摸點的坐標減去觸摸點相對div頂部邊緣與左側邊緣的距離得到div元素的位置坐標賦值,以達到定位div的目的

    5,將touchstart與touchmove事件綁定在document對象上,來實現最終拖動效果

  然后是我依照此思路寫的代碼,如下:

                var oDiv = document.getElementsByTagName('div')[0];       //獲取可拖動元素
		var oIpt = document.getElementsByTagName('input')[0];     //記錄拖動元素位置   
		var oIpt1 = document.getElementsByTagName('input')[1];     //記錄觸點位置  
		var oL,oT;
		//touchstart事件  
		function touchSatrtFunc(e) {  
		    e.preventDefault(); //阻止觸摸時瀏覽器的縮放、滾動條滾動等  
		    var touch = e.touches[0]; //獲取第一個觸點  
		    var x = Number(touch.pageX); //頁面觸點X坐標  
		    var y = Number(touch.pageY); //頁面觸點Y坐標  
		    //記錄觸點初始位置  
		    startX = x;  
		    startY = y;  
		}  
		//touchmove事件 
		function touchMoveFunc(e) {  
		    e.preventDefault(); //阻止觸摸時瀏覽器的縮放、滾動條滾動等   
		    oL = oDiv.offsetLeft;                    		      //可拖動元素距離頁面左側的距離
		    oT = oDiv.offsetTop;                     		      //可拖動元素距離頁面頂部的距離
		    var touch = e.touches[0]; 	//獲取第一個觸點  
		    var x = Number(touch.pageX); //頁面觸點X坐標  
		    var y = Number(touch.pageY); //頁面觸點Y坐標 
		    var sL = x - oL; 		   //獲取頁面觸點距離div左側的距離  
		    var sT = y - oT;           //獲取頁面觸點距離div頂部的距離
		    oDiv.style.left = (x-sL) +'px';
		    oDiv.style.top = (y-sT)+'px';
		    alert(e.touches.length)

		    oIpt1.value = "觸點位置:" +x +":"+y;
		    oIpt.value = "元素位置:"+oL+":"+oT+","+sL+":"+sT;
		}  
    	oDiv.addEventListener('touchstart',touchSatrtFunc,false); 
    	oDiv.addEventListener('touchmove',touchMoveFunc,false);      

  然而實際測試時,這個出現了很大的問題,最主要的div拖動效果一點反應也沒有,一開始可是愁苦了我,我一直在想沒怎么回事,然而一直沒有尋到問題所在。

  這個時候經過請教,修改后的思路:

    1,首先在touchstart時得到div的offsetTop與offsetLeft的值

    2,然后計算出touchmove時的實時觸摸坐標和一開始touchstart時的坐標的差值坐標

    3,將差值坐標與一開始touchstart時的div的offsetTop和offsetLeft相加得到新的div的位置坐標

    4,將touchstart與touchmove事件綁定在div元素上

  具體代碼如下:

           var oDiv = document.getElementsByTagName('div')[0],        //獲取可拖動元素
		oIpt = document.getElementsByTagName('input')[0],          //記錄拖動元素位置 
		oIpt1 = document.getElementsByTagName('input')[1],         //記錄觸點位置  
	        startX = "",
	        startY = "",
	        startPositionX = "",
	        startPositionY = "";
		//touchstart事件  
		function touchSatrtFunc(e) {  
		    e.preventDefault(); //阻止觸摸時瀏覽器的縮放、滾動條滾動等  
		    var touch = e.touches[0]; //獲取第一個觸點  
		    var x = Number(touch.pageX); //頁面觸點X坐標  
		    var y = Number(touch.pageY); //頁面觸點Y坐標
		    //記錄觸點初始位置  
		    startX = x;
		    startY = y;
		    //可拖動元素距離頁面頂部的距離
		    startPositionY = oDiv.offsetTop;
		    //可拖動元素距離頁面左側的距離
		    startPositionX = oDiv.offsetLeft;
		}  
		//touchmove事件 
		function touchMoveFunc(e) {  
		    e.preventDefault(); //阻止觸摸時瀏覽器的縮放、滾動條滾動等
		    var touch = e.touches[0]; 	//獲取第一個觸點  
		    var x = Number(touch.pageX); //頁面觸點X坐標  
		    var y = Number(touch.pageY); //頁面觸點Y坐標 
		    
		    oIpt.value = "元素位置:" +startPositionX +":"+startPositionY;
		    oIpt1.value = "觸點位置:" +x +":"+y;

	    	oDiv.style.left = startPositionX + (x-startX) +'px';
	    	oDiv.style.top = startPositionY + (y-startY)+'px';
	    	// oIpt.value = "元素位置:"+oL+":"+oT+","+sL+":"+sT;
		    //判斷滑動方向  if (x - startX != 0) {console.log('左右滑動 :' + (x - startX) )//左右滑動 }  if (y - startY != 0) { console.log('上下滑動 : '+ (y - startY) ) //上下滑動  //} 
		}  
    	oDiv.addEventListener('touchstart',touchSatrtFunc,false); 
    	oDiv.addEventListener('touchmove',touchMoveFunc,false);

  經過測試,這個能夠完美的執行出我想要的效果。

  然而我依舊被原先的思路所困擾,因此我又從新梳理了一遍我以前的代碼流程,最后終于發現問題所在,問題所在就是(這里只提供水平坐標,縱坐標同理):

    我賦值給div橫坐標的值為:x-sL,然而sL = x - oL;因此最后得到的值為固定的oL,因此我之前寫的div一直無法拖動。

  最后我又對最初代碼進行更改,終于實現了,如下:

                var oDiv = document.getElementsByTagName('div')[0];       //獲取可拖動元素
		var oIpt = document.getElementsByTagName('input')[0];     //記錄拖動元素位置   
		var oIpt1 = document.getElementsByTagName('input')[1];     //記錄觸點位置  
		var oL,oT,sL,sT;
		//touchstart事件  
		function touchSatrtFunc(e) {  
		    e.preventDefault(); //阻止觸摸時瀏覽器的縮放、滾動條滾動等  
		    var touch = e.touches[0]; //獲取第一個觸點  
		    var x = Number(touch.pageX); //頁面觸點X坐標  
		    var y = Number(touch.pageY); //頁面觸點Y坐標  
		    //記錄觸點初始位置  
		    startX = x;  
		    startY = y;  
		    oL = oDiv.offsetLeft;                    		      //可拖動元素距離頁面左側的距離
		    oT = oDiv.offsetTop;                     		      //可拖動元素距離頁面頂部的距離
		    sL = x - oL; 		   //獲取頁面觸點距離div左側的距離  
		    sT = y - oT;           //獲取頁面觸點距離div頂部的距離
		}  
		//touchmove事件 
		function touchMoveFunc(e) {  
		    e.preventDefault(); //阻止觸摸時瀏覽器的縮放、滾動條滾動等   
		    var touch = e.touches[0]; 	//獲取第一個觸點  
		    var x = Number(touch.pageX); //頁面觸點X坐標  
		    var y = Number(touch.pageY); //頁面觸點Y坐標 
		    oDiv.style.left = (x-sL) +'px';
		    oDiv.style.top = (y-sT)+'px';

		    oIpt1.value = "觸點位置:" +x +":"+y;
		    oIpt.value = "元素位置:"+oL+":"+oT+","+sL+":"+sT;
		}  
    	oDiv.addEventListener('touchstart',touchSatrtFunc,false); 
    	oDiv.addEventListener('touchmove',touchMoveFunc,false);

  以上!在此特意感謝--劇中人的幫助。

總結

以上是生活随笔為你收集整理的手机端touch事件实现元素拖拽效果的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。