• 工具:Sublime Text2,tomcat 8,Google Chrome
  • 语言:javascript
  • 目标:利用html5 canvas实现移动端触摸滚动背景。

1.touch事件介绍

  • touch事件

    • touchstart事件:当手指触摸屏幕时候触发,即使已经有一个手指放在屏幕上也会触发。
    • touchmove事件:当手指在屏幕上滑动的时候连续地触发。在这个事件发生期间,调用preventDefault()事件可以阻止滚动。
    • touchend事件:当手指从屏幕上离开的时候触发。
    • touchcancel事件:当系统停止跟踪触摸的时候触发。
  • touch事件的对象:

    • touches:表示当前跟踪的触摸操作的touch对象的数组。
    • targetTouches:特定于事件目标的Touch对象的数组。
    • changeTouches:表示自上次触摸以来发生了什么改变的Touch对象的数组。
  • 每个Touch对象包含的属性:

    • clientX:触摸目标在视口中的x坐标。
    • clientY:触摸目标在视口中的y坐标。
    • identifier:标识触摸的唯一ID。
    • pageX:触摸目标在页面中的x坐标。
    • pageY:触摸目标在页面中的y坐标。
    • screenX:触摸目标在屏幕中的x坐标。
    • screenY:触摸目标在屏幕中的y坐标。
    • target:触目的DOM节点目标。

2.实现的js代码

var c=document.getElementById("canvas");
var ctx=c.getContext("2d");
var img = document.getElementById("image");
img.onload = function(){ctx.drawImage(img,0,0);}

document.getElementById("canvas").addEventListener('touchstart', touchStart,false);  
document.getElementById("canvas").addEventListener('touchmove', touchMove,false);  
document.getElementById("canvas").addEventListener('touchend', touchEnd,false); 

var  startX, //触摸时的坐标
        startY,
        x=0,      //存取偏移位置的临时变量
        y=0,
        slideX, //滑动的距离
        slideY,
        aboveX=0, //记录上一次偏移的位置 
        aboveY=0;          
function touchStart(e){//触摸
             e.preventDefault();
             var touch = e.touches[0];//获取第一个target
             startX = touch.pageX;    //刚触摸时的坐标   
             startY = touch.pageY;                 
}
function touchMove(e){//滑动          
             e.preventDefault();//用来阻止默认事件        
             var touch = e.touches[0];   
             slideX = touch.pageX - startX;//滑动的距离            
             slideY = touch.pageY - startY;

             x = aboveX - slideX; //相对于(0,0)的偏移量
             y = aboveY - slideY;
             if(x >= 288) x = 288;//canvas与图片大小的最大偏移量
             if(y >= 192) y = 192;
             if(x <= 0) x = 0;
             if(y <= 0) y = 0;

             ctx.drawImage(img,x,y,960,576,0,0,960,576);//剪切图片
}  
function touchEnd(e){//手指离开屏幕
             e.preventDefault();      
             aboveX = x;     //touch结束后用来记录最后剪切的位置
             aboveY = y;           

} 

思路:在touchStart中获取刚刚触摸屏幕时的位置,然后在touchMove中获取手指滑动的距离做为偏移量,利用canvas.drawImage来实时剪切图片,最后在touchEnd中记录手指抬起时的偏移位置。

3.兼容性

支持触摸事件(touchstart、touchmove和touchend)的浏览器有:

  • IOS版Safari
  • Android版WebKit
  • bada版Dolfin
  • OS6+中的BlackBerry WebKit
  • Opera Mobile 10.1+
  • LG专有OS中的Phantom浏览器
    目前只有IOS版Safari支持多点触摸
    PC版Firefox 6+ 和Chrome也支持触摸事件

4.在Google手机模拟器中运行


运行截图


写在最后:

学东西不能照搬照抄,要深入理解以后,学会举一反三才叫学会。