LoginSignup
0
1

More than 5 years have passed since last update.

スワイプ直後のタップ禁止

Posted at

主にiOSでスワイプの慣性が終わりきらないうちに、
スワイプ前にボタンがあった位置を再度タップすると、
ボタンが反応してしまうというバグの対策。

スワイプ直後に要素を押せないようにするために、
y方向に30px以上スワイプした場合、
500msの間ダミーの要素を全体にかぶせるというコード。

デモ:http://codepen.io/mo4_9/pen/JWywYy

banTapJustAfterSwipe.js
import $ from 'jquery';

// スワイプ直後のタップ禁止
export function banTapJustAfterSwipe() {

  let touchStartX, touchStartY,
      touchMoveX, touchMoveY;
  let moveDistY = 0;

  let timer;
  let isMoving = false;

  const $cover = $('.swipe--cover');
  $cover.hide()

  window.addEventListener("touchstart", (event) => {
    touchStartX = event.touches[0].pageX;
    touchStartY = event.touches[0].pageY;
    // console.log("touchstart");
  }, true);

  window.addEventListener("touchmove", (event) => {
    touchMoveX = event.changedTouches[0].pageX;
    touchMoveY = event.changedTouches[0].pageY;
    // console.log("touchmove");
    isMoving = true;
  }, true);

  window.addEventListener("touchend", (event) => {
    // console.log("touchend", isMoving, touchStartY, touchMoveY, moveDistY);
    // タップの場合(touchmoveが発火しない)
    // touchendが発火してからも慣性がかかり進んでしまうのを調整
    if (!isMoving) touchMoveY = touchStartY;
    moveDistY = Math.abs(touchStartY - touchMoveY);
    if (moveDistY > 30) {
      $cover.show();
      clearTimeout(timer);
      timer = setTimeout(() => {
        $cover.hide();
      }, 500);
    }
    isMoving = false;
  }, true);

}

参考
【JavaScript】スマホやタブレットでのスワイプ・フリック動作を取得する方法

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1