キネティックスクロールバー

動的スクロールの効果は、ほぼどこでも見られるようになりました。 これは、指やスタイラスを管理するのに本当に便利で、マウスでスクロールするときにかなり面白いです。

ウェブ上では、そのような効果は定着しつつあります。 便利な場所を考えるのはそれほど簡単ではありません...おそらく、ページ内の一部のコンテンツ(主に写真)をスクロールするために使用されるスクロールバーだけが思い浮かぶでしょう。 たとえば、ほとんどすべてのサイトでギャラリーの実装を確認できます。 同意します。スライダーがすぐに停止せず、マウスボタンが離されるとすぐに停止しますが、慣性によってさらに移動を続け、徐々に停止する場合はさらに興味深いでしょう...
このような動的なスクロールバー効果を作成するプロセスを検討します。 ここで見ることができる最後に何が起こったのか

アルゴリズム


開始するには、一般的なアルゴリズム(スライダーをドラッグして「スクロール」)を検討してください。 驚くほど簡単です:

どうやら、すべてが非常に簡単です。 明らかに、そのようなアルゴリズムは普遍的であり、JSだけに適していません...

実装


便宜上、jQueryライブラリーとjQuery UIからのイージング効果を使用できます。
HTMLコードは次のとおりです。
<div id="track"> <div id="thumb"></div> </div> 

ここで、trackはスライダーが実行される領域であり、thumbはスライダー自体です。
CSS:
 #track { width: 500px; position: relative; display: block; height: 22px; margin: 20px; border: solid 1px #000; overflow: hidden; } #track #thumb { width: 70px; height: 22px; position: absolute; background-color: gray; left: 200px; } 

これで、スクリプト自体の作成に進むことができます。 これはトレーニングの例であるため、通常の手続き型スタイルで記述します...必要に応じて、プロトタイプで書き換えたり、jQueryプラグインとして設計したりできます。
次のグローバル変数を導入します。
  1. $ track(jQueryオブジェクト)-スクロールバーエリア
  2. $ thumb(jQueryオブジェクト)-スライダー
  3. isClicked(bool)-スライダーがクリックされるかどうかを決定する変数。
  4. clickPointX(int)-オブジェクトのクリックのx座標
  5. dx(int)-1つのmouseMoveイベントでオブジェクトのx座標を変更します。
 var $track = $('#track'); var $thumb = $('#thumb'); var isClicked = false; var clickPointX = 0; var dx = 0; 

最初に、赤毛のブラウザがスライダーをドラッグしようとするのを防ぎましょう:
 $thumb.bind('dragstart', false); 

オブジェクトでmouseDownを処理します。
 $thumb.mousedown( function(e) { //     clickPointX = e.pageX - $(this).offset().left; isClicked = true; $thumb.stop(); //    }); 

mouseMoveを処理しますが、オブジェクトではなくドキュメント全体で処理します
 $(document).mousemove( function(e) { if (isClicked) { //   ,     //   var x = (e.pageX - $track.offset().left - clickPointX); //       if (x < -maxBorderOut) { x = -maxBorderOut; } if ( (x + $thumb.width()) > ($track.width() + maxBorderOut)) { x = $track.width() - $thumb.width() + maxBorderOut; } //   var selfLeft = parseInt($thumb.css('left')); $thumb.css({'left': x + 'px' }); dx = x - selfLeft; } }); 

ここで、未宣言の変数maxBorderOutに出会います。これは、スライダーを領域の境界を越えてドラッグできる最大ピクセル数を示します。
そして最後に、mouseUp:
 $(document).mouseup( function(e) { if (isClicked) { if (Math.abs(dx) < lapse) { dx = 0; } var selfLeft = parseInt($thumb.css('left')); //    // "impulse * dx"    ,     var x = (selfLeft + impulse * dx); // ,        scroll box'a if (x < 0) { x = 0; } if ( (x + $thumb.width()) > $track.width() ) { x = $track.width() - $thumb.width(); } //    $thumb.stop().animate({'left': x + 'px'}, speed, 'easeOutQuart'); } isClicked = false; }); 

lapse変数はエラーを定義します。 つまり、 dxがこのエラーより小さい場合、アニメーションは発生しません。 値は目で選択されたものであり、あまり適切に選択されない場合があります。
インパルス変数は、スライダーに作用し、移動に必要な距離を決定するインパルスの値です。 実際、係数にdxを掛けます。 彼はまた目によって選ばれました。
速度 -アニメーションの速度。
これらのパラメーターの値を変更することで、特定のニーズに合わせてスクロールバーをカスタマイズできます。 必要に応じて、垂直スクロールを作成することは難しくありません。

おわりに


これはスクロールバーの完全な実装ではなく、ドラッグアンドドロップと「動的」スクロールに直接関与する部分のみです。 コードは非常にシンプルで、効果は非常に興味深いものです。
たとえば、ページネーション、画像ギャラリーなどを実装するときに使用できます。

UPD jQueryプラグインを作成しましたこちらからダウンロードできます。 どのように機能するか、単純なカルーセルの例を見ることができます...

使い方はとても簡単です:
 <div id="track"></div> 

 $('#track').kineticBar() 

Source: https://habr.com/ru/post/J136374/


All Articles