JavaScriptだけでスワイプ処理追加でカルーセル(スライダー)作成

JavaScriptだけでスワイプ処理追加

JavaScriptだけでスワイプ処理を実装は以下のようなコードになる。

関数を作成しておけば要素を指定するだけで良い。

function setSwipe(elem) {
  var t = document.querySelector(elem);
  var r = document.getElementById('result');
  var startX;
  var startY;
  var moveX;
  var moveY;
  var dist = 30;
  t.addEventListener('touchstart', function(e) {
    e.preventDefault();
    startX = e.touches[0].pageX;
    startY = e.touches[0].pageY;
  });
  t.addEventListener('touchmove', function(e) {
    e.preventDefault();
    moveX = e.changedTouches[0].pageX;
    moveY = e.changedTouches[0].pageY;
  });
  t.addEventListener('touchend', function(e) {
    if (startX > moveX && startX > moveX + dist) {
      r.textContent = '右から左にスワイプ';
    } else if (startX < moveX && startX + dist < moveX) {
      r.textContent = '左から右にスワイプ';
    }
  });
}
setSwipe('#t');
setSwipe('.foo .bar');

JavaScriptだけでスワイプ処理追加サンプル

touchmoveイベントなどはパソコンではChromeのエミュレータなどを使用しないと発生しないので注意。

カルーセル(スライダー)にスワイプを実装

カルーセル(スライダー)にスワイプを実装するとこのようなコードになる。現在地を示すnav(小さい丸)も下に入れておくと良いだろう。

function setSwipe(elem) {
  var t = document.querySelector(elem);
  var tc = document.querySelector(elem + '> ul');
  var len = document.querySelectorAll(elem + '> ul > li').length;
  var startX;
  var startY;
  var moveX;
  var moveY;
  var dist = 30;
  var pos = 1;
  var nav = document.createElement('ul');
  nav.className = 'nav';
  for (var i = 0; i < len; i++) {
    var li = document.createElement('li');
    if (i === 0) {
      li.className = 'active';
    }
    nav.appendChild(li);
  }
  t.parentNode.insertBefore(nav, t.nextElementSibling);
  var navLi = document.querySelectorAll('.nav > li');
 
  t.addEventListener('touchstart', function(e) {
    e.preventDefault();
    startX = e.touches[0].pageX;
    startY = e.touches[0].pageY;
  });
 
  t.addEventListener('touchmove', function(e) {
    e.preventDefault();
    moveX = e.changedTouches[0].pageX;
    moveY = e.changedTouches[0].pageY;
  });
 
  t.addEventListener('touchend', function(e) {
    navLi[pos - 1].classList.remove('active');
    if (startX > moveX && startX > moveX + dist && pos < len) {
      pos++;
    } else if (startX < moveX && startX + dist < moveX && pos > 1) {
      pos--;
    }
    tc.className = 'pos' + pos;
    navLi[pos - 1].classList.add('active');
  });
}
setSwipe('.carousel');

JavaScriptだけでカルーセル実装サンプル