STERFIELD

jQueryでフリックを実装する場合に縦スクロールできなくなる問題を解決する方法

jQueryでフリックを実装する場合に縦スクロールできなくなる問題を解決する方法

以前jQueryでプラグインを使わずにフリックを実装する方法についてご紹介いたしましたが、

こちらの方法を使った場合に、1つ問題が発生します。

それは、スマホやタブレットでは、

フリックできるようにした要素の上ではページのスクロールができなくなってしまうという問題です。

 

これは、touchmoveイベントの本来の動作であるページのスクロール動作を、

「e.preventDefault()」を指定してキャンセルしているためです。

フリックで要素を動かす動作を自然に行うためには欠かせないことなのですが、

横いっぱいに広げたスライダーなどでは、これによってページのスクロールができない範囲が大きくなってしまうため、とても使い勝手の悪いものとなってしまいます。

 

今回は、この問題を解決する方法について考えてみましたので、

ご紹介いたします。

 

 

 

↓こちらがこの問題を解決したDEMOです(スマホやタブレットなどのタッチデバイスでのみ動きます)

DEMO

qr-nino-demo74

 

↓問題解決前のDEMO

DEMO

qr-nino-demo74_2

 

方法

今回の解決方法は、垂直方向から15度以内の方向にフリックした場合は、ページのスクロールを有効にして、

それ以上の角度の方向にフリックした場合はフリックを要素の移動を優先させて、ページのスクロールをキャンセルさせるというものです。

flick-scroll

では次に実装方法をご紹介いたします。

 

jQuery(JavaScript)全体

 

まず、以前ご紹介した方法では、「touchstart」のイベントのときに、タッチした場所の情報として横方向の座標であるXの値だけを取得していましたが、これに加えて、縦方向の座標であるYの座標も取得します。

 

次に、「touchmove」のイベントでも同様に、

移動先の座標として横方向のX座標に加えて、縦方向のY座標も取得します。

取得できたら「touchstart」で取得した値と「touchmove」で取得した座標を元に、

フリックの方向を計算します。

そして、フリックの方向が垂直方向から15度以上の場合は「e.preventDefault()」でページのスクロールをキャンセルし、15度以内の場合はページのスクロールができるようにします。

 

これでページのスクロールを邪魔せず、フリックによる操作が実装できました。

Author Profile

著者近影

NINOMIYA

Webデザイナー兼コーダー出身のフロントエンド開発者です。 UXデザインやチーム開発の効率化など、勉強中です。

SHARE

合わせて読みたい