Vue で円形プログレスバーを実装する例

Vue で円形プログレスバーを実装する例

データ表示は、常にあらゆる職業の人々が求めているものです。特にフロントエンド開発業界では、データを表示するさまざまなグラフや表が非常に煩わしい(複雑すぎる)ものです。
数日前、折れ線グラフ、棒グラフ、円グラフなどのグラフィカルなデータ表示効果を作成しました。今日、円形のプログレスバーに似た表示効果に遭遇しました。毎日データとインターフェースを扱っています。たくさんのプロジェクトをこなしてきましたが、まだまだ新人です。涙ばかりです!
率直に言うと、私はキャンバスと CSS3 に精通していないので、既製のホイールを見つけました。

<テンプレート>
 <div class="content" ref="box">
 <svg スタイル="transform: rotate(-90deg)" :width="width" :height="width" xmlns="http://www.w3.org/2000/svg">
  <circle :r="(幅-半径)/2"
  :cy="幅/2"
  :cx="幅/2"
  :stroke-width="半径"
  :stroke="背景色"
  塗りつぶし="なし"
  />
  <circle ref="$bar"
  :r="(幅-半径)/2"
  :cy="幅/2"
  :cx="幅/2"
  :stroke="バー色"
  :stroke-width="半径"
  :stroke-linecap="isRound ? 'round' : 'square'"
  :stroke-dasharray="(幅-半径)*3.14"
  :stroke-dashoffset="isAnimation ? (幅-半径) * 3.14 : (幅 - 半径) * 3.14 * (100 - 進行状況) / 100"
  塗りつぶし="なし"
  />
 </svg>
 <div class="center_text" :style="{color, fontSize}">
  <p v-if="!$slots.default" class="title">{{進捗状況}}%</p>
  <スロット></スロット>
 </div>
 </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
 小道具: {
 半径:
  タイプ: [数値、文字列],
  デフォルト: 20
 }, // プログレスバーの太さ progress: {
  タイプ: [数値、文字列],
  デフォルト: 20
 }, // 進捗バーのパーセンテージ barColor: {
  タイプ: 文字列、
  デフォルト: "#1890ff"
 }, // 進捗バーの色 backgroundColor: {
  タイプ: 文字列、
  デフォルト: "rgba(0,0,0,0.3)"
 }, // 背景色 isAnimation: {
  // アニメーション効果のタイプ: ブール値、
  デフォルト: true
 },
 ラウンド: {
  // 円形ブラシタイプかどうか: ブール値、
  デフォルト: true
 },
 id: {
  // 複数のコンポーネントが共存する場合に使用されるコンポーネントID type: [String, Number],
  デフォルト: 1
 },
 間隔: {
  // アニメーション全体の継続時間 type: [String, Number],
  デフォルト: 1000
 },
 遅れ:
  // 実行を遅らせる時間 type: [String, Number],
  デフォルト: 200
 },
 時間関数: {
  // アニメーションイージング関数の型: 文字列、
  デフォルト: "cubic-bezier(0.99, 0.01, 0.22, 0.94)"
 },
 円の幅: {
  //リング幅タイプ: 数値、
  デフォルト: 100、
 },
 色:
  //テキストカラータイプ: 文字列、
  デフォルト: '#000'
 },
 フォントサイズ: {
  //テキストサイズタイプ: 文字列、
  デフォルト: '18px'
 }
 },
 データ() {
 戻る {
  幅: this.circleWidth、
  idStr: `circle_progress_keyframes_${this.id}`
 };
 },
 破棄する前に() {
 // 古いコンポーネントのスタイルタグをクリアします document.getElementById(this.idStr) &&
 ドキュメントの要素を削除します。
 ウィンドウにイベントリスナーを追加します(() => {});
 },
 マウント() {
 自分自身 = this とします。
 this.setCircleWidth();
 アニメーションを設定します。
 // window.onresize はここでは使用できない
 ウィンドウにイベントリスナーを追加します(
  「サイズ変更」、
  デバウンス(関数() {
  自己.setCircleWidth();
  アニメーションを設定します。
  }, 300)
 );
 },
 メソッド: {
 setCircleWidth() {
  box = this.$refs.box; とします。
  幅をbox.clientWidthとします。
  高さをbox.clientHeightとします。
  cW = 幅 > 高さ ? 高さ : 幅 とします。
  幅 = cW;
 },
 アニメーションを設定する() {
  自分自身 = this とします。
  アニメーションが動作している場合
  // 定義を繰り返します if (document.getElementById(self.idStr)) {
   console.warn("vue-circle-progress は同じ ID スタイルを持つことはできません");
   ドキュメントの要素をIDで取得します。
  }
  // アニメーション スタイル ファイルを生成します。let style = document.createElement("style");
  スタイルID = self.idStr;
  スタイルの種類 = "text/css";
  スタイル.innerHTML = `
  @keyframes サークル_進行状況_keyframes_name_${self.id} {
  {stroke-dashoffset: ${(self.width - self.radius) * 3.14}px;} から
  {stroke-dashoffset: ${((self.width - self.radius) *
  3.14 *
  (100 - 自己進歩)) /
  100}ピクセル;}}
  .circle_progress_bar${
  自己ID
  } {アニメーション:circle_progress_keyframes_name_${self.id} ${
   自己持続時間
  }ms ${self.delay}ms ${self.timeFunction} 前進;}`;
  // 新しいスタイルファイルを追加します document.getElementsByTagName("head")[0].appendChild(style);
  // svg要素にアニメーションクラスを追加
  self.$refs.$bar.classList.add(`circle_progress_bar${self.id}`);
  }
 }
 }
};
</スクリプト>
<スタイルスコープ>
.content {height:100%;display:flex;justify-content:center;align-items:center;}
.center_text {位置:絶対;}
</スタイル>

方向:

<CircleProgress :id="'circle1'" :circleWidth="40" :radius="7" :progress="30" :isAnimation="true" :backgroundColor="'#E9E9E9'" :barColor="'#FF4F4F'" />
<CircleProgress :id="'circle2'" :circleWidth="40" :radius="7" :progress="50" :isAnimation="true" :backgroundColor="'#E9E9E9'" :barColor="'#FF902A'" />
<CircleProgress :id="'circle3'" :circleWidth="40" :radius="7" :progress="89" :isAnimation="true" :backgroundColor="'#E9E9E9'" :barColor="'#FFDB4F'" />
<CircleProgress :id="'circle4'" :circleWidth="40" :radius="7" :progress="25" :isAnimation="true" :backgroundColor="'#E9E9E9'" :barColor="'#B8D87E'" />

ページ上で同時に 2 つ以上の円形プログレス バーを使用する場合は、円形プログレス バーごとに異なる ID を設定する必要があることに注意してください。そうしないと、すべての円で最終的に表示されるデータは最後の円のデータになります。

コードには手ぶれ防止機能があり、その機能は次のとおりです。

関数 debounce(func, wait, immediate) {
 タイムアウト、引数、コンテキスト、タイムスタンプ、結果

 const later = 関数() {
 // 最後のトリガー時間間隔に従って const last = +new Date() - timestamp

 // ラップされた関数が最後に呼び出されたとき、時間間隔 last は設定された時間間隔 wait よりも短い
 (最後が<待機&&最後> 0)の場合{
  タイムアウト = setTimeout(later, wait - last)
 } それ以外 {
  タイムアウト = null
  //immediate===true に設定されている場合、開始境界がすでに呼び出されているため、ここで呼び出す必要はありません if (!immediate) {
  結果 = func.apply(コンテキスト、引数)
  if (!timeout) コンテキスト = 引数 = null
  }
 }
 }

この記事では、npm の円形プログレスバー プラグインvue-circleprogressbarについて言及しています。このプラグインがプロジェクトに直接インストールされ使用されていない理由は、このプラグインが開発ニーズを完全に満たしていないためです。たとえば、このプラグインでは、円の幅、テキストの色、テキストのサイズを設定できません。別の例として、このプラグインは、手ぶれ補正のためだけに lodash に依存しています (この lodash のサイズはまだ非常に大きいです)。

このコンポーネントを react で使用する場合、 react ライフサイクル、 react hooks の構文、または dva モードの構文に応じて、少し変更するだけで使用できます。非常に簡単なので、詳しく説明しません。

著者: 小淮

出典: http://tnnyang.cnblogs.com

上記は、円形プログレスバーを実装するVueの例の詳細です。円形プログレスバーを実装するVueの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Vue は動的な円形のパーセンテージ進捗バーを実装します
  • vue+ElementUI+echarts フロントエンドとバックエンドのインタラクションを使用して、Springboot プロジェクトで動的なドーナツ チャートを実現する (推奨)
  • Springboot は、vue+echarts のフロントエンドとバックエンドのインタラクションを使用して、動的なドーナツ チャートを実現します。
  • Vue 円形パーセンテージ プログレスバー コンポーネントの機能の実装
  • Vueは3/4ドーナツチャートの効果を動的に描画します
  • echarts を使用して Vue でドーナツ チャートを作成するサンプル コード
  • Vueはキャンバスを使用して円を描画します

<<:  Linux コマンドを素早く習得する 4 つの方法

>>:  Windows でのシンプルな Mysql バックアップ BAT スクリプトの共有

推薦する

シェルで文字列内のスペースや指定された文字を削除する方法

インターネット上には、正しい方法であっても、使用しても正しい結果が得られない方法が数多くあります。正...

vuex で履歴を実装するためのサンプルコード

私は最近、ユーザー操作を元に戻す、またはやり直す機能を備えたビジュアル操作プラットフォームを開発して...

JavaScript クロージャの説明

目次1. クロージャとは何ですか? 2. クロージャの役割2.1) メモリ2.2) プライベート変数...

フォーム送信時に追加のパラメータを渡すためのいくつかの一般的な方法

フォームを送信するときに、送信前に追加のパラメータが追加される状況が発生する場合があります。この問題...

Linux の操作とメンテナンスの基本的なスワップ パーティションと LVM 管理のチュートリアル

目次1. スワップパーティション SWAP 1.1 スワップファイルを作成する1.2 スワップパーテ...

DockerコンテナのライフサイクルアーキテクチャとVMとの違いについて詳しく説明します。

コンテナのライフサイクルコンテナランタイムのライフサイクルコンテナは、分離特性を持つプロセスのセット...

MySQL 学習: 初心者のための 3 つのパラダイム

目次1. パラダイム基盤1.1 パラダイムの概念2. 3つの主要なパラダイム2.1 3つの主要なパラ...

Ubuntu の Python で C/C++ メソッドを呼び出すダイナミック リンク ライブラリの詳細な説明

ブーストをインストールPython から C/C++ を呼び出す方法はたくさんあります。この記事では...

Vue が天気予報機能を実装

この記事では、天気予報機能を実現するためのVueの具体的なコードを参考までに共有します。具体的な内容...

前後の秒、分、時間、日数を取得するMySQLデータベース

現在の時刻を取得します: current_timestamp を選択します。出力: 2016-06-...

メタ情報に基づいて時間指定のページ更新またはリダイレクトを実装する

メタを使用して、ページの時間指定更新またはジャンプを実装します。 XML/HTML コードコンテンツ...

CSS3 フレックスレイアウトを使用して要素を均等に分散するサンプルコード

この記事では主に、CSS3 フレックスレイアウトを使用して要素を均等に配置する方法を紹介します。自分...

Dockerにelasticsearchとkibanaをインストールする方法

Elasticsearchは現在非常に人気があり、多くの企業が利用しているため、esを知らないと軽蔑...

Linux で open-vswitch をインストールおよびアンインストールする方法

1. ソースコードからovsをコンパイルしてインストールします。依存関係をインストールします: # ...

ウォーターフォールフローレイアウト(無限読み込み)を実現する js

この記事の例では、ウォーターフォールフローレイアウトを実装するためのjsの具体的なコードを参考までに...