進捗バーがスムーズではないフロントエンドを学ぶ学生のほとんどは、オーディオプレーヤーやビデオプレーヤーを自分で作成しており、実装は複雑ではないと思います。最近、Weiboで動画を視聴するのと同様の要件がミニプログラムに作成されました。一部の機能では、カスタム プログレス バーの実装が必要です。最初のバージョンを完了した後、プログレス バーがスムーズでないことに気付きました。その後、オンラインで調べて、良い解決策があるかどうかを確認したいと思いましたが、結局適切なものは見つかりませんでした。そこで、WeChatミニプログラム内の「Weibo」プログレスバーがどのように見えるかを確認したかったのですが、結果も非常に硬いアニメーションになりました。下にGIFを置きました。自分でWeChatミニプログラムでWeiboを検索して、効果を確認するビデオを見つけることもできます。 従来の解決策最終的に、この問題を最適化することにしました。まず、既存の従来のソリューションを確認しましょう。
既存のソリューションは、現在の再生時間を取得するためにイベントに依存しており、このイベントは約 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 アニメーション プロパティを使用することはすぐに考えられます。柔軟な制御が必要な場合は、トランジションを使用することを選択します。トランジションは、アニメーションの実行期間を定義できます。幅を変更すると、トランジションは指定された時間内にプログレス バーの幅をアニメーションで変更します。まず、アニメーションの実行期間は固定する必要があり、前回の実行期間が終了する前に幅を変更しないことが最善です。そうしないと、競合が発生し、アニメーションがおかしくなります。
ちょっとわかりにくいので、図を描いてみましょう。
コアコード: 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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: VMware 仮想マシンでの CentOS7 ネットワーク構成 (ホストのワイヤレス インターネット アクセス)
2つの目的のためのリソースの結合と圧縮httpリクエストの数を減らす要求されたリソースのサイズを縮小...
MySQL 5.7.9 のインストールチュートリアルを録画してみんなと共有しましょう環境の紹介:オペ...
最初で最も重要なステップは、Windows 環境に Ngnix サービスをインストールする方法です。...
1. はじめにこれまで、テキストの特定の部分を強調したい場合、通常は太字にしたり明るい色を使用したり...
通常、私たちが構築する Docker イメージはサイズが大きく、多くのディスク領域を占有します。コン...
ソース ファイルを右クリックすると、次のコードが見つかります。 1. CSSを使用してFirefox...
1. Apache Benchの紹介ApacheBench は、Apache サーバーに付属する W...
目次一致と不一致一致するすべてが平等ではない平等と不平等等しい等しくない一致と不一致シンボルの両側の...
目次1. MySQLのバックアップタイプの詳細な説明1. バックアップがデータベースに与える影響に基...
目次1. マップは任意のタイプのキーを受け入れます2. マップにはキー名に関する制限はありません3....
1. 各関数はオブジェクトであり、メモリを占有します。メモリ内のオブジェクトが増えるほど、パフォーマ...
モバイル デバイス向けに開発する場合、Retina 画面上で要素の境界線が太くなるという問題に遭遇す...
序文最近、クライアントのネイティブページを引き継ぎました。顧客は、ページが IE9 以降のバージョン...
1. 既存のnginxがipv6をサポートしているかどうかを確認する既存の nginx が ipv6...
日付ピッカーをカプセル化する場合、選択時にフォントの色を暗くする必要があります。実装後の効果を見てみ...