DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> JavaScript基礎知識 >> javascript小實例,移動端頁面中的拖拽
javascript小實例,移動端頁面中的拖拽
編輯:JavaScript基礎知識     

上文說到,想將移動端的拖拽說一說,那現在趁有時間,就將這個福利文帶來了,哈哈!

在我還不知道怎麼做移動端的手勢操作的時候,我覺得這TM實在是太難了,這是多麼高深的學問啊,手勢操作耶,上滑下滑左滑右滑的,手機怎麼知道我是怎麼滑的,我要怎麼告訴手機,我用手滑了一下,於是我就默默的找資料看看,

到底是什麼樣的原理可以實現這一點,於是,我找到了移動端手勢操作原生事件:

touchstart:     //手指放到屏幕上時觸發

touchmove:      //手指在屏幕上滑動式觸發

touchend:    //手指離開屏幕時觸發

touchcancel:     //系統取消touch事件的時候觸發,這個好像比較少用

每個觸摸事件被觸發後,會生成一個event對象,event對象裡額外包括以下三個觸摸列表:

touches:     //當前屏幕上所有手指的列表

targetTouches:      //當前dom元素上手指的列表,盡量使用這個代替touches

changedTouches:     //涉及當前事件的手指的列表,盡量使用這個代替touches

 

看到他們,我簡直心生喜悅啊,簡直了,這不就是我苦苦尋覓的東西嗎?手機再也不用擔心我的手指在干什麼了!

有了上面的這些原始事件,我們能做什麼事情呢?

1、通過touches,我們可以知道屏幕上有幾根手指,那就可以自定義一根手指做什麼,兩根手指做什麼,三根手指又做什麼;

2、我們可以通過手指在屏幕接觸的時間,來自定義輕觸,模擬點擊,長按,雙擊等等效果,當然這就比較高級了;

3、可以自定義上滑下滑左滑右滑等手勢效果;

4、可以模擬滾動條效果;

5、可以實現手指拖拽效果;

。。。。。。

等等,可以實現很多你想要實現的效果,只要你敢想,當然今天要講解的並不是移動端手勢操作這麼大的話題,今天就從手指拖拽效果這一個小點開始,以後慢慢介紹移動端的那些事。

 

回歸正題,上回我們將了一下PC端的拖拽效果,不熟悉的同學可以看這裡查看,移動端的拖拽思想跟pc端很像,區別只是寫法不一樣,具體的實現原理我就不說了,不理解的請看PC端的介紹,PC端沒有用到綁定事件,其實也是可以用綁定事件來綁定的,

移動端需要用綁定事件來觸發,具體代碼如下:

               /*
			參數說明:
			元素絕對定位,父級相對定位,如果父級為window,則可以不用
			傳一個參數,表示父級為window,物體相對於window范圍拖動
			傳2個參數,則父級為第二個參數,物體相對於父級范圍拖動
			參數為id值
		*/
		function drag(obj,parentNode){
			var obj = document.getElementById(obj);
			if(arguments.length == 1){
				var parentNode = window.self;	
				var pWidth = parentNode.innerWidth,pHeight = parentNode.innerHeight;	
			}else{
				var parentNode = document.getElementById(parentNode);
				var pWidth = parentNode.clientWidth,pHeight = parentNode.clientHeight;
			}
			obj.addEventListener('touchstart',function(event){
				//當只有一個手指時				.
				if(event.touches.length == 1){
					//禁止浏覽器默認事
					event.preventDefault();
				};
				var touch = event.targetTouches[0];
				var disX = touch.clientX - obj.offsetLeft,disY = touch.clientY - obj.offsetTop;	
				var oWidth = obj.offsetWidth,oHeight = obj.offsetHeight;

				obj.addEventListener('touchmove',function(event){
					var touch = event.targetTouches[0];
					obj.style.left = touch.clientX - disX  + 'px';
					obj.style.top = touch.clientY - disY + 'px';
					//左側
					if(obj.offsetLeft <=0){
						obj.style.left = 0;	
					};
					//右側
					if(obj.offsetLeft >= pWidth -oWidth){
						obj.style.left =  pWidth - oWidth + 'px';	
					};
					//上面
					if(obj.offsetTop <= 0){
						obj.style.top = 0;	
					};
					//下面
					if(obj.offsetTop >= pHeight - oHeight){
						obj.style.top =  pHeight - oHeight + 'px';	
					};					
				});
				obj.addEventListener('touchend',function(event){
					obj.removeEventListener('touchmove');
					obj.removeEventListener('touchend');
				})
			});
		}

這裡我也設置了2個參數,如果只填一個參數,表示相對父級為window,物體在window內拖動,如果填2個參數,第一個參數為拖拽對象,第二個參數為相對父級,跟pc差不多,有點不同的是,pc鼠標移動和彈起時,我們作用的對象是document,是為什麼防止鼠標拖動物體外面所帶來的bug,現在是作用於obj對象上,這是為什麼呢?

原因是在移動端上,如果有一個拖拽對象相對於window,一個拖拽對象相對於自己的相對父級,現在我們是綁定事件,如果拖動後面這個拖拽對象,因為2個都是執行的,我們把拖拽事件綁定到window,就會一起觸發前面的拖拽,如果是綁定在拖拽物體上就可以避免

事件的污染問題,因為都在自身嘛!

我相信實現拖拽的方法不只這個,還有很多的方法可以實現,我也相信我寫的這個代碼並不是最優的,只能說可以用用,所以,如果哪位大神有更好的實現方法,或者是代碼有什麼錯誤的地方,萬望指正!不勝感謝!

才疏學淺,先就到這裡!後續有時間,我們在一起聊一聊移動端前端的那些事!哈哈~

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved