天天看點

26、觸屏事件26、觸屏事件

26、觸屏事件

1. 觸屏事件概述

移動端浏覽器相容性較好,我們不需要考慮以前 JS 的相容性問題,可以放心的使用原生 JS 書寫效果,但是移動端也有自己獨特的地方。比如觸屏事件 touch(也稱觸摸事件),Android和 IOS 都有。

touch 對象代表一個觸摸點。觸摸點可能是一根手指,也可能是一根觸摸筆。觸屏事件可響應使用者手指(或觸控筆)對螢幕或者觸控闆操作。

常見的觸屏事件如下:

26、觸屏事件26、觸屏事件
<body>
    <div></div>
    <script>
        // 1. 手指觸摸DOM元素事件
        var div = document.querySelector('div');
        div.addEventListener('touchstart', function() {
            console.log('我摸了你');

        });
        // 2. 手指在DOM元素身上移動事件
        div.addEventListener('touchmove', function() {
            console.log('我繼續摸');

        });
        // 3. 手指離開DOM元素事件
        div.addEventListener('touchend', function() {
            console.log('輕輕的我走了');

        });
    </script>
</body>
           

2. 觸摸事件對象(TouchEvent)

TouchEvent 是一類描述手指在觸摸平面(觸摸屏、觸摸闆等)的狀态變化的事件。這類事件用于描述一個或多個觸點,使開發者可以檢測觸點的移動,觸點的增加和減少,等等

touchstart、touchmove、touchend 三個事件都會各自有事件對象。

觸摸事件對象重點我們看三個常見對象清單:

26、觸屏事件26、觸屏事件

因為平時我們都是給元素注冊觸摸事件,是以重點記住 targetTocuhes

<body>
    <div></div>
    <script>
        // 觸摸事件對象
        // 1. 擷取元素
        // 2. 手指觸摸DOM元素事件
        var div = document.querySelector('div');
        div.addEventListener('touchstart', function(e) {
            // console.log(e);
            // touches 正在觸摸螢幕的所有手指的清單 
            // targetTouches 正在觸摸目前DOM元素的手指清單
            // 如果偵聽的是一個DOM元素,他們兩個是一樣的
            // changedTouches 手指狀态發生了改變的清單 從無到有 或者 從有到無
            // 一般都是觸摸元素 經常使用的是 targetTouches
            console.log(e.targetTouches[0]);
            // targetTouches[0] 就可以得到正在觸摸dom元素的第一個手指的相關資訊比如 手指的坐标等等
        });
        // 3. 手指在DOM元素身上移動事件
        div.addEventListener('touchmove', function() {

        });
        // 4. 手指離開DOM元素事件
        div.addEventListener('touchend', function(e) {
            // console.log(e);
            // 當手指離開螢幕的時候,就沒有了 touches 和 targetTouches 清單
            // 但是會有 changedTouches
        });
    </script>
</body
           

3. 案例:移動端拖動元素

  • touchstart、touchmove、touchend可以實作拖動元素
  • 但是拖動元素需要目前手指的坐标值 我們可以使用 targetTouches[0] 裡面的pageX 和 pageY
  • 移動端拖動的原理:手指移動中,計算出手指移動的距離。然後用盒子原來的位置 + 手指移動的距離
  • 手指移動的距離:手指滑動中的位置 減去 手指剛開始觸摸的位置

    拖動元素三步曲:

    (1) 觸摸元素 touchstart: 擷取手指初始坐标,同時獲得盒子原來的位置

    (2) 移動手指 touchmove: 計算手指的滑動距離,并且移動盒子

    (3) 離開手指 touchend:

    注意: 手指移動也會觸發滾動螢幕是以這裡要阻止預設的螢幕滾動 e.preventDefault();

<body>
    <div></div>
    <script>
        // (1) 觸摸元素 touchstart:擷取手指初始坐标,同時獲得盒子原來的位置
        // (2) 移動手指 touchmove:計算手指的滑動距離,并且移動盒子
        // (3) 離開手指 touchend:
        var div = document.querySelector('div');
        var startX = 0; //擷取手指初始坐标
        var startY = 0;
        var x = 0; //獲得盒子原來的位置
        var y = 0;
        div.addEventListener('touchstart', function(e) {
            //  擷取手指初始坐标
            startX = e.targetTouches[0].pageX;
            startY = e.targetTouches[0].pageY;
            x = this.offsetLeft;
            y = this.offsetTop;
        });

        div.addEventListener('touchmove', function(e) {
            //  計算手指的移動距離 =手指移動之後的坐标 - 手指初始的坐标
            var moveX = e.targetTouches[0].pageX - startX;
            var moveY = e.targetTouches[0].pageY - startY;
            // 移動盒子的距離 = 盒子原來的位置 + 手指移動的距離
            this.style.left = x + moveX + 'px';
            this.style.top = y + moveY + 'px';
            e.preventDefault(); // 阻止螢幕滾動的預設行為
        });
    </script>
</body>

           

1.3.1. 案例:傳回頂部

當頁面滾動某個地方,就顯示,否則隐藏

點選可以傳回頂部

1.3.2.案例分析

  1. 滾動某個地方顯示
  2. 事件:scroll頁面滾動事件
  3. 如果被卷去的頭部(window.pageYOffset )大于某個數值
  4. 點選,window.scroll(0,0) 傳回頂部

繼續閱讀