您的位置:

深入了解JavaScript触摸事件

JavaScript触摸事件已经成为现代化Web应用和移动应用开发中的必备技能。触摸事件具有灵敏度高、交互性好的优点,能够带来更加流畅、便捷的用户体验。本文将从多个方面阐述JavaScript触摸事件的知识点,代码实例将帮助你更好地掌握这项技能。

一、触摸事件的类型

JavaScript触摸事件共有5种类型,分别是touchstart、touchmove、touchend、touchcancel和touchenter。其中,前3种是最常用的。它们在用户开始触摸屏幕、在屏幕上移动手指以及松开手指时都会被激发。


// touchstart事件,当手指接触到屏幕时触发
document.addEventListener('touchstart', function(event){
    console.log('手指已触摸到屏幕')
}, false);

// touchmove事件,当手指在屏幕上移动时触发
document.addEventListener('touchmove', function(event){
    console.log('手指在屏幕上滑动')
}, false);

// touchend事件,当手指离开屏幕时触发
document.addEventListener('touchend', function(event){
    console.log('手指已离开屏幕')
}, false);

二、触摸事件的属性和方法

在JavaScript触摸事件中,事件对象event有一些很有用的属性和方法。例如,我们可以通过event.touches获取触摸点的列表,通过event.preventDefault()方法来禁止事件默认行为。


// 获取触摸点的列表
document.addEventListener('touchstart', function(event){
    console.log(event.touches);   // 输出触摸点的列表
}, false);

// 禁止事件默认行为
document.addEventListener('touchmove', function(event){
    event.preventDefault();   // 阻止默认行为
}, false);

三、基本的触摸操作

在JavaScript中,我们可以通过触摸事件来实现基本的手势操作,例如实现点击、拖拽、滑动等操作。下面是一些例子。

1、点击事件

在屏幕上单击一下,可以激发touchstart和touchend事件,可以通过比较两个事件之间的时间间隔来判断用户是否真的进行了点击操作。


var startTime;
document.addEventListener('touchstart', function(event){
    startTime = new Date().getTime();   // 记录touchstart事件的时间
}, false);

document.addEventListener('touchend', function(event){
    var endTime = new Date().getTime();   // 记录touchend事件的时间
    if( endTime - startTime < 200 ){   // 判断时间间隔是否小于200毫秒,如果是则认为是一次点击
        console.log('点击了屏幕');
    }
}, false);

2、拖拽事件

拖拽操作通常是通过在元素上绑定touchstart、touchmove和touchend事件来实现的。通过获取鼠标按下的点和拖动的距离,可以实现拖动元素的效果。


var dragging = false;
var startX, startY;
var box = document.getElementById('box');   // 获取拖拽元素

box.addEventListener('touchstart', function(event){
    // 获取鼠标按下的点
    dragging = true;
    startX = event.touches[0].pageX - box.offsetLeft;
    startY = event.touches[0].pageY - box.offsetTop;
}, false);

box.addEventListener('touchmove', function(event){
    // 获取鼠标拖动的距离
    if( dragging ){
        var x = event.touches[0].pageX - startX;
        var y = event.touches[0].pageY - startY;
        box.style.left = x + 'px';
        box.style.top = y + 'px';
    }
}, false);

box.addEventListener('touchend', function(event){
    dragging = false;
}, false);

3、滑动事件

滑动事件通常是通过在元素上绑定touchstart、touchmove和touchend事件来实现的。通过比较开始滑动的点和结束滑动的点的位置,可以判断用户滑动的方向。


var startX, startY;
var endX, endY;
var box = document.getElementById('box');

box.addEventListener('touchstart', function(event){
    startX = event.touches[0].pageX;
    startY = event.touches[0].pageY;
}, false);

box.addEventListener('touchend', function(event){
    endX = event.changedTouches[0].pageX;
    endY = event.changedTouches[0].pageY;

    var distX = endX - startX;
    var distY = endY - startY;

    if( Math.abs(distX) > Math.abs(distY) ){   // 判断滑动方向
        if( distX > 0 ){
            console.log('向右滑动');
        }else{
            console.log('向左滑动');
        }
    }else{
        if( distY > 0 ){
            console.log('向下滑动');
        }else{
            console.log('向上滑动');
        }
    }

}, false);

四、实战:触摸式相册

我们可以通过触摸事件来实现一个简单的触摸式相册。相册中会有多张图片,用户可以通过滑动来切换图片。下面是一个示例代码:


HTML代码:

   
CSS代码: .slider-wrap{ width: 100%; overflow: hidden; } .slider{ width: 800%; position: relative; } .slider img{ float: left; width: 20%; } JavaScript代码: var sliderWrap = document.querySelector('.slider-wrap'); var slider = document.querySelector('.slider'); var startX, startY; var endX, endY; var distX, distY; var currentX = 0; var index = 0; var timer; sliderWrap.addEventListener('touchstart', function(event){ clearInterval(timer); // 清除自动播放 startX = event.touches[0].pageX; startY = event.touches[0].pageY; }, false); sliderWrap.addEventListener('touchmove', function(event){ endX = event.touches[0].pageX; endY = event.touches[0].pageY; distX = endX - startX; distY = endY - startY; if( Math.abs(distX) > Math.abs(distY) ){ event.preventDefault(); // 阻止页面滑动 var moveX = currentX + distX; slider.style.transform = 'translateX('+ moveX +'px)'; } }, false); sliderWrap.addEventListener('touchend', function(event){ if( distX > 0 ){ index--; // 向右滑动 }else{ index++; // 向左滑动 } if( index < 0 ){ // 判断是否已经到第一张或最后一张 index = 0; } if( index > 3 ){ index = 3; } var moveX = - index * 20; slider.style.transform = 'translateX('+ moveX +'%)'; currentX = moveX; autoPlay(); // 自动播放 }, false); function autoPlay(){ // 自动播放 timer = setInterval(function(){ index++; if( index == 4 ){ index = 0; } var moveX = - index * 20; slider.style.transform = 'translateX('+ moveX +'%)'; currentX = moveX; }, 3000); } autoPlay(); // 页面加载完成后开始自动播放

五、总结

JavaScript触摸事件是Web应用和移动应用开发中不可或缺的一部分,具有灵敏度高和交互性好的优点。通过本文的介绍,我们可以深入了解JavaScript触摸事件的各种知识点和实际应用,让我们更加熟悉和掌握这项技能。