皆さん、こんにちは!
今回は、タイトルの通りinviewを使用して、ウィンドウ表示領域内に入ったら
chart.jsを動かしつつ、1ページに複数chart.jsを実装する方法をご紹介します。
では早速実装方法から!
まずはCDNでもダウンロードして導入でもどちらでもOKなので
①通常のjQuery
②inview.js
③chart.js
④chart.css
の順に読み込みを行います。
1つでも欠ければうまくいかないので気を付けてくださいね!
<script src="//code.jquery.com/jquery-3.5.1.js"></script> <script src="/arch4/js/jquery.inview.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.css">
chart.jsを表示させたい箇所に下記を記述します。(IDは任意でOK)
<canvas id="myLineChart"></canvas> //折れ線グラフ <canvas id="mybarChart"></canvas> //帯グラフ
早速JSを記述します。
まずはinview.jsとchart.jsの単純な組み合わせのソースを記載します。
chartが1つの場合。
$(function () {
$('#myLineChart').on('inview', function (event, isInView, visiblePartX, visiblePartY) {//折れ線グラフまたは帯グラフのID指定
if (isInView) {
var ctx1 = document.getElementById("myLineChart"); //折れ線グラフまたは帯グラフのID指定
if (ctx1) {
var myLineChart = new Chart(ctx1, {
type: 'line', //折れ線グラフの場合はline、帯の場合はbarを指定
data: {
//ここに中身を記載
}
});
}
}
});
});
chart.jsが2つの場合は下記のようになります。
$(function () {
$('#myLineChart').on('inview', function (event, isInView, visiblePartX, visiblePartY) {//折れ線グラフまたは帯グラフのID指定
if (isInView) {
var ctx1 = document.getElementById("myLineChart"); //折れ線グラフまたは帯グラフのID指定
if (ctx1) {
var myLineChart = new Chart(ctx1, {
type: 'line', //折れ線グラフの場合はline、帯の場合はbarを指定
data: {
//ここに中身を記載
}
});
}
}
});
$('#mybarChart').on('inview', function (event, isInView, visiblePartX, visiblePartY) {//折れ線グラフまたは帯グラフのID指定
if (isInView) {
var ctx2 = document.getElementById("mybarChart"); //折れ線グラフまたは帯グラフのID指定
if (ctx2) {
var myLineChart = new Chart(ctx1, {
type: 'bar', //折れ線グラフの場合はline、帯の場合はbarを指定
data: {
//ここに中身を記載
}
});
}
}
});
});
ここで重要なのが下記の記述部分。
var ctx1 = document.getElementById("myLineChart"); //折れ線グラフまたは帯グラフのID指定
if (ctx1) { }
このctx(なんでもよいのですが)数を必ず増やしてあげるなり、特定のvarをしっかりつけてあげてください。
じゃないとグラフが一つだけ表示されて、2つ目が表示されなくなったりします。
具体的に実装すると下記のような感じ。
$(function () {
$('#myLineChart').on('inview', function (event, isInView, visiblePartX, visiblePartY) {
if (isInView) {
var ctx1 = document.getElementById("myLineChart");
if (ctx1) {
var myLineChart = new Chart(ctx1, {
type: 'line',
data: {
labels: ['A', 'B', 'C'],
datasets: [
{
label: 'テスト1',
data: [64, 68, 84],
borderColor: "rgba(168, 176, 219,1)",
backgroundColor: "rgba(0,0,0,0)",
fill: false,
lineTension: 0,
},
{
label: 'テスト2',
data: [57, 64, 75],
borderColor: "rgba(229, 181, 186,1)",
backgroundColor: "rgba(0,0,0,0)",
fill: false,
lineTension: 0,
},
{
label: 'テスト3',
data: [50, 58, 67],
borderColor: "rgba(231, 208, 183,1)",
backgroundColor: "rgba(0,0,0,0)",
fill: false,
lineTension: 0,
},
{
label: 'テスト4',
data: [9, 29, 69],
borderColor: "rgba(229, 225, 203,1)",
backgroundColor: "rgba(0,0,0,0)",
fill: false,
lineTension: 0,
},
{
label: 'テスト5',
data: [44, 48, 62],
borderColor: "rgba(188, 217, 166,1)",
backgroundColor: "rgba(0,0,0,0)",
fill: false,
},
{
label: 'テスト6',
data: [35, 45, 59],
borderColor: "rgba(155, 205, 170,1)",
backgroundColor: "rgba(0,0,0,0)",
fill: false,
lineTension: 0,
},
{
label: 'テスト7',
data: [24, 32, 46],
borderColor: "rgba(168, 176, 219,1)",
backgroundColor: "rgba(0,0,0,0)",
fill: false,
lineTension: 0,
},
],
},
options: {
title: {
display: true,
fontSize: 18,
text: 'テスト値に対する数位'
},
legend: {
// 右上に配置
align: 'start',
position: 'right',
// 余白
labels: {
padding: 15
}
},
scales: {
yAxes: [{
ticks: {
suggestedMax: 90,
suggestedMin: 0,
stepSize: 10,
fontSize: 16,
callback: function (value, index, values) {
return value + '%'
}
},
scaleLabel: {
display: true,
labelString: '← 低 テスト改善率 高 →',
fontColor: '#333',
fontSize: 16,
},
}],
xAxes: [{
ticks: {
fontSize: 16,
},
scaleLabel: {
display: true,
labelString: '← 低 テストグレード 高 →',
fontColor: '#333',
fontSize: 16,
},
}]
},
}
});
}
}
});
$('#myChart').on('inview', function (event, isInView, visiblePartX, visiblePartY) {
if (isInView) {
var ctx2 = document.getElementById("mybarChart");
if (ctx2) {
var myChart = new Chart(ctx2, {
type: 'bar',
data: {
labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
datasets: [
{
label: 'シュミレーションの電気代',
data: [20000, 20000, 18000, 14000, 11000, 11000, 14000, 17000, 13500, 12000, 14000, 17000],
backgroundColor: "rgba(219,39,91,0.5)"
},
{
label: '実際の電気代',
data: [17000, 16000, 9000, 13700, 10800, 7000, 9000, 13700, 14000, 12000, 9900, 11000],
backgroundColor: "rgba(130,201,169,0.5)"
}
]
},
options: {
title: {
display: false,
text: 'シュミレーションと実際の電気代の比較'
},
tooltips: {
enabled: false
},
animation: {
duration: 1000,
easing: 'linear',
from: 1,
to: 0,
loop: true
},
scales: {
yAxes: [{
ticks: {
suggestedMax: 25000,
suggestedMin: 0,
stepSize: 5000,
callback: function (value, index, values) {
return "¥" + value
}
}
}]
},
}
});
}
}
});
});
同じようなことでつまずいている人の参考になれば幸いです。
それでは!