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 スクリプトの共有

推薦する

HTML Web ページにおける URL の表現

HTML では、一般的な URL はさまざまな方法で表現されます。相対 URL:コードをコピーコード...

MySQL では UTF-8 が推奨されないのはなぜですか?

最近、Rails 経由で「utf8」でエンコードされた UTF-8 文字列を MariaDB に保存...

mysqldump でデータベースをバックアップするときに特定のライブラリを除外する例

例: mysqldump –all-databases を使用すると、すべてのライブラリがエクスポー...

シンプルなページカウントダウンを実現するJavaScript

この記事では、参考までに、シンプルなページカウントダウンを実装するためのJavaScriptの具体的...

Vue ページ スタック マネージャーの詳細

目次2. 試した方法2.1 キープアライブ2.2 ネストされたルートを持つ CSS 3. 機能説明4...

WeChatミニプログラムが星評価を実装

この記事では、WeChatアプレットで星評価を実装するための具体的なコードを参考までに紹介します。具...

JavaScript 配列の include と Reduce の基本的な使用法

目次序文配列.プロトタイプ.includes文法パラメータ戻り値例配列プロトタイプの削減文法パラメー...

RedHat 6.5 に MySQL 5.7 をインストールするための詳細なチュートリアル

RedHat6.5インストールMySQL5.7チュートリアル共有、参考までに、具体的な内容は次のとお...

Linux環境にJDKとTomcatをインストールする詳細な手順

目次1. JDKをインストールする手動インストール2. トムキャット1. JDKをインストールする注...

Mysql接続数の設定と取得方法

接続数を取得する --- 最大接続数を取得します。SHOW VARIABLES LIKE '...

MySQLキーワードDistinctの詳細な紹介

MySQLキーワードDistinctの使い方の紹介DDL SQLを準備します: テーブルテストを作成...

vue data が関数である理由をご存知ですか?

公式サイトの説明: コンポーネントを定義する場合、コンポーネントは複数のインスタンスを作成するために...

reactにおけるstateの略語の詳細な説明

序文国家とは何か私たちは皆、React はステート マシンであると言います。それはどのように反映され...

Dockerイメージを完全にアンインストールする手順

1. docker ps -a 実行中のイメージプロセスを表示する [root@mylinux~]#...

CentOS 7 は Hadoop 2.10 の高可用性 (HA) をビルドします

この記事では、CentOS 7 で高可用性 Hadoop 2.10 クラスターを構築する方法を紹介し...