1
1

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 3 years have passed since last update.

スワイプをJavaScriptで書いてみた

Posted at

Twitterのサイドバーのような、スワイプ処理をJavascriptで書いてみました !

コードはこんな感じです.
すべてのコードはこちら

main.js
 function selector(s){
      return document.querySelector(s)
 }
        
      const t = selector('.flick_space');  // .flick_spaceはタッチ可能範囲のクラス名
      var startX;        // タッチ開始 x座標
      var moveX;        // スワイプ中の x座標
      var flag = 0 ;    // フラグ
      var nav_w =selector('nav').clientWidth ; //サイドバー幅

      // タッチ開始時: xy座標を取得
      t.addEventListener("touchstart", function(e) {
          e.preventDefault();
          startX = e.touches[0].pageX;
          
      });
  
          function limit(){
          if(moveX -startX <= nav_w){return -nav_w + (moveX - startX);
            }else{ return 0 }
          }

          function move(){
          if(moveX -startX > 0){return 0 ;
            }else{ return (moveX - startX) }
          }

          function calc(){
           if( flag == 10 ){
              var $obj1 = {
                  func: move(),
                  flag: 0
              }
              return $obj1 ;  
           } else if( flag == 0 ){
             var $obj1 = {
                 func: limit(),
                 flag: 10
             }
             return $obj1 ;  
           }    
         }
      
      // スワイプ中: xy座標を取得
      t.addEventListener("touchmove", function(event) {
         event.preventDefault();
         moveX = event.changedTouches[0].pageX;
         var $obj2 = calc();
       
           document.getElementById("nav").style.transition = "margin-left 0ms" ; 
           document.getElementById("nav").style.marginLeft =$obj2.func + 'px' ;//現在の幅(px)
    
          // console.log($obj2.flag ); 確認用
      });
       
    
      // タッチ終了時: スワイプした距離から左右どちらにスワイプしたかを判定する/距離が短い場合もとにもどる
      t.addEventListener("touchend", function(event) {event.preventDefault();
          var nav_w = selector('nav').clientWidth;
          var distance = (moveX - startX );
     
          if(distance > 40){
              flag = 10; //console.log(flag);
              selector('nav').style.transition = "margin-left  610ms ";  
              document.getElementById("nav").style.marginLeft = 0 + 'px';
      
          }else{ flag = 0; //console.log(flag);
              selector('nav').style.transition = "margin-left  610ms ";  
              document.getElementById("nav").style.marginLeft = - nav_w + 'px';
          }
      });

#ポイント

  • スライドの部分は Margin-Left を使って移動させた 
    (サイドバーが完全に表示されている状態がmargin-left = 0)
  • flag を付与することによって、サイドバーをスワイプしてコントロールする関数(2つある)を適切に使い分けることができる (ここでは 010)

.style.transition はよく見かけていたのですが、.style.marginLeft というものが使えると初めて知りました ! 確かにcssプロパティなんだからほかも使えるのは当然だなと笑 (参考までに)

誤字・脱字、コードの誤りなどありましたら、コメントお待ちしております !

ここまで読んでくださってありがとうございました.

1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?