Vue 円形パーセンテージ プログレスバー コンポーネントの機能の実装

Vue 円形パーセンテージ プログレスバー コンポーネントの機能の実装

必要な方はどなたでも参考にしてください。試してみて問題が見つかった場合は、メッセージを残してお知らせください。大変ありがたく思います。

機能紹介:

1. ページが更新されず、最初の値が2番目の値より小さい場合、またはリングが初期化されたときに増分アニメーションが実行された場合

2. ページが更新されず、最初の値が2番目の値より大きい場合、減少アニメーションが実行されます。

3. 中央に表示されるパーセンテージの数字はゆっくりとしたアニメーションになります(速度は円形の進行アニメーションと同じです)

4. アニメーションが完了するとアニメーション完了コールバックがトリガーされます。

5. 外部値は円の進行率(整数)、円のアニメーション速度(整数)です。

効果は図に示されています:

<テンプレート>
  <div class="パーセントループ">
    <div class="circle-left">
      <div ref="左コンテンツ"></div>
    </div>
    <div class="circle-right">
      <div ref="rightcontent"></div>
    </div>
    <div class="数値">
      {{パーセント}} %
    </div>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  小道具: {
    パーセント数: {
      タイプ: [文字列、数値],
      デフォルト: 0
    },
    speed: { // 推奨値は0~3です
      タイプ: [文字列、数値],
      デフォルト: 1
    }
  },
  データ () {
    戻る {
      パーセント: 0,
      初期度: 0,
      タイムID: null、
      アニメーション: false
    }
  },
  メソッド: {
    transformToDeg (パーセント) {
      度 = 0 とする
      (パーセント >= 100)の場合{
        度 = 360
      } それ以外 {
        度 = parseInt(360 * パーセント / 100)
      }
      戻る度
    },
    パーセントに変換(度) {
      パーセントを0にする
      (度 >= 360)の場合{
        パーセント = 100
      } それ以外 {
        パーセント = parseInt(100 * 度 / 360)
      }
      リターン率
    },
    rotateLeft (deg) { // 角度が180より大きい場合、アニメーションが実行されます this.$refs.leftcontent.style.transform = 'rotate(' + (deg - 180) + 'deg)'
    },
    rotateRight (deg) { // 角度が180未満の場合はアニメーションが実行されます this.$refs.rightcontent.style.transform = 'rotate(' + deg + 'deg)'
    },
    回転(度) {
      this.animationing = true
      this.timeId = setInterval(() => {
        if (deg > this.initDeg) { // 増分アニメーション this.initDeg += Number(this.speed)
          (this.initDeg >= 180)の場合{
            this.rotateLeft(this.initDeg)
            this.rotateRight(180) // 2 回渡されたパーセンテージから変換された値がステップ長の整数でなくなり、左右の回転が失敗する可能性がある状況を回避します。
          } それ以外 {
            this.rotateRight(this.initDeg)
          }
        } else { // アニメーションを減らす this.initDeg -= Number(this.speed)
          (this.initDeg >= 180)の場合{
            this.rotateLeft(this.initDeg)
          } それ以外 {
            this.rotateLeft(180) // 2 回渡されたパーセンテージから変換された値がステップ長の整数でなくなり、左右の回転が失敗する可能性がある状況を回避します。
            this.rotateRight(this.initDeg)
          }
        }
        this.percent = this.transformToPercent(this.initDeg) // パーセンテージデータのスクロールアニメーション const remainer = Number(deg) - this.initDeg
        もし (Math.abs(remainer) < this.speed) {
          this.initDeg += 残り
          (this.initDeg > 180)の場合{
            this.rotateLeft(度)
          } それ以外 {
            this.rotateRight(度)
          }
          this.animationFinished()
        }
      }, 10)
    },
    アニメーション終了(){
      this.percent = this.percentNum // パーセンテージデータのスクロールアニメーション this.animationing = false
      クリア間隔(this.timeId)
      this.$emit('animationFinished') // アニメーションが完了したときのコールバック}
  },
  作成された(){
    this.goRotate(this.transformToDeg(this.percentNum))
  },
  時計:
    'パーセント数値': 関数 (値) {
      if (this.animationing) 戻り値
      this.goRotate(this.transformToDeg(val))
    }
  }
}
</スクリプト>

<スタイル スコープ lang="scss">
.パーセントループ{
  位置: 相対的;
  幅: 100%;
  高さ: 100%;
  境界線の半径: 50%;
  オーバーフロー: 非表示;
  .circle-left、.circle-right {
    位置: 絶対;
    上: 0;
    左: 0;
    幅: 50%;
    高さ: 100%;
    背景色: 赤;
    オーバーフロー: 非表示;
    &>div {
      幅: 100%;
      高さ: 100%;
      背景色: #8a8a8a;
      変換の原点: 右中央;
      /*遷移: すべて 0.5 秒線形;*/
    }
  }
  .circle-right {
    左: 50%;
    &>div {
      変換の原点: 左中央;
    }
  }
  。番号 {
    位置: 絶対;
    上位:9%
    下位:9%
    左:9%
    右:9%
    背景色: #fff;
    境界線の半径: 50%;
    オーバーフロー: 非表示;
    ディスプレイ: フレックス;
    アイテムの位置を中央揃えにします。
    コンテンツの中央揃え: 中央;
    色: #000;
  }
}
</スタイル>

上記は、vue 円形パーセンテージ プログレス バー コンポーネント機能の実装の詳細な内容です。vue プログレス バーの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

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

<<:  CentOS 7 で MySQL 5.7.23 をアップグレードする際の落とし穴と解決策

>>:  nginx がアップストリーム アドレスにジャンプしない問題の解決方法

推薦する

Dockerfile に基づいて Tomcat イメージを構築する方法

Dockerfile は Docker イメージを構築するために使用されるファイルです。コマンドパラ...

docker に openjdk をインストールして jar パッケージを実行する方法

画像をダウンロード docker プル openjdkデータボリュームの作成java_appデータボ...

MySQL 外部キー制約の無効化と有効化コマンド

MySQL 外部キー制約の無効化と有効化: MySQL 外部キー制約が有効になっているかどうかは、グ...

MySQL 8.0.15 インストール グラフィック チュートリアルとデータベースの基礎

MySQLソフトウェアのインストールとデータベースの基礎は参考用です。具体的な内容は次のとおりです。...

MySQL InnoDBエンジンのインデックスとストレージ構造の詳細な説明

序文Oracle や SQL Server などのデータベースには、ストレージ エンジンが 1 つだ...

MySQL の暗号化と復号化の例

MySQL の暗号化と復号化の例データの暗号化と復号化はセキュリティ分野で非常に重要です。プログラマ...

自動ヘルスレポートを実現するDocker+Selenium方式

この記事では、ある大学の健康報告システムを例に、Web 側の自動化操作を完成させます。使用したテクノ...

Docker-Composeコマンドの使い方の詳しい説明

Docker コンテナはさまざまな方法で管理およびデプロイできます。 Docker コマンドを直接使...

反応ジャンプ後にルートが変更されてもページが更新されない場合の解決策

目次質問解決質問この問題には多くの理由があるようです。私の問題は、パラメータ付きのURLを更新できな...

MySQLの通常インデックスとユニークインデックスの違いの詳しい説明

目次1 概念上の区別2 事例紹介3 クエリパフォーマンス4 アップデートのパフォーマンス4.1 記憶...

リモートログインとポート公開を防ぐためのLinuxサーバー構成IPホワイトリスト

序文ブロガーが使用しているサーバーは Alibaba Cloud から購入したものです。実際、Ali...

Node.js+express+socket でオンラインのリアルタイム多人数チャットルームを実現

この記事では、オンラインリアルタイム多人数チャットルームを実現するためのNode.js+expres...

Linux での Centos7 ファイアウォールの基本的な使用方法の詳細な説明

1. ファイアウォールの基本的な使い方起動する: systemctl は、firewalld を起動...

MySQLクエリ条件のnot inとinの違いと理由

まずSQLを書く SELECT DISTINCT from_id タラから cod.from_id ...

VMware で Nginx+KeepAlived クラスタ デュアルアクティブ アーキテクチャを展開する際の問題と解決策

序文負荷分散には nginx を使用します。アーキテクチャのフロントエンドまたは中間層として、トラフ...