ウェブ
MONDAY 2021 / 1 / 25
bxSliderのスライド内のリンクが効かなくなった際の対処方<完全版>
Text by Shinji Sato
こんにちは。
佐藤です。
僕の書いた記事で一番人気の高いのが
以前書いた、「bxSliderのスライド内のリンクが効かなくなった際の対処方」
ただ内容が応急処置的な感じになっているので「完全版」をお届けします。
まず、前記事に対処方が①と②の二種類載っていますが
①の存在は忘れましょう。
対処は②一択です!
対処②の内容を軽くおさらいすると
bxSliderのオプションの「touchEnabled」を「false」にするというもの。
というかリンクがなくても「touchEnabled」は基本「false」を推奨します。
というのも、「touchEnabled」を「true」にするとスマホで上下にスクロールしようとした際、スライド上をスワイプしてスクロールしようとするとスクロール出来ないことが多々あるためです。
それでもスワイプでスライドの切り替えがしたい!
って時はjQueryで切り替え処理を追加しちゃいましょう。
例えばこんな感じ
var $bxList = $('.bx-list');//スライドの対象
if ($bxList.length) {
  var mySlider = $bxList.bxSlider({
    auto: true,
    touchEnabled: false,
  }),
    $bxViewport = $bxList.closest('.bx-viewport'), posX, moveX;
  //スワイプ開始
  $bxViewport.on('touchstart', function (e) {
    posX = e.originalEvent.touches[0].pageX;
    moveX = posX;
  });
  //スワイプ中
  $bxViewport.on('touchmove', function (e) {
    moveX = e.originalEvent.touches[0].pageX;
  });
  //スワイプ完了
  $bxViewport.on('touchend', slide_action);
  function slide_action() {
    var diff = posX - moveX;
    
    if (Math.abs(diff) > 80) { //80px以上スワイプしていれば
      if (diff > 0) { //-値は右スワイプ
        mySlider.goToNextSlide();
      } else {
        mySlider.goToPrevSlide();
      }
    }
  }
}
これだけで一応切り替え処理は完了です。
もしドラッグにも対応したいよ!
って場合はドラッグの処理を追加するだけ、ただ値の取り方が少し違うので注意。
var $bxList = $('.bx-list');
if ($bxList.length) {
  var mySlider = $bxList.bxSlider({
    auto: true,
    touchEnabled: false,
  }),
    $bxViewport = $bxList.closest('.bx-viewport'), posX, moveX;
  //ドラッグ開始
  $bxViewport.on('dragstart', function (e) {
    posX = e.clientX;
    moveX = posX;
  });
  //ドラッグ完了
  $bxViewport.on('dragend', function (e) {
    moveX = e.clientX;
    slide_action();
  });
  //スワイプ開始
  $bxViewport.on('touchstart', function (e) {
    posX = e.originalEvent.touches[0].pageX;
    moveX = posX;
  });
  //スワイプ中
  $bxViewport.on('touchmove', function (e) {
    moveX = e.originalEvent.touches[0].pageX;
  });
  //スワイプ完了
  $bxViewport.on('touchend', slide_action);
  function slide_action() {
    var diff = posX - moveX;
 
    if (Math.abs(diff) > 80) { //80px以上スワイプしていれば
      if (diff > 0) { //-値は右スワイプ
        mySlider.goToNextSlide();
      } else {
        mySlider.goToPrevSlide();
      }
    }
  }
}
スワイプ中にスライドを引っ張る様なモーションが欲しい場合は「$bxViewport.on(‘touchmove’,function (e) {})」の中に処理を書いてやれば実現できます。
自分好みのスライダーにカスタマイズしてみるのも面白いかもしれませんね。
17 
          
        
 
               
               
             
               
               
             
               
               
            














