Chart.js で縦幅を固定、横幅のみレスポンシブに対応する
JavaSCript のグラフ描画ライブラリの1つに、Chart.js がありよく使われています。
Chart.js は canvas 要素の上に描画します。
グラフ描画領域の縦横比(アスペクト比)は canvas の HTML に width
と height
で指定します。 これが表示サイズにもなります。
1 2 3 |
<canvas id="chart" width="400" height="300"> |
width
と height
を指定しないときのデフォルト値は width=300, height=150
です。
ブラウザの表示サイズに応じて、グラフの横幅を動的に変えたい場合があります。しかし canvas とレスポンシブの相性はなかなかやっかいな問題があります。canvas の幅を CSS で width: 100%;
などと指定してもうまくいきません。ぼやけたりゆがんだりしてしまいます。
CSS で幅と高さを指定したつもりでも、それは HTML で幅と高さを指定するのとは意味が異なります。canvas 要素の描画領域は HTML で指定した値(指定していなければデフォルト値)のままであり、それが CSS でしていしたサイズに引き延ばされて表示されるだけだからです。
canvas の横幅を動的に指定する
canvas の表示サイズだけでなく描画領域のサイズも動的に変更するには、JavaScript を使って canvas 要素の width
と height
属性の値をセットします。
このとき canvas に親要素を作っておきます。
1 2 3 4 5 |
<div class="canvas-container"> <canvas id="chart"></canvas> </div> |
親要素の幅と高さは CSS で指定しておきます。
1 2 3 4 5 6 7 8 9 |
.canvas-container { position: relative; width: calc(100% - 40px); height: 300px; overflow: hidden; margin:20px; } |
画面の読み込み完了後に canvas の幅と高さの値を JavaScript でセットします。jQuery でやるのであれば、以下のようになります。
1 2 3 4 5 6 7 8 |
$(function () { var container = $('.canvas-container'); var ctx= $('#chart'); ctx.attr('width', container.width()); ctx.attr('height', 300); }); |
上の例では高さは 300px 固定として書いていますが、もちろんこちらも動的に変更することができます。
Chart.js のオプションを指定してレスポンシブにする
さて canvas のサイズを動的に変えるのであれば、ウィンドウをリサイズしたときに canvas の再描画をしないと不都合です。
Chart.js では optionsに responsive: true,
を指定することで、自動的に対応してくれます。今回のように幅と高さの比率が動的に変化する場合は、maintainAspectRatio: false,
も指定してやるとうまく行きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$(function () { var container = $('.canvas-container'); var chart= $('#chart'); ctx.attr('width', container.width()); ctx.attr('height', 300); }); var myChart = new Chart(ctx, { type: 'line', data: { ... }, options: { responsive: true, maintainAspectRatio: false, scales: { ... }); }); |
ITエンジニア募集中!
キュアコード株式会社はITエンジニアを募集しております。少人数の職場なので、上流・下流やサーバー・クライアント対応の垣根なく、あなたの強みを活かしながら いろいろなことにチャレンジ可能です。エンジニアとしての未経験の方、経験が少ない方も歓迎しています。
下記よりITエンジニア募集の採用情報をご覧いただけます。