バランスの取れたデジタルスクロール効果を実現するJavaScript

バランスの取れたデジタルスクロール効果を実現するJavaScript

1. 実施の背景

先週、ユーザーがタスクを完了して紅包を受け取るアクティビティで、ユーザーがボタンをクリックした後に紅包を受け取るためのポップアップウィンドウを実装する必要がありました。ポップアップウィンドウが閉じられ、ユーザーが元のページに戻ったとき、ページ上の残高数字が各桁をスクロールする効果を表示する必要がありました。
今までこのようなエフェクトをやったことがなかったので、最初はどう実現すればいいのかわかりませんでした。GitHub で関連GitHubを探そうと思って、星が一番多いライブラリを見たのですが、 jQueryに依存していてnpmパッケージ経由で導入できないことがわかりました。不必要に感じます。元のプロジェクトは、DOM 操作を最小限に抑えることを目指したreactフレームワークに基づいていました。スクロールの問題を解決するには、 jQueryを導入する必要がありますが、これは適切ではないようです。そこで自分で実装してみることにし、まず他の人のアイデアを見てから自分で実装しました。

2. 実装のアイデア

実際には、ロールされた n 桁の数字をロールする各数字に分割し、各桁にロールされた対応する数字を含むコンテナーを動的に作成し、それを受信ターゲット コンテナーに格納します。対応する数字へのスクロールは、0 から対応する数字までの間隔でdivを動的に作成することで実現できます。div の内容は対応する数字であり、0 から n までの数字が書かれた縦長の紙のようなものです。その後、指定された時間内に 0 から目的の数字までスクロールします。

3. 実施プロセス

カプセル化する必要があるため、 classの形式で記述しましょう。これ以上面倒なことはせずに、すぐにコードに進みましょう。

/**
 * デジタルスクロール効果を実装するクラス*/
クラス DigitScroll {
  コンストラクタ(オプション) {
    // コンテナの DOM を取得します。取得できない場合はエラーがスローされます。this.container = document.querySelector(options.container);
    if (!this.container) {
      Error("コンテナがありません")をスローします。
    }
    this.container.style.overflow = "非表示";
    this.container.style.display = "flex";
    // 表示されるコンテナの高さはスクロール間隔でもあります。コンテナの高さを設定する必要があります。設定しない場合は、デフォルトは 30px です。
    this.rollHeight = parseInt(getComputedStyle(this.container).height) || 30;
    this.container.style.height = this.rollHeight + "px";
  }
  ロール(数値) {
    // 渡された数字をスクロール対象として分割し、各数字のコンテナを初期化します。this.initDigitEle(num);
    const numEles = this.container.querySelectorAll(".single-num");
    // 各桁のスクロールキューをトラバースして生成します。たとえば、スクロールが 7 に達した場合、スクロールアニメーション用に 0、1、2、3、4、5、6、7 のコンテンツを持つ 7 つの div を生成します [...numEles].forEach((numEle, index) => {
      定数curNum = 0;
      targetNum = Number(this.numberArr[index])とします。
      (現在の数値 >= 目標数値) の場合 {
        ターゲット数 = ターゲット数 + 10;
      }
      cirNum = curNum とします。
      // ドキュメントフラグメントをまとめて一度にノードに挿入します。constfragment = document.createDocumentFragment();
      // 0からターゲット番号に対応するdivを生成します
      (targetNum >= cirNum) の場合 {
        const ele = document.createElement("div");
        ele.innerHTML = cirNum % 10;
        cirNum++;
        フラグメント.appendChild(ele);
      }
      numEle.innerHTML = "";
      numEle.appendChild(フラグメント);
      //位置をリセット numEle.style.cssText +=
        "-webkit-transition-duration:0s;-webkit-transform:translateY(0)";
      タイムアウトを設定する(() => {
        numEle.style.cssText += `-webkit-transition-duration:1s;-webkit-transform:translateY(${
          -(ターゲット番号 - 現在の番号) * this.rollHeight
        }px);`;
      }, 50);
    });
  }
  // コンテナを初期化する initDigitEle(num) {
    // 数値の桁を分割する const numArr = num.toString().split("");
    // ドキュメントフラグメントをまとめて一度にノードに挿入します。constfragment = document.createDocumentFragment();
    numArr.forEach((項目) => {
      定数el = document.createElement("div");
      // 数字はスクロールされますが、. などの数字以外の文字はスクロールされません if (/[0-9]/.test(item)) {
        el.className = "single-num";
        el.style.height = this.rollHeight + "px";
        el.style.lineHeight = this.rollHeight + "px";
      } それ以外 {
        el.innerHTML = アイテム;
        el.className = "移動なし";
        el.style.verticalAlign = "下";
      }
      // el.style.float='左';
      フラグメント.appendChild(el);
    }, []);
    this.container.innerHTML = "";
    this.container.appendChild(フラグメント);
    //スクロールする数字を保存します。this.numberArr = numArr.filter((item) => /[0-9]/.test(item));
  }
}

これで、JavaScript を使用してスクロールバランスの数字を実現する方法についての記事は終了です。JavaScript を使用してスクロールバランスの数字を実現する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • js はデジタルスクロールの特殊効果を実現します
  • Vue.js は大画面のデジタルスクロールと反転効果を実現します
  • CountUp.js はデジタルスクロール効果を実現します
  • CountUp.jsデジタルスクロールプラグインの使い方の詳しい説明
  • CountUp.jsはデジタルスクロールの付加価値効果を実現します

<<:  html+css3で実装されたログインインターフェース

>>:  メタを使用してトラフィックキャッシュをキャンセルし、ページにアクセスするたびにページを更新して簡単にデバッグできるようにします。

推薦する

MySQL 増分バックアップとブレークポイントリカバリスクリプトの例

導入増分バックアップとは、完全バックアップまたは最後の増分バックアップの後、後続の各バックアップでは...

キャンバスはスクラッチカード効果を描画します

この記事では、キャンバスでスクラッチカード効果を描画するための具体的なコードを参考までに共有します。...

Vueは水平の斜めの棒グラフを実装します

この記事では、水平傾斜棒グラフを実装するためのVueの具体的なコードを参考までに共有します。具体的な...

2 つの MySQL ユーザー削除ステートメント (delete user と drop user) の違い

ヒント: MySQL では、ユーザーの作成と削除が頻繁に必要になります。ユーザーを作成するときは、通...

LinuxにVSCodeをダウンロードしてインストールし、プログラミングを使用して現在の時刻を出力する

rpmコマンドがソフトウェアのインストールに使用するパラメータはどれですか: -i rpm コマンド...

Javascriptでオブザーバーモードを実装する方法を教えます

目次オブザーバーパターンとは何ですか?シナリオシミュレーションコードの実装コードのリファクタリング要...

SpringBoot を MySQL に接続してデータを取得し、バックエンド インターフェースに書き込む方法

目次1. 新しいプロジェクトを作成する2. 依存関係を追加する3. SpringコンテナにDrive...

HTML+CSS+JSはナビゲーションバーのスクロールグラデーション効果を実現します

目次まず効果を見てみましょう:成し遂げる:要約:まず効果を見てみましょう: 成し遂げる: 1. ナビ...

アプレットにおけるwx.getUserProfileインターフェースの具体的な使用

最近、WeChatミニプログラムは、監査ミニプログラムのwx.loginおよびwx.getUserI...

MySQLインデックスの詳細

1. インデックスの原則インデックスは、列内の特定の値を持つ行をすばやく見つけるために使用されます。...

Linux で MySQL データベースのデータ ファイル パスを変更する手順

rpm インストール方法を使用して MySQL データベースをインストールした後、データ ファイルの...

CSSレイアウトにおけるフローティング問題に対する4つの解決策の詳細な説明

1. 原因:サブボックスをフロートに設定した後の効果: 青いボックスをフロートに設定すると、標準のド...

JSにおける合同と不等式、等式と不等式の問題について

目次一致と不一致一致するすべてが平等ではない平等と不平等等しい等しくない一致と不一致シンボルの両側の...

複数サーバーの負荷分散を実現するためのNginx構成

Nginx ロード バランシング サーバー: IP: 192.168.0.4 (Nginx-Serv...

MySQL の最適化: 高品質の SQL 文を書く方法

序文インターネット上にはデータベースの最適化に関する情報や方法が数多くありますが、その多くは品質にば...