【JavaScript入門】文字列の描画

 Canvas 2D API では図形だけでなく テキスト もピクセル単位で自由にレンダリングできます。ブラウザが持つフォント描画エンジンを利用しつつ、座標とプロパティを組み合わせて見出し・注釈・ゲームスコアなどをダイナミックに表示できるのが魅力です。ここでは “どこに・どんなスタイルで・どう揃えるか” を決める 設定プロパティ と、実際に文字列を置く 描画メソッド を整理し、サンプルコードで挙動を確認します。

1.文字列描画の設定プロパティ

プロパティ役割
fontフォントスタイル・サイズ・種類を CSS 書式でまとめて指定"italic bold 28px 'Noto Sans JP'"
textAlign水平方向の基準位置start / end / left / right / center
textBaseline垂直方向の基準線top / hanging / middle / alphabetic / ideographic / bottom

ポイント:縦基準 (textBaseline) はフォントごとに微妙に差が出るため、デザイン最終調整時は実描画を見ながら微調整しましょう。

2.文字列描画メソッド

メソッド役割
fillText(text, x, y[, maxWidth])指定位置に 塗りつぶし 描画
strokeText(text, x, y[, maxWidth])指定位置に 輪郭線 描画
measureText(text).width現在設定で描いた場合の 横幅 を取得

maxWidth を使うと長い文章でも自動で縮小されるため、可変レイアウトに便利です。

3.サンプルプログラム

ファイル名: text_draw_demo.html

PNGファイルのダウンロードは、ここ「checker.png」からできます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>🖋️ Canvas Text Demo</title>
<style>
  body  {font-family:"Segoe UI",sans-serif;background:#eef8ff;text-align:center;margin:2rem}
  h1    {font-size:1.8rem;margin-bottom:1rem}
  canvas{border:1px solid #666;border-radius:6px;background:url(./checker.png)}
  #info {margin-top:.8rem;color:#00695c;font-weight:bold}
</style>
</head>
<body>
  <h1>🖋️ 文字列の描画デモ</h1>
  <canvas id="stage" width="600" height="360"></canvas>
  <p id="info">文字揃え・基準線の比較を行いました!</p>

<script>
(() => {
  const ctx = document.getElementById('stage').getContext('2d');
  const CAN_W = ctx.canvas.width;
  const CAN_H = ctx.canvas.height;
  const ROW_H = 60;
  const SAMPLE = 'Canvas文字列123';

  /* 背景のガイド線 */
  ctx.fillStyle = '#ccc';
  ctx.fillRect(200, 0, 1, CAN_H);   // 左基準線
  ctx.fillRect(400, 0, 1, CAN_H);   // 右基準線
  for (let y = ROW_H / 2; y <= CAN_H; y += ROW_H) {
    ctx.fillRect(0, y, CAN_W, 1);
  }

  /* 共通スタイル */
  ctx.font        = 'bold 32px sans-serif';
  ctx.lineWidth   = 2;
  ctx.fillStyle   = '#ffb74d';
  ctx.strokeStyle = '#1e88e5';

  /* 横方向の揃え比較(左側) */
  ['start','end','left','right','center'].forEach((align, i) => {
    ctx.textAlign    = align;
    ctx.textBaseline = 'middle';
    const y = ROW_H * (i + 0.5);
    ctx.fillText(SAMPLE, 200, y);
    ctx.strokeText(SAMPLE, 200, y);
  });

  /* 縦方向の揃え比較(右側) */
  ['top','hanging','middle','alphabetic','ideographic','bottom']
  .forEach((baseline, i) => {
    ctx.textAlign    = 'center';
    ctx.textBaseline = baseline;
    const y = ROW_H * (i + 0.5);
    ctx.fillText(SAMPLE, 400, y);
    ctx.strokeText(SAMPLE, 400, y);
  });

  /* 横幅計測例(コンソール表示) */
  console.log('描画幅:', ctx.measureText(SAMPLE).width, 'px');
})();
</script>
</body>
</html>

ブラウザの出力例

  • 橙色 (fillText) と青い輪郭 (strokeText) が重なった見出しテキストが 2 列に並ぶ。
  • 左列は 水平方向の基準 の違いを、右列は 垂直方向の基準 の違いを示す。
  • 背景の格子線があるためどこが基準に合っているか一目瞭然

プログラム解説

内容解説
23–26背景ガイド線揃え位置がずれていないか視覚確認用
33font 指定CSS と同じ書式でスタイル・サイズ・フォントファミリを一括設定
39textAlign ループ5 種の横揃えを forEach で順に適用して比較
48textBaseline ループ6 種の縦基準を同様に比較
57measureText実描画幅を取得し、可変レイアウト時の当たり判定などに利用

まとめ

  • テキストスタイルは fonttextAligntextBaseline の 3 要素で完全管理。
  • 描画は 塗り (fillText)線 (strokeText) の 2 パターンを組み合わせて自由な装飾が可能。
  • measureText で実幅を取得すれば、吹き出しサイズ計算やスクロールエリア自動拡張などインタラクティブな UI に応用できる。

 この基礎を押さえれば、スコアボード・チャートラベル・動的字幕などあらゆるテキスト演出を自在にコントロールできます。