移動(dòng)端基礎(chǔ)事件總結(jié)與應(yīng)用
1.觸摸事件touch
touchstart 手指放在屏幕上觸發(fā)
touchmove 手指在屏幕上移動(dòng),連續(xù)觸發(fā)
touchend 手指離開屏幕觸發(fā)
touchcancel 當(dāng)系統(tǒng)停止跟蹤時(shí)觸發(fā),該事件暫時(shí)用不到
注意:
1.移動(dòng)端只能事件只能通過(guò)監(jiān)聽函數(shù)添加,不能用on添加
2.移動(dòng)端當(dāng)中就不要用鼠標(biāo)的事件
3.移動(dòng)端的事件會(huì)觸發(fā)瀏覽器的默認(rèn)行為,所以在調(diào)用事件的時(shí)候要把默認(rèn)行為阻止了ev.preventDefault。
demo:
document.addEventListener('touchstart',function(ev){
ev.preventDefault();
});
var box=document.getElementById("box");
box.addEventListener('touchstart',function(){
this.innerHTML='手指按下了';
});
box.addEventListener('touchmove',function(){
this.innerHTML='手指移動(dòng)了';
});
box.addEventListener('touchend',function(){
this.innerHTML='手指離開了';
});
2.touch事件對(duì)象
ev.touches 當(dāng)前屏幕的手指列表
ev.targetTouches 當(dāng)前元素上的手指列表
ev.changedTouches 觸發(fā)當(dāng)前事件的手指列表
每個(gè)touch對(duì)象都包含了以下幾個(gè)屬性(打印ev.touches如下):
clientX //觸摸目標(biāo)在視口中的X坐標(biāo)。
clientY //觸摸目標(biāo)在視口中的Y坐標(biāo)。
Identifier //標(biāo)示觸摸的唯一ID。
pageX //觸摸目標(biāo)在頁(yè)面中的X坐標(biāo)。
pageY //觸摸目標(biāo)在頁(yè)面中的Y坐標(biāo)。
screenX//觸摸目標(biāo)在屏幕中的X坐標(biāo)。
screenY //觸摸目標(biāo)在屏幕中的Y坐標(biāo)。
target // 觸摸的DOM節(jié)點(diǎn)目標(biāo)。
demo:
var box=document.getElementById("box");
//相當(dāng)于mousedown
box.addEventListener('touchstart',function(ev){
//console.log(ev.touches);
this.innerHTML=ev.touches.length;//按下手指數(shù)
});
3.設(shè)備加速度事件devicemotion
devicemotion 封裝了運(yùn)動(dòng)傳感器數(shù)據(jù)的事件,可以獲取手機(jī)運(yùn)動(dòng)狀態(tài)下的運(yùn)動(dòng)加速度等數(shù)據(jù)。
其中加速度的數(shù)據(jù)包含以下三個(gè)方向:
x:橫向貫穿手機(jī)屏幕;
y:縱向貫穿手機(jī)屏幕;
z:垂直手機(jī)屏幕
鑒于有些設(shè)備沒(méi)有排除重力的影響,所以該事件會(huì)返回兩個(gè)屬性:
1、accelerationIncludingGravity(含重力的加速度)
2、acceleration(排除重力影響的加速度)
注意:這個(gè)事件只能放在window身上
demo1:顯示重力加速度的值
window.addEventListener('devicemotion',function(ev){
var motion=ev.accelerationIncludingGravity; box.innerHTML='x:'+motion.x+'<br/>'+'y:'+motion.y+'<br/>'+'z:'+motion.z;
});
demo2:方塊跟著重力左右移動(dòng)
window.addEventListener('devicemotion',function(ev){
var motion=ev.accelerationIncludingGravity;
var x=parseFloat(getComputedStyle(box).left);//box目前的left值
box.style.left=x+motion.x+'px';
});
demo3:搖一搖應(yīng)用原理
var box=document.getElementById('box');
var lastRange=0; //上一次搖晃的幅度
var isShake=false; //決定用戶到底有沒(méi)有大幅度搖晃
window.addEventListener('devicemotion',function(ev){
var motion=ev.accelerationIncludingGravity;
var x=Math.abs(motion.x);
var y=Math.abs(motion.y);
var z=Math.abs(motion.z);
var range=x+y+z; //當(dāng)前搖晃的幅度
if(range-lastRange>100){
//這個(gè)條件成立說(shuō)明用戶現(xiàn)在已經(jīng)在大幅度搖晃
isShake=true;
}
if(isShake && range<50){
//這個(gè)條件成立,說(shuō)明用戶搖晃的幅度很小了就要停了
box.innerHTML='搖晃了';
isShake=false;
}
});
4.設(shè)備方向事件deviceorientation
deviceorientation 封裝了方向傳感器數(shù)據(jù)的事件,可以獲取手機(jī)靜止?fàn)顟B(tài)下的方向數(shù)據(jù)(手機(jī)所處的角度、方位和朝向等)
ev.beta 表示設(shè)備在x軸上的旋轉(zhuǎn)角度,范圍為-180~180。它描述的是設(shè)備由前向后旋轉(zhuǎn)的情況。
ev.gamma 表示設(shè)備在y軸上的旋轉(zhuǎn)角度,范圍為-90~90。它描述的是設(shè)備由左向右旋轉(zhuǎn)的情況。
ev.alpha 表示設(shè)備沿z軸上的旋轉(zhuǎn)角度,范圍為0~360。
注意:這個(gè)事件只能放在window身上
demo:
window.addEventListener('deviceorientation',function(ev){
box.innerHTML='x軸傾斜:'+ev.beta.toFixed(1)+'</br>y軸傾斜:'+ev.gamma.toFixed(1)+'</br>z軸傾斜:'+ev.alpha.toFixed(1);
});
5.手勢(shì)事件gesture
IOS的Safari還引入了一組手勢(shì)事件。當(dāng)兩個(gè)手指觸摸屏幕時(shí)就會(huì)產(chǎn)生手勢(shì),手勢(shì)通常會(huì)改變顯示項(xiàng)的大小,或者旋轉(zhuǎn)顯示項(xiàng)。有三個(gè)手勢(shì)事件,分別如下:
gesturestart 當(dāng)一個(gè)手指已經(jīng)按在屏幕上,而另一個(gè)手指又觸摸在屏幕時(shí)觸發(fā)
gesturechange 當(dāng)觸摸屏幕的任何一個(gè)手指的位置發(fā)生改變的時(shí)候觸發(fā)
gestureend 當(dāng)任何一個(gè)手指從屏幕上面移開時(shí)觸發(fā)
ev.rotation 表示手指變化引起的旋轉(zhuǎn)角度,負(fù)值表示逆時(shí)針,正值表示順時(shí)針,從0開始。
ev.scale 表示兩個(gè)手指之間的距離情況,向內(nèi)收縮會(huì)縮短距離,這個(gè)值從1開始,并隨距離拉大而增長(zhǎng)。
注意:
1. gesture事件目前只有 IOS 2.0以上支持,安卓的暫時(shí)沒(méi)有支持。
2. 一定要阻止瀏覽器的默認(rèn)行為。
demo1:多指旋轉(zhuǎn)
var startDeg=0; //上次旋轉(zhuǎn)后的角度
//兩個(gè)或者兩個(gè)以上手指按下
box.addEventListener('gesturestart',function(){
this.style.background='blue';
//rotate(90deg)
if(this.style.transform){
startDeg=parseFloat(this.style.transform.split('(')[1]);
}
});
//兩個(gè)或者兩個(gè)以上手指變換
box.addEventListener('gesturechange',function(ev){
/*this.style.background='black';
this.innerHTML=ev.rotation;*/
this.style.transform='rotate('+(ev.rotation+startDeg)+'deg)';
});
//兩個(gè)或者兩個(gè)以上手指抬起
box.addEventListener('gestureend',function(){
this.style.background='green';
});
demo2:多指縮放
document.addEventListener('touchstart',function(ev){
ev.preventDefault();
});
document.addEventListener('touchmove',function(ev){
ev.preventDefault();
});
var box=document.getElementById("box");
var startScale=1; //上次縮放后的角度
//兩個(gè)或者兩個(gè)以上手指按下
box.addEventListener('gesturestart',function(){
this.style.background='blue';
//rotate(90deg)
if(this.style.transform){
startScale=parseFloat(this.style.transform.split('(')[1]);
}
});
//兩個(gè)或者兩個(gè)以上手指變換
box.addEventListener('gesturechange',function(ev){
/*this.style.background='black';
this.innerHTML=ev.rotation;*/
var sc=ev.scale*startScale;
sc=sc<0.5?0.5:sc;//設(shè)置最小縮放到0.5
this.style.transform='scale('+sc+')';
});
//兩個(gè)或者兩個(gè)以上手指抬起
box.addEventListener('gestureend',function(){
this.style.background='green';
});
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
javascript函數(shù)的節(jié)流[throttle]與防抖[debounce]
這篇文章主要介紹了javascript函數(shù)的節(jié)流[throttle]與防抖[debounce ],詳細(xì)的介紹了節(jié)流與防抖的原理和示例,具有一定的參考價(jià)值,有興趣的可以了解一下2017-11-11
JavaScript 實(shí)現(xiàn)自己的安卓手機(jī)自動(dòng)化工具腳本(推薦)
這篇文章主要介紹了 JavaScript 實(shí)現(xiàn)自己的安卓手機(jī)自動(dòng)化工具腳本,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
自定義javascript驗(yàn)證框架示例【附源碼下載】
這篇文章主要介紹了自定義javascript驗(yàn)證框架,結(jié)合實(shí)例形式分析了javascript正則驗(yàn)證相關(guān)操作技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下2019-05-05
JavaScript中通用的jquery動(dòng)畫滾屏實(shí)例
這篇文章主要介紹了JavaScript中通用的jquery動(dòng)畫滾屏實(shí)例,本文通過(guò)實(shí)際代碼來(lái)詳解實(shí)現(xiàn)方法,需要的朋友可以參考一下2022-07-07
iphone safari不支持position fixed的解決方法
最近一直在做移動(dòng)web開發(fā),開發(fā)過(guò)程中遇到了許多問(wèn)題,mobile safari不支持position: fixed就是一件很頭疼的事情2012-05-05
JavaScript 文件加載與阻塞問(wèn)題之性能優(yōu)化案例詳解
這篇文章主要介紹了JavaScript 文件加載與阻塞問(wèn)題之性能優(yōu)化案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09

