Javascript でプログレスバーを作る
web ページ上に進行状況を表示するためにプログレスバーを作りたくなりました。Canvas を使えば javascript で作れると考えました。
Canvas は使ったことがあるのですが、プログレスバーのサイズを可変にしたいと思ったところ、canvas タグでは可変にできないことがわかりました。css と組み合わせることで可変にできます。
Canvas でプログレスバーを実装した後、調べてみれば、progress タグで実現できることがわかりました。こちらの方が簡単です。
Canvas
canvas タグで指定したサイズは、描画領域の仮想的なサイズのようです。css でサイズの指定をしない場合は、この仮想的なサイズと表示上のサイズは同じになります。
ところが、css でサイズを指定すると、表示上のサイズと描画領域の仮想的なサイズに違いが出ます。Javascript で canvas に描画する際には、描画領域の仮想的なサイズをもとに描画します。
なぜ css でサイズを指定しようとしたのかといえば、通常の要素のサイズ指定は css ですべきだと考えているからです。html のタグでは文章の構造を示し、サイズや色などの見た目は css で整えると学びました。
また、Canvas タグで指定するサイズに可変サイズは指定できません。例えば、css で幅を 100% にした場合は、ウィンドウサイズによって伸び縮みします。
以下のような css と html の場合を試してみます。
Canvas のサイズ
css
.drawarea {
border: 1px solid #040;
color: #0ff;
background-color: #0f0;
}
#drawarea1 {
}
#drawarea2 {
}
#drawarea3 {
width: 200px;
height: 10px;
}
#drawarea4 {
width: 100%;
height: 10px;
}
html
<div>サイズ指定なしでCanvas を作成</div>
<canvas id="drawarea1" class="drawarea">描画領域</canvas>
Canvas サイズ:<span id="size1"></span>
<div>canvas タグで width と height を指定(200 x 100)</div>
<canvas id="drawarea2" class="drawarea" width="200" height="100">描画領域</canvas>
Canvas サイズ:<span id="size2"></span>
<div>css で width と height を指定(200px x 10px)</div>
<canvas id="drawarea3" class="drawarea">描画領域</canvas>
Canvas サイズ:<span id="size3"></span>
<div>タグ(200 x 10)と css(100% x 10px) で width と height を指定</div>
<canvas id="drawarea4" width="200" height="10" class="drawarea">描画領域</canvas>
Canvas サイズ:<span id="size4"></span>
javascript
<script>
let n = 0;
let canvas1 = document.getElementById('drawarea1');
let canvas2 = document.getElementById('drawarea2');
let canvas3 = document.getElementById('drawarea3');
let canvas4 = document.getElementById('drawarea4');
document.getElementById('size1').innerHTML = canvas1.width+' x '+canvas1.height;
document.getElementById('size2').innerHTML = canvas2.width+' x '+canvas2.height;
document.getElementById('size3').innerHTML = canvas3.width+' x '+canvas3.height;
document.getElementById('size4').innerHTML = canvas4.width+' x '+canvas4.height;
</script>
この結果、次のように表示されます。

プログレスバー
Canvas を使ったプログレスバーは次のように作ります。
css
#progressbar {
width: 100%;
height: 5px;
border: 1px solid #040;
color: #0ff;
background-color: #0f0;
}
html
<canvas id="progressbar" width="200" height="5">進行状況</canvas>
javascript
<script>
let n = 0;
setInterval(progressbar, 1000);
function progressbar() {
let canvas = document.getElementById('drawarea5');
if( canvas.getContext ) {
let ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillRect(0, 0, canvas.width*n/100, canvas.height);
}
n = (n+1) % 101;
}

Progress タグ
progress タグを使えば簡単にできます。
css
#progressbar {
width: 100%;
}
html
<progress id="progressbar" value="0" max="100">プログレスバー</progress>
javascript
<script>
let n = 0;
setInterval(progressbar, 1000);
function progressbar() {
document.getElementById('progressbar').value = n;
n = (n+1) % 101;
}
</script>

Canvas で苦労する必要はなかったようです。
ディスカッション
コメント一覧
まだ、コメントがありません