ホームページ ウェブフロントエンド jsチュートリアル JS はスクロールのカスタムスクロール効果を実装します

JS はスクロールのカスタムスクロール効果を実装します

Jan 15, 2018 pm 01:16 PM
javascript scroll カスタマイズ

この記事では、JS を使用してスクロールのカスタム スクロール効果を実装する方法について主に紹介し、サンプル コードを通じて詳細に紹介します。この記事は、学習や仕事に必要な学習に役立ちます。以下、一緒に学びましょう。皆さんのお役に立てれば幸いです。

まえがき

最近、会社でプロジェクトを開発していたところ、ネイティブのスクロールバーの一部が細かい制御用にカスタマイズできなかったので、better-scrollに似たブラウザのスクロール監視のJS実装を開発しました。以下では、スクロールのカスタマイズに必要な考慮事項とそのプロセスについて説明します。多くを語る必要はありません。詳細な紹介を見てみましょう。

スクロール監視イベントを選択します

これは携帯電話上のカスタム スクロール イベントであるため、監視を実装するために携帯電話上の 3 つのタッチ イベントを監視することを選択し、2 つのスクロール効果を実装しました。1 つは -webkit-transform によるもので、 1 つは、top 属性を介したものです。 2 つの実装はスクロールの基本的な効果を実現できますが、top はスクロール中のスクロールには適していませんが、スクロールの postion:fixed 属性の問題は解決できますが、transform はスクロール中のスクロールを実現できますが、次の問題は解決できません。 :問題を修正したので、最終的にはどの実装方法を使用するかを選択的に検討します。

主にビジネス ロジックを実装します

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

handleTouchMove(event){

 event.preventDefault();

 this.currentY = event.targetTouches[0].screenY;

 this.currentTime = new Date().getTime();

 // 二次及以上次数滚动(间歇性滚动)时间和路程重置计算,0.05是间歇性滚动的停顿位移和时间比

 if (Math.abs(this.currentY - this.lastY) / Math.abs(this.currentTime - this.lastTime) < 0.05) {

  this.startTime = new Date().getTime();

  this.resetY = this.currentY;

 }

 this.distance = this.currentY - this.startY;

 let temDis = this.distance + this.oldY;

 /*设置移动最小值*/

 temDis = temDis > this.minValue ? temDis * 1 / 3 : temDis;

 /*设置移动最大值*/

 temDis = temDis < -this.maxValue ? -this.maxValue + (temDis + this.maxValue) * 1 / 3 : temDis;

 this.$el.style["top"] = temDis + 'px';

 this.lastY = this.currentY;

 this.lastTime = this.currentTime;

 this.dispatchEvent();

 this.scrollFunc(event);

},

ログイン後にコピー

コード解釈: これは touchmove イベントをリッスンするためのコールバックであり、主にターゲット ノードの先頭 this.$el または -webkit-transform のtranslateY の値を計算します。計算の基準は主にイベントノードのscreenYの垂直移動距離を基準として使用されます。もちろん、移動が最大値と最小値を超えることができるかどうかを判断する必要があります。一定距離離れると1/3の移動計算が加算されます。ここでの主なものは断続スクロールの判断と計算であり、これは主に慣性スクロールとして機能し、慣性スクロールの値をより正確にすることを目的としています。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

handleTouchEnd(event){

 /*点透事件允许通过*/

 if (!this.distance) return;

 event.preventDefault();

 let temDis = this.distance + this.oldY;

 /*计算缓动值*/

 temDis = this.computeSlowMotion(temDis);

 /*设置最小值*/

 temDis = temDis > this.minValue ? this.minValue : temDis;

 /*设置最大值*/

 temDis = temDis < -this.maxValue ? -this.maxValue : temDis;

 this.$el.style["transitionDuration"] = '500ms';

 this.$el.style["transitionTimingFunction"] = 'ease-out';

 /*确定最终的滚动位置*/

 setTimeout(()=> {

  this.$el.style["top"] = temDis + 'px';

 }, 0);

 // 判断使用哪一种监听事件

 if (this.slowMotionFlag) {

  this.dispatchEventLoop();

 else {

  this.dispatchEvent();

 }

 this.$el.addEventListener('transitionend', ()=> {

  window.cancelAnimationFrame(this.timer);

 });

 this.scrollFunc(event);

}

ログイン後にコピー

コード解釈: これはタッチエンド イベント監視のコールバックであり、クリック イベントとタップ イベントをインターセプトするかどうかを決定する必要があり、慣性イージング値を計算し、最終的な最大値と最小値を設定し、アニメーション効果と緩和効果。ローリングローリングの計算について話しましょう:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

// 计算惯性滚动值

computeSlowMotion(temDis){

 var duration = new Date().getTime() - this.startTime;

 // 300毫秒是判断间隔的最佳时间

 var resetDistance = this.currentY - this.resetY;

 if (duration < 300 && Math.abs(resetDistance) > 10) {

  var speed = Math.abs(resetDistance) / duration,

   destination;

  // 末速度为0 距离等于初速度的平方除以2倍加速度

  destination = (speed * speed) / (2 * this.deceleration) * (resetDistance < 0 ? -1 : 1);

  this.slowMotionFlag = true;

  return temDis += destination;

 else {

  this.slowMotionFlag = false;

  return temDis;

 }

},

ログイン後にコピー

コード解釈: ローリングローリングのアルゴリズムは、主に距離と時間に基づいて初速度を計算し、元のローリングの加速度に基づいてローリングの総変位を計算します。 0.006。ここで重要なのは300msの経験値を判断することです。

概要

これは一般的なプロセスと考え方です。拡張のために将来さらに多くの機能が追加される予定です

Git アドレスを添付します: https://github.com/yejiaming/scroll

関連する推奨事項:

jQueryスクロールプラグインscrollable.jsの使用分析について

WeChatアプレットのスクロールビューコンポーネントの詳細な説明

vueはベタースクロールを使用してカルーセル画像とページスクロールを実装します

以上がJS はスクロールのカスタムスクロール効果を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Netflix でカスタム アバターをすばやくセットアップする方法 Netflix でカスタム アバターをすばやくセットアップする方法 Feb 19, 2024 pm 06:33 PM

Netflix でカスタム アバターをすばやくセットアップする方法

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法

Eclipseでショートカットキー設定をカスタマイズする方法 Eclipseでショートカットキー設定をカスタマイズする方法 Jan 28, 2024 am 10:01 AM

Eclipseでショートカットキー設定をカスタマイズする方法

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー

ediusカスタム画面レイアウトの操作手順 ediusカスタム画面レイアウトの操作手順 Mar 27, 2024 pm 06:50 PM

ediusカスタム画面レイアウトの操作手順

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法

ExcelでX軸とY軸をカスタマイズするにはどうすればよいですか? (Excelの軸スケールをカスタマイズする方法) ExcelでX軸とY軸をカスタマイズするにはどうすればよいですか? (Excelの軸スケールをカスタマイズする方法) Mar 14, 2024 pm 02:10 PM

ExcelでX軸とY軸をカスタマイズするにはどうすればよいですか? (Excelの軸スケールをカスタマイズする方法)

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法

See all articles