バランスの取れたデジタルスクロール効果を実現する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で実装されたログインインターフェース

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

推薦する

画像を使用してハイパーリンクのパーソナライズされた下線を実現します

画像内に下線付きのリンクが表示されても驚かないでください。実はとても簡単なので、あなたにもできるので...

Vue3 の ref toRef と toRefs の違いを理解する方法

目次1. 基本1.参照2. 参照3. 参照4. 最適な使い方2. 詳細な1. なぜrefが必要なのか...

TypeScript でオブジェクト キーの値の範囲を制限する方法

TypeScript を使用する場合、TypeScript が提供する型システムを使用してコードのあ...

DockerHubイメージリポジトリの使い方の詳しい説明

これまで使用していたイメージはすべて DockerHub パブリック リポジトリから取得していました...

VMware Workstation 12 Pro Linux インストール チュートリアル

この記事は、VMware Workstation 12 ProのインストールLinuxチュートリアル...

Ant Design Pro ログイン機能にグラフィック検証コード コンポーネントを統合する方法

序文:この記事では、Ant Design Proログイン機能にグラフィック検証コードコンポーネントを...

Docker に Elasticsearch 7.6.2 をインストールするチュートリアル

DockerをインストールするDocker をインストールする必要がありますが、それ以上の指示はあり...

Vue Element-ui はツリーコントロールノードを実装し、アイコンを追加します。詳細な説明

目次1. レンダリング2. データをバインドし、ツリーテーブルにラベルを追加する3. すべてのコード...

Vue のスロットスコープの詳細な理解(初心者向け)

Baidu には slot-scope に関する記事が既にたくさんありますが、以前よく学習しておら...

MySQL 8.0.13 解凍版のインストールと設定方法のグラフィックチュートリアル

1. インストール1. MySQLをダウンロードするダウンロードアドレス: リンクアドレスブラウザで...

Vue 3 で Vue Router リンクを拡張する方法

序文<router-link> タグは、Vue アプリ内のさまざまなページ間を移動するた...

JSでよく使われるデータ処理方法

目次DOM処理配列方法要約するDOM処理DOM はドキュメントの構造化された表現を提供し、スクリプト...

MySQLでルートユーザーのパスワードを変更する方法

方法1: SET PASSWORDコマンドを使用する mysql> username@loca...

クラウドサーバーはBaotaを使用してPython環境を構築し、Djangoプログラムを実行します。

目次PagodaをインストールするPythonランタイム環境を構成するPythonをインストールする...

Ubuntu 14 に Nginx-RTMP ストリーミング サーバーをインストールするチュートリアル

1. RTMP RTMP ストリーミング プロトコルは、Adobe が開発したリアルタイムのオーディ...