vue+canvasでタイムラインを描く方法

vue+canvasでタイムラインを描く方法

この記事では、参考までにvueキャンバスのタイムライン描画の具体的なコードを紹介します。具体的な内容は次のとおりです。

最近、キャンバス描画タイムラインを勉強しています。ここに直接コードがあります。共有することでお役に立てれば幸いです。効果は次のとおりです。

コードは以下のとおりです。これをvueプロジェクトにコピーして直接プレビューすることができます。

<テンプレート>
  <div>
    <canvas id="time_line" width="1200" height="27"></canvas>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前: 'pathwaytrack',
  データ() {
    戻る {
      画面幅: document.body.clientWidth
    }
  },
  マウント() {
    それを = これとする
    that.carveTimeScale(1200, 1, 10, 0, 10)
    キャンバスカラーを '#999999' にします
    initTime = 12000 とします
    間隔を設定する(() => {
      初期化時間 += 1000
      that.carveTimeScale(1200, 1, 10, initTime, 10)
    }, 1000);
  },
  メソッド: {
    /**
     * 分割ピクセルスケール* width: 幅 (ミリ秒): 小さいスケールの場合はミリ秒数 pxMs: 小さいスケールの場合は 10 ピクセル pageShowStartTime: 初期時間 (ミリ秒) 大きい間隔の継続時間 (秒)
     */
    carveTimeScale(幅、ミリ秒、ピクセル数、ページ表示開始時間、間隔時間) {
      canvasId = document.getElementById('time_line') とします。
      ctx = canvasId.getContext('2d') とします。
      ctx.clearRect(0, 0, 1200, 60)
      ctx.fillStyle = '#999999'
      // Apple 2X 画面で異常な表示を防ぐため // Apple 2X 画面で異常な表示を防ぐため var getPixelRatio = function (context) {
        var backingStore = context.backingStorePixelRatio ||
          context.webkitBackingStorePixelRatio ||
          context.mozBackingStorePixelRatio ||
          コンテキスト.msBackingStorePixelRatio ||
          コンテキスト.oBackingStorePixelRatio ||
          コンテキスト.backingStoreピクセル比 || 1
        戻り値 (window.devicePixelRatio || 1) / backingStore
      }
      比率 = getPixelRatio(ctx) とします。
      let msOffset = this.startOffsetTime(pageShowStartTime, ms) // 開始オフセット時間 ms
      let pxOffset = msOffset / 1000 * pxMs // 開始オフセット距離 px
      let leftDistance = 0 // 左への距離 let leftDistanceTime = 0 // 左への時間 let beginX = 0
      beginY = 0 とする
      (i = 0 とします; i < 幅 / (ms * pxMs); i++) {
        leftDistance = pxOffset + i * (ms * pxMs) // 距離 = 開始オフセット距離 + グリッド数 * px/グリッド leftDistanceTime = pageShowStartTime + msOffset + i * ms // 時間 = 左開始時間 + オフセット時間 + グリッド数 * ms
        beginX = pxOffset + i * (ms * pxMs)
        キャンバスカラー
        showTime = pageShowStartTime + beginX / pxMs * 1000 とします。
        表示時間% (間隔時間 * 1000) === 0の場合
          開始Y = 0
          ctx.font = '12px Arial'
          ctx.fillText(this.changeTime(showTime, 1), beginX + 10, 22)
          キャンバスカラー = '#999999'
          ctx.fillStyle = '#B1B1B1'
          this.drawLine(左距離、開始Y、左距離、20、キャンバスカラー、1)
        } そうでない場合 (showTime % intervalTime == 0) {
          開始Y = 0
          キャンバスカラー = '#999999'
          this.drawLine(左距離、開始Y、左距離、10、キャンバスカラー、1)
        }
      }
    },
    /**
     * 渡されたパラメータに従って線を描画します */
    描画線(開始X、開始Y、終了X、終了Y、色、幅) {
      canvasId を document.getElementById('time_line') に設定します。
      ctx = canvasId.getContext('2d') とします。
      ctx.beginPath();
      ctx.moveTo(開始X、開始Y);
      ctx.lineTo(終了X、終了Y);
      ctx.strokeStyle = 色;
      ctx.lineWidth = 幅;
      ctx.stroke();
    },
    /**
     * 左開始時間のオフセット(ミリ秒単位で返されます)
     */
    startOffsetTime(タイムスタンプ, ステップ) {
      残り = タイムスタンプ % ステップ
      残りを返す?ステップ - 残り: 0
    },
    /**
     * 帰りの時間 */
    changeTime(時間, 数値) {
      時間 = 0 とする
      分を 0 にする
      秒を 0 にする
      秒 = 時間 / 1000
      (秒 >= 3600)の場合{
        分 = (秒 - (秒 % 60)) / 60
        時間 = parseInt((分 / 60).toString())
        分 = 分 % 60
        /* eslint を無効にする */
        時間 >= 10 ? 時間 : 時間 = '0' + 時間
        分 >= 10 ? 分 : 分 = '0' + 分
        秒 = 秒 % 60
        秒 >= 10 ? 秒 : 秒 = '0' + 秒
        /* eslint を有効にする */
        時間 + ':' + 分 + ':' + 秒を返す
      }
      (秒<3600 &&秒>=60)の場合{
        時間 = '00'
        分 = parseInt((秒 / 60).toString())
        /* eslint を無効にする */
        分 >= 10 ? 分 : 分 = '0' + 分
        秒 = 秒 % 60
        秒 >= 10 ? 秒 : 秒 = '0' + 秒
        /* eslint を有効にする */
        時間 + ':' + 分 + ':' + 秒を返す
      }
      (秒数<60)の場合{
        時間 = '00'
        分 = '00'
        秒 = parseInt(秒)
        /* eslint を無効にする */
        秒 >= 10 ? 秒 : 秒 = '0' + 秒
        /* eslint を有効にする */
        時間 + ':' + 分 + ':' + 秒を返す
      }
    }
  }
}
</スクリプト>

<style lang="less" スコープ>
  キャンバス {
    背景:黒;
  }
</スタイル>

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vueは水平タイムラインを実装する
  • Vueはタイムライン機能を実装する
  • 2列の水平タイムラインを実装するためのVueサンプルコード
  • VUEはタイムライン再生コンポーネントを実装します
  • Vue.jsはタイムライン機能を実装します
  • Vue+swiperでタイムライン効果を実現
  • Vueは物流タイムライン効果を実現します
  • Vue タイムライン vue-light-timeline 使用方法
  • Vueは移動可能な水平タイムラインを実装します
  • Vueはタイムライン効果を実装する

<<:  SQL 面接の質問: 時間差の合計を求める (重複は無視)

>>:  CentOS8でルートパスワードを素早く変更する方法

推薦する

Vue のレスポンシブ原則と双方向データの詳細な分析

応答性を実現するための object.defineProperty の理解observe/watch...

Dockerfile をベースに Zabbix 監視システムのコード例を作成する

forループを使用してZabbixイメージをコンテナにインポートします。 n を `ls *.tar...

Mac で MySQL 8.0.22 のパスワードを取得する方法

Mac 最新バージョンの MySQL 8.0.22 パスワード回復問題の説明:昨日、突然、Macで最...

Ubuntu で FTP サーバーを構築する方法の詳細な説明 (成功保証)

1. 今日の午後、コースの要件により、Ubuntu で FTP サーバーを設定する実験を行う必要が...

JavaScript 正規表現の説明

目次1. 正規表現の作成2. 使用モード2.1 シンプルモードの使用2.2 特殊文字の使用3. 応用...

ドッカー専用倉庫港湾建設プロセス

1. 準備1.1 港ダウンロードハーバーダウンロードアドレス:リンクリンクの説明を追加し、必要なバー...

CSS3はテキストのレリーフ効果、彫刻効果、炎のテキストを実現します

この効果を実現するには、まず CSS のプロパティを知っておく必要があります。 text-shado...

Linux でのマルチスレッドプログラミング例の分析

1 はじめにスレッド技術は 1960 年代にすでに提案されていましたが、マルチスレッドがオペレーティ...

DockerでGDBを使用するときにブレークポイントを入力できない問題を解決する

質問docker で gdb を実行すると、ブレークポイントに到達しますが、ブレークポイントに入るこ...

Linux の一般的なテキスト処理コマンドと vim テキストエディタ

今日は、いくつかの一般的なテキスト処理コマンドとvimテキストエディタを紹介します。 3日目 - 一...

CSSボックスの表示/非表示とトップレイヤーの実装コード

.imgbox{ 幅: 1200ピクセル; 高さ: 612px; 右マージン: 自動; 左マージン...

MySQL 接続で認証失敗エラーが発生する場合の分析と解決方法

[問題の説明]アプリケーション側では、次のエラーが時々表示されます。メソッド 'mysql_...

Nginx を使用して DoNetCore を Alibaba Cloud にデプロイする方法

基本的な環境設定まずはご自身でドメイン名とサーバーを購入してくださいクラウドサーバーECSに基づいて...

React における setState の同期または非同期の問題の理解

目次1. setState は同期的ですか?非同期ですか? 2. 非同期的に動作する1. React...