9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

jQuery ~ フリック操作(スワイプ操作)を実装(コマンドメモ)

Posted at

プラグインを使わずにフリック操作を実装してみました。

※今回はSPA方式で作ったので、viewに関してはejsファイル、scssファイルを作成しています。

jsファイルに実装した流れ

  1. 端末がタッチパネル操作可能かどうか判定(不可能な場合は別操作を実装することを想定)

  2. フリック対象html要素を設定

  3. 端末がタッチパネル操作可能である場合、タッチイベントを追加

  4. タッチ開始位置からタッチ終了位置の差分により、アニメーションを実行

  5. フリック中およびアニメーション実行中は動作が重複しないようフラグを設定

以下に、sampleソースコードを記載します。

flick-sample.js

var $ = require('jquery');

var viewTemplate = require('.../flick-sample-view-template');

// フリック処理中判定フラグ
var flickFlg = false;

// アニメーション中判定フラグ
var animationFlg = false;

// 対象HTML要素の取得
var v = $(viewTemplate);
var flickBox = v.find('.flick-box');

// タッチ開始位置および終了位置を初期化
flickBox._startX = 0;
flickBox._endX = 0;

// 端末の判定(PC or タブレット・スマホ)
if ('ontouchstart' in window) {
  // フリック処理用タッチイベントを追加
  flickBox.on('touchstart', onFlickBoxFlickStart);
  flickBox.on('touchmove', onFlickBoxFlickMove);
  flickBox.on('touchend', onFlickBoxFlickEnd);
} else {
  //PCで行う処理
}

/**
 * フリック開始イベント
 * @param e {object} jQueryイベントオブジェクト
 */
onFlickBoxFlickStart: function onFlickBoxFlickStart(e) {
  // アニメーション中またはフリック中は処理を抜ける
  if (animationFlg || flickFlg) {
    return;
  }

  // フリック処理中判定フラグ
  flickFlg = true;

  // タッチ開始位置を取得
  flickBox._startX = e.originalEvent.changedTouches[0].pageX;
}

/**
 * フリック中イベント
 * @param e {object} jQueryイベントオブジェクト
 */
onFlickBoxFlickMove: function onFlickBoxFlickMove(e) {
  // アニメーション中またはフリック中は処理を抜ける
  if (animationFlg || flickFlg) {
    return;
  }

  // タッチ終了位置を取得
  flickBox._endX = e.originalEvent.changedTouches[0].pageX;
}

/**
 * フリック終了イベント
 */
onFlickBoxFlickEnd: function onFlickBoxFlickEnd() {
  // アニメーション中またはフリック中は処理を抜ける
  if (animationFlg || flickFlg) {
    return;
  }
  
  // タッチ開始位置と終了位置の差分を計算する
  var diffX = Math.round(flickBox._startX - flickBox._endX);

  // 差分が100より大きい場合はアニメーションを実行
  if (diffX > 100) {
    this.flickBoxAnimation();
  }
  
  // 各値を初期化、フリック処理中判定フラグ無効にする
  flickBox._startX = 0;
  flickBox._endX = 0;
  flickFlg = false;
}

/**
 * フリックによるアニメーション
 */
flickBoxAnimation: function flickBoxAnimation() {
  // アニメーション中判定フラグを有効にする
  animationFlg = true;

  // フリックによるアニメーションを実行する
  flickBox.stop(false, true).animate({
      marginLeft: 500
    },
    {
      duration: 500,
      queue: false
    });

  // アニメーション中判定フラグを無効にする
  animationFlg = false;
}

flick-sample-view-template.ejs

<div class="flick-sample-view">
  <div class="flick-box">
    フリック
  </div>
</div>

flick-sample.scss

.flick-sample-view {
  width: 100%;
  height: 100%;

  .flick-box {
    overflow: auto;
    width: 500px;
    height: 100%;
    background-color: #ffff00;
  }
}

9
12
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
9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?