JSはプログレスバーのスムーズバージョンの詳細な計画を実装します

JSはプログレスバーのスムーズバージョンの詳細な計画を実装します

進捗バーがスムーズではない

フロントエンドを学ぶ学生のほとんどは、オーディオプレーヤーやビデオプレーヤーを自分で作成しており、実装は複雑ではないと思います。最近、Weiboで動画を視聴するのと同様の要件がミニプログラムに作成されました。一部の機能では、カスタム プログレス バーの実装が必要です。最初のバージョンを完了した後、プログレス バーがスムーズでないことに気付きました。その後、オンラインで調べて、良い解決策があるかどうかを確認したいと思いましたが、結局適切なものは見つかりませんでした。そこで、WeChatミニプログラム内の「Weibo」プログレスバーがどのように見えるかを確認したかったのですが、結果も非常に硬いアニメーションになりました。下にGIFを置きました。自分でWeChatミニプログラムでWeiboを検索して、効果を確認するビデオを見つけることもできます。

従来の解決策

最終的に、この問題を最適化することにしました。まず、既存の従来のソリューションを確認しましょう。

  • TimeUpdate イベントのリッスン
  • 現在の再生時間を取得し、合計時間に基づいて進行状況のパーセンテージを計算します (currentTime /duration * 100)
  • プログレスバーの幅プロパティは進行状況のパーセンテージを設定します

既存のソリューションは、現在の再生時間を取得するためにイベントに依存しており、このイベントは約 100 ~ 350 ミリ秒ごとに 1 回トリガーされます。以下は、記録したアプレットのイベント オブジェクト キューです。

[
    {"詳細":{"現在の時間":0.10509,"継続時間":5.83}},
    {"詳細":{"現在の時間":0.364527,"期間":5.83}},
    {"詳細":{"現在の時間":0.613648,"期間":5.83}},
]

現在の問題は、イベントが取得されるたびに、進行状況バーが遷移アニメーションなしで更新され、非常に突然になることです。以下は、合計期間が 5 秒の進行状況バーの変更プロセスです。

コアコード:

定数 onProgress = (e, $dom) => {
    const updateFunc = (パーセント) => {
        $dom.style.width = パーセント+'%'
    }
    パーセント = ((e.detail.currentTime / e.detail.duration) * 100).toFixed(1) とします。
    updateFunc(パーセント)
}

遷移

最適化のために CSS アニメーション プロパティを使用することはすぐに考えられます。柔軟な制御が必要な場合は、トランジションを使用することを選択します。トランジションは、アニメーションの実行期間を定義できます。幅を変更すると、トランジションは指定された時間内にプログレス バーの幅をアニメーションで変更します。まず、アニメーションの実行期間は固定する必要があり、前回の実行期間が終了する前に幅を変更しないことが最善です。そうしないと、競合が発生し、アニメーションがおかしくなります。

  • 適切な遷移実行時間を選択してください: 0.5秒
  • 現在の合計継続時間に応じて、進行状況バーの 0.5 秒のパーセンテージを調べます (100/継続時間/2)
  • 最初のTimeUpdateイベントは幅の変更を実行し、プログレスバーを0.5秒の位置に設定します: width = 100/duration/2
  • 最初のTimeUpdateイベントではありません。currentTimeが前の進捗バーの位置を超えるたびに、現在の進捗バーのパーセンテージが更新されます。

ちょっとわかりにくいので、図を描いてみましょう。

  1. TimeUpdate イベントが 0.1336 秒 (もちろんこの値はランダムで、0.1 ~ 0.3 の間になります) で初めてトリガーされたときに、幅を 0.5 秒に設定して、実際の進行状況とのわずかな差 0.1 秒で進行状況バーがビデオと同期して動くようにします。アニメーション実行の 0.5 秒間に、UpdateTime が複数回トリガーされます。
  2. ある UpdateTime の currentTime (0.7123 秒、この値もランダム) が前回の実行の 0.5 秒より大きい場合、プログレス バーの位置も 0.5 秒付近になります。次の 0.5 秒のアニメーションを再度トリガーします。つまり、幅をプログレス バーの位置 1 秒に設定します。
  3. 次の反復では、currentTime>1s、width は 1.5s に設定され、サイクルが継続されます。

コアコード:

const プレイコントロール = {
  パーセント: 0,
  時間: 0,
  期間: 0,
  最初: 本当
}
定数 onProgress = (e, $dom) => {
    const updateFunc = (パーセント) => {
        playControl.percent = パーセント
        再生コントロール時間 = e.detail.currentTime
        $dom.style.width = パーセント+'%'
    }
    //現在のビデオの進行状況が初めて更新される if (playControl.first) {
        再生コントロール期間 = e.detail.duration
        playControl.first = false
        updateFunc(100 / e.detail.duration / 2)
    } それ以外 {
        パーセント = ((e.detail.currentTime / e.detail.duration) * 100).toFixed(1) とします。
        if (パーセント - playControl.percent > 0 || e.detail.currentTime >= e.detail.duration) {
            updateFunc(パーセント)
        }
    }
}

最終的な効果の比較(追記:gif画像の効果は損なわれています)

60年代バージョンは通常バージョンと似ていますか?他の 60 をブロックして比較してみると、まだいくつかの違いがあることがわかります。

まだ説明するのが少し難しいですか、それともまだ理解できないですか? github リポジトリのコードに直接アクセスすると、コードを直接実行できます: https://github.com/zimv/smooth-progress

このソリューションでは、一時停止、ドラッグなどの一部のシナリオで短い遅延が発生します。個人的には、利点が欠点を上回ると思います。

JS でスムーズなプログレスバーを実装するための詳細なソリューションに関するこの記事はこれで終わりです。スムーズな JS プログレスバーに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • JSは制御可能なプログレスバーを実装します
  • vue.js+ElementUI はパスワードの強度を促すプログレスバーの効果を実現します
  • JS+html5 で画像の非同期アップロードを実現し、アップロードファイルの進行状況バー機能の例を表示する
  • ネイティブ js で実装されたモバイル ドラッグ可能なプログレス バー プラグイン機能の詳細な説明
  • js+HTML5 キャンバスでシンプルな読み込みバー (プログレスバー) 関数を実装する例
  • JS でダウンロード進行状況バーと再生進行状況バーを実装するためのコード
  • JS ベースのアニメーション効果を備えたプロセス進行状況バーの実装

<<:  VMware 仮想マシンでの CentOS7 ネットワーク構成 (ホストのワイヤレス インターネット アクセス)

>>:  MySQLで適切なインデックスを選択する方法

推薦する

vue3 タイムスタンプ変換 (フィルターを使用せずに)

vue2 では、タイムスタンプを変換するときに、通常はフィルターを使用します。vue3 以降では、...

MySQLデータ復旧のさまざまな方法の概要

目次1. はじめに2. 直接回復2.1 mysqldumpバックアップの完全リカバリ2.2 xtra...

MySQLのグローバルロックとテーブルロックに関する詳細な理解

序文ロックの範囲に応じて、MySQL のロックは、グローバル ロック、テーブル ロック、行ロックに大...

Windows 64 ビットに MySQL を再インストールするチュートリアル (Zip バージョン、解凍バージョンの MySQL インストール)

MySQLをアンインストールする1. コントロールパネルで、MySQLのすべてのコンポーネントをア...

CentOS 7.5 が Varnish キャッシュサーバー機能を導入

1. ワニスの紹介Varnish は、高性能なオープンソースのリバースプロキシサーバーおよび HTT...

Linux システムでの gcc コマンドの使用法の詳細な説明

目次1. 前処理2. コンパイル3. コンパイル4. リンク1. gccのインストール(Ubuntu...

ドラッグ可能なログインボックスを実現するネイティブJS

この記事では、ネイティブ JS で実装されたドラッグ可能なログイン ボックスを紹介します。その効果は...

React.FCとReact.Componentの使用に関する簡単な説明

目次1. React.FC<> 2. クラスxxはReact.Componentを拡張し...

Vue のグローバル ウォーターマーク実装例

目次1. 透かしのJsファイルを作成する2. 導入操作2.1 App.vueや他のページでの参照2....

docker+gitlab+gitlab-runnerの詳細なデプロイメント

環境サーバー: centos7クライアント: ウィンドウCentos7 に docker+gitla...

vue+el-element でファイル名に応じてダイアログを動的に作成する実践

目次背景成し遂げる1. カプセル化された /utils/dialogControl.js 2.ダイア...

ローカルの Windows リモート デスクトップから Alibaba Cloud Ubuntu 16.04 サーバーに接続する方法

ローカル Windows リモート デスクトップが Alibaba Cloud Ubuntu 16....

タブ切り替え機能を実装するJavaScriptカスタムプラグイン

この記事では、タブ切り替え機能を実装するためのJavaScriptの具体的なコードを参考までに共有し...

Nginx 構成 SSL および WSS 手順の紹介

目次序文1. Nginxのインストール1. Nginxをダウンロードする2. 依存関係をインストール...

CocosCreator 学習モジュールスクリプト

Cocos Creator モジュラースクリプトCocos Creator を使用すると、コードを複...