質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

1881閲覧

[Chart.js][JavaScript]再生数グラフ付きプレーヤー開発・再生位置カーソルを追加したい

退会済みユーザー

退会済みユーザー

総合スコア0

Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2021/09/21 09:24

前提・実現したいこと

視聴数を棒グラフ化して画面にオーバーレイ表示されるプレーヤーを開発中です。
イメージ説明
プレーヤー部分に再生箇所を示す赤いドットを表示させようとしていて、その前段階として別ファイルにてプレーヤー上に赤ドットを表示させました。
イメージ説明この赤ドットをウィンドウではなく棒グラフ項目のトップに表示させる方法は可能でしょうか。
また現状では棒グラフ項目をクリックするとドットが表示されますが、ドットがロード時に表示され、マウスの動きに応じて移動(各項目のトップを移動するイメージ)させたいです。

発生している問題・エラーメッセージ

座標や項目位置を取得する方法を調べていますが、Chart.jsはバージョンによって挙動がだいぶ変わるようで現バージョンでの情報が見つけられていません。

該当のソースコード

<html> <head > <meta http-equiv="Content-Style-Type" content="text/html"> <title>Chart.js Sample</title> </head> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.5.1/chart.min.js"></script> <body> <canvas id="myChart"></canvas> <script> var data_labels = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30] var canvas = document.getElementById( 'myChart' ); var context = canvas.getContext('2d'); var graph = { type: 'bar', data: { labels: data_labels, datasets: [{ label: 'Views', data: [ 35, 25, 33, 15, 18, 6, 20, 39, 12, 8, 6, 15, 35, 30, 23, 10, 8, 5, 11, 30, 35, 39, 40, 41, 32, 20, 12, 9, 3, 1 ], backgroundColor: [ 'rgba(99, 204, 132, 0.2)' ], barPercentage: 1, categoryPercentage: 1, }] }, options: { title: { display: false, }, responsive: true, legend: { display: false, }, scales: { x: { display: false, }, y: { display: false, } }, } }; var myGraph = new Chart( canvas, graph ); canvas.addEventListener ('click', function(e) { var item = myGraph.getElementsAtEventForMode(e, 'nearest', true); if ( item.length == 0 ) { return; } console.log(item); item = item[0]; var idx = item.index; var x_right = myGraph.chartArea.right; var x_left = myGraph.chartArea.left; var x_width = ( x_right - x_left ) / data_labels.length; var y_height = myGraph.chartArea.height; var y_top = myGraph.chartArea.top; var draw_x0 = x_width * idx; context.beginPath(); context.arc( draw_x0 + x_left, y_top, 10, 0 * Math.PI / 180, 360 * Math.PI / 180 ); context.fillStyle = "red"; context.fill(); }); </script> </body> </html>

試したこと

補足情報(FW/ツールのバージョンなど)

Chart.js 3.5.1

将来的には以下内容を実装したいと考えています。

  • プレーヤー(videoタグ?)の再生位置に応じてカーソル位置を動かす

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

公式ドキュメントのコード例を少し変えただけですが・・・

js

1() 2 options: { 3          () 4 plugins: { 5 tooltip: { 6 enabled: false, 7 external: function(context) { 8 var tooltipEl = document.getElementById('chartjs-tooltip'); 9 if (!tooltipEl) { 10 tooltipEl = document.createElement('div'); 11 tooltipEl.id = 'chartjs-tooltip'; 12 13 var canvas_ = document.createElement("canvas"); 14 canvas_.height = 30; 15 canvas_.width = 30; 16 tooltipEl.appendChild(canvas_); 17 document.body.appendChild(tooltipEl); 18 19 context_ = canvas_.getContext('2d') 20 context_.beginPath(); 21 context_.arc( 22 10, 23 10, 24 10, 25 0 * Math.PI / 180, 26 360 * Math.PI / 180 27 ); 28 context_.fillStyle = "red"; 29 context_.fill(); 30 } 31 32 var tooltipModel = context.tooltip; 33 if (tooltipModel.opacity === 0) { 34 tooltipEl.style.opacity = 0; 35 return; 36 } 37 // グラフ内部にカーソルがなくてもツールチップがX軸方向に動くようにするためには、以下2行の設定が必要。 38 tooltipModel.options.intersect = false; 39 tooltipModel.options.mode = 'x'; 40 41 var position = context.chart.canvas.getBoundingClientRect(); 42 var bodyFont = Chart.helpers.toFont(tooltipModel.options.bodyFont); 43 44 tooltipEl.style.opacity = 1; 45 tooltipEl.style.position = 'absolute'; 46 tooltipEl.style.left = position.left + window.pageXOffset + tooltipModel.caretX -10+ 'px'; 47 tooltipEl.style.top = position.top + window.pageYOffset + tooltipModel.caretY -10+ 'px'; 48 tooltipEl.style.font = bodyFont.string; 49 tooltipEl.style.padding = tooltipModel.padding + 'px ' + tooltipModel.padding + 'px'; 50 tooltipEl.style.pointerEvents = 'none'; 51 } 52 } 53 }, 54以下略

投稿2021/09/21 12:33

編集2021/09/21 12:35
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/09/22 02:49

ありがとうございます。 なるほど、ツールチップの表示を変えたということですね、そこは思いつきませんでした… ちなみに上記質問に派生した内容はここでやりとりしてもいいのか、それとも新たに質問立てた方がよろしいのでしょうか?(初めての利用なので。。)
退会済みユーザー

退会済みユーザー

2021/09/22 03:51 編集

新たに質問を立てていただいたほうがよろしいかと思います。
退会済みユーザー

退会済みユーザー

2021/09/22 04:08

了解しました、ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問