この記事では、プロセスの進行状況バーの読み込み効果を実装する簡単な方法を提供します。これを使用して、ページ上の時間のかかるタスクの完了の進行状況をより適切にフィードバックできます。この関数を実装するには、まず、次のような静的なプログレス バー効果を実装する方法を検討する必要があります。
これは比較的単純で、2 つの div だけで、公式のブートストラップです。複数のテーマを備えた進行状況バー コンポーネントを提供します。自分で使いたい場合は、他の人のコードを参考にして自分流に書いてみると実はとてもわかりやすいです:
.progress { height: 20px; background-color: #f5f5f5; border-radius: 4px; box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);}.progress-bar { float: left; width: 0; height: 100%; font-size: 12px; line-height: 20px; color: #fff; text-align: center; background-color: #337ab7; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); position: relative; border-radius: 4px;}
2 番目のステップは、進捗の計算方法を検討することです。リソースの読み込みを例にとると、クライアントの場合、通常、リソースの実際のサイズを読み取る権限があるため、読み込みの進行状況を計算するときは、読み込まれたデータの量を合計量で割るだけで済みます。 ; ただし、Web ページでは、ロードするリソースのサイズを取得する機能がないため、ロードされるリソースの数を総数で割る、より精度の低いソリューションを使用することしかできません。リソースの。次の計算方法に基づいて、時間のかかる各タスクが完了した時点で完了したタスクの進行状況を計算し、対応する進行状況バーの幅を設定するだけです。
以下では、タイマーを使用して、同時に開始されるが、このステップの機能を実装するために完了するまでに異なる時間が必要な 4 つの非同期タスクをシミュレートします。
<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <link href="loader.css" rel="stylesheet"></head><body><div id="loader" class="loader"> <div class="progress"> <div class="progress-bar progress-bar-striped"> <div class="progress-value"></div> </div> </div></div></body><script src="jquery.js"></script><script> var $bar = $('#loader').find('.progress-bar'); var $value = $bar.find('.progress-value'); var Task = function (index, duration) { setTimeout(function () { var p = (index / 4 * 100).toFixed(0) + '%'; $bar.css('width',p); $value.text(p); console.log('第' + index + '个异步任务执行完毕'); }, duration); }; //模拟四个同时发起的异步任务 var task1 = new Task(1, 1000); var task2 = new Task(2, 3000); var task3 = new Task(3, 5000); var task4 = new Task(4, 7000);</script></html>
実際の効果は次のとおりです。 :
このステップに到達すると、基本的なプログレス バーの読み込み関数が実際に実装されました。ただし、上記の効果はあまり良い体験とは言えないようなので、このプログレスバーの進捗値を次のように連続的に変更できれば最高です:
このステップを実現するために、トランジションを使用することを考える人もいるかもしれませんが、プログレスバーに幅 .2s のようなトランジションを設定することで、プログレスバーの幅が変化したときに、自然に効果が確認できます。進行状況バーが継続的に変化します。このアプローチには 2 つの問題があります:
1. 遷移によって数値をある値から別の値に移行できないため、数値を連続的に変更することはできません;
2. 進行状況バーが表示されない100% にロードします。時間のかかるタスクの完了の進行状況が 100% の場合、進行状況バーの幅を 100% に設定することに加えて、通常は進行状況バーを非表示または削除するロジックがあり、進行状況バーには遷移 元の幅から 100% に遷移するには一定の時間がかかるため、ユーザーには 100% が表示されません。
ただし、これら 2 つは大きな問題ではありません。進行状況番号のない進行状況バーも非常に一般的です。また、進行状況バーが 100% 未満のときにメイン関数シーンに入る影響も非常に一般的です。この効果により、ユーザーはロードが非常に速いと錯覚することがあります。 。
上記の 2 つの問題に対処したい場合、継続的な変更を満足できる数値と進行状況を持ち、進行状況バーが読み込み効果を 100% 表示した後にのみメイン シーンに入る関数を実装する方法?次の同様の効果と同様です:
この要件では、注意する必要がある点が 2 つあると思います:
まず、タスクが完了しました この時点では、残りのタスクがまだ完了していない可能性があります。この時点では、進行状況バーは待機状態になります。次の読み込みが表示される前に、他のタスクが完了し、新しい進行状況が表示されるまで待つ必要があります効果;
#プログレスバーが 100% までロードされたときのコールバック コントロールです。タスク完了の進捗状況が 100% の場合、プログレス バーが 100% にならない場合があります。プログレス バーが表示されるまでに時間がかかります。現在の値から 100% に変更するには、メイン シーンに入るなど、タスク完了の進捗状況が 100% のときに追加される一部のロジックは、プログレス バーが 100% にロードされた時点で処理する必要があることがわかります。
上記を踏まえた私のアイデアは次のとおりです:
1. 時間のかかるタスクの完了ごとに進行状況の値が対応するため、進行状況バーの変化を複数のセグメントに分割します。これらの値は 0 より大きく 100 以下であり、時間のかかる 4 つのタスクを例として、進行状況バーを 0 ~ 25、25 ~ 50、75 ~ 100 の 3 つのセグメントに分割します。
##2. ステップ 1 のセグメント化を抽象化する これは進行状況バーを備えたロード タスクになり、このタスクには 2 つの基本属性 (ロード時間と変更間隔) があります。このタスクをアニメーションにします。アニメーションの各実行中に、外部にコールバックを提供し、現在の進行状況値を渡して進行状況バーの幅を設定します。現在の進行状況の値は、アニメーションの実行時間、読み込み時間、変更間隔に基づいて計算できます。変更間隔は、ステップ 1 のパーセント範囲に対応します。ロード時間は、間隔範囲 * プログレス バーが 1% ロードされるのに必要な時間を変更することで計算できます。つまり、アニメーションの 1% をロードするのに必要な時間は一定と見なす必要があります。利便性を高めるため、アニメーションを 0 から 100% までロードするのに必要な時間が、より適切に制御するための定数として使用されます。3. ステップ 2 の抽象読み込みタスクを格納するキューを定義します。キュー内の最初のタスクの実行タイミングを制御します。タスクが実行されるたびに、次のタスクが自動的に実行されます。
4. タスクの進捗が 100% になり、キュー内の最後のタスクが完了したら、コールバックを外部に通知します。
このデモの実際の効果は、前の gif とまったく同じです。
これまでのところ、比較的実用的に見える進行状況バーの読み込み効果を制御するコンポーネントができました。ただし、問題がないわけではなく、プログレス バーのロードにかかる時間が、手順 2 で設定したプログレス バーを 0 から 100% まで一気にロードするのにかかる時間よりも確実に長くなるという問題があります。時間。言い換えれば、このアプローチは、時間のかかるタスクのプロセス全体を意図的に遅らせることになります。したがって、実際の使用においては、上記の定数をあまり長く定義することはできません。
最後に、このコンポーネントは、以前に画像のプリロードについて書いたコンポーネントと組み合わせて使用すると、より完璧な画像のプリロード効果を作成できます。
この記事の内容が皆様の実務のお役に立てれば幸いです。
以上がシンプルで実用的なプログレスバー読み込みコンポーネントloader.jsの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。