canvasで作るドーナツグラフと円グラフ
canvasでドーナツグラフと円グラフを作りました。
複数必要だったので、何個も置けるようにしました。
See the Pen 180930_canvasで作るドーナツグラフと円グラフ by nekuta (@nekuta) on CodePen.
<div class="demo">
<p>ドーナツグラフ</p>
<ul class="demo_list">
<li>
<div class="graph_box">
<div class="graph_box_wrap white"> <canvas width="100" height="100" id="" class="match_graph" data-percent="15"></canvas>
<div class="graph_box_percent"><span></span>%</div>
</div>
</div>
</li>
<li>
<div class="graph_box">
<div class="graph_box_wrap white"> <canvas width="100" height="100" id="" class="match_graph" data-percent="40"></canvas>
<div class="graph_box_percent"><span></span>%</div>
</div>
</div>
</li>
<!--中略-->
</ul>
</div>
<div class="demo">
<p>円グラフ</p>
<ul class="demo_list">
<li>
<div class="graph_box">
<div class="graph_box_wrap"> <canvas width="100" height="100" id="" class="match_graph" data-percent="15"></canvas>
<div class="graph_box_percent block"><span></span>%</div>
</div>
</div>
</li>
<li>
<div class="graph_box">
<div class="graph_box_wrap"> <canvas width="100" height="100" id="" class="match_graph" data-percent="40"></canvas>
<div class="graph_box_percent block"><span></span>%</div>
</div>
</div>
</li>
<!--中略-->
</ul>
</div>
SCSS
html {
font-size: 62.5%;
color: #333;
}
p {
font-size: 1.6rem;
}
.demo_list {
list-style-type: none;
margin: 0;
padding: 0;
>li {
display: inline-block;
margin: 0 20px;
}
}
//seeker-match
.graph_box {
padding: 5px;
box-sizing: border-box;
}
.graph_box_wrap {
position: relative;
width: 100px;
height: 100px;
margin: 0 auto;
&.white {
&:after {
content: "";
position: absolute;
display: block;
width: 70px;
height: 70px;
background: #fff;
top: 0;
left: 0;
bottom: 0;
right: 0;
margin: auto;
border-radius: 50% 50%;
}
}
}
.graph_box_percent {
position: absolute;
display: inline-block;
width: 100%;
top: 50%;
left: 0;
text-align: center;
font-size: 1rem;
font-weight: bold;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
z-index: 1;
&.block {
display: block;
position: static;
margin-top: 20px;
}
span {
font-size: 2rem;
font-weight: bold;
}
}
javascript
var cleate_graph = function(name, percent) {
var element = document.getElementById(name);
var context = element.getContext("2d");
context.beginPath();
var angleA = 360 * (percent / 100);
var angleB = 360 * ((100 - percent) / 100);
context.beginPath();
context.arc(50, 50, 50, (0 - 90) * Math.PI / 180, (angleA - 90) * Math.PI / 180, false);
context.lineTo(50, 50);
context.fillStyle = "#16a4b4";
context.fill();
context.beginPath();
context.arc(50, 50, 50, (angleA - 90) * Math.PI / 180, ((angleA + angleB) - 90) * Math.PI / 180, false);
context.lineTo(50, 50);
context.fillStyle = "#EBEBEB";
context.fill();
};
var match_graph = document.getElementsByClassName('match_graph');
for (var i = 0; i < match_graph.length; i++) {
match_graph[i].setAttribute('id', 'graph_' + i);
var name = match_graph[i].getAttribute('id');
var percent = match_graph[i].getAttribute('data-percent');
var percent_num = match_graph[i].nextElementSibling.getElementsByTagName('span');
percent_num[0].textContent = percent;
cleate_graph(name, percent);
}
canvasで円グラフを作る
canvasで円グラフを作るのはこちらのサイトさんを参考にしました。というよりほぼコピペです。
Canvasで円グラフを描く方法 | syncer
https://lab.syncer.jp/Web/JavaScript/Canvas/12/
複数あるのでcanvasにそれぞれidを振る
match_graphというclassを持つものを探してその個数分forで回しています。
そこにsetAttributeでそれぞれidを振っていきます。
var cleate_graph = function(name, percent) {
//中略
};
var match_graph = document.getElementsByClassName('match_graph');
for (var i = 0; i < match_graph.length; i++) { //match_graphのにそれぞれidを振っていく
match_graph[i].setAttribute('id', 'graph_' + i);
var name = match_graph[i].getAttribute('id') //data-percentを取得
var percent = match_graph[i].getAttribute('data-percent'); //match_graphの次の要素(graph_box_percent)からspanを探す
var percent_num = match_graph[i].nextElementSibling.getElementsByTagName('span'); //spanにdata-percentの値を入れる
percent_num[0].textContent = percent; //グラフを描画
cleate_graph(name, percent);
}
参考サイト
Canvasで円グラフを描く方法 | syncer
https://lab.syncer.jp/Web/JavaScript/Canvas/12/