[69-8] Canvasでテキストを描画しよう
最終更新日:2019年02月06日 (初回投稿日:2015年01月20日)
今回は、<canvas>要素に「テキスト(文字列)」を描画してみます。
過去記事の「[69-2] canvasに基本的な図形を描こう」で、円グラフの中に文字を入れていますね。今日はその文字の入れ方です。
テキストは fillText() と strokeText() で指定します
fillText( '文字列' , x , y ) ; で塗りのテキスト、
strokeText( '文字列' , x , y ) ; でアウトラインのテキストを指定します。
「' '」で囲んで描きたい文字列を指定します。
x,y は、テキストを描き始める x座標、y座標。整数で指定します。
サンプル1の 1、2行目は、必要最低限の指定だけした、デフォルトの状態です。
クリックで別ウィンドウでサンプルが開きます。
デフォルトでは、サイズは10px、書体はsans-serif、色は黒になるのがわかります。
strokeText の線幅はデフォルトは1pxです。
2行目は文字が小さくて線が潰れちゃってるので、3、4行目は、わかりやすいようにサイズを大きくして色を付けてみました。(サイズや色の指定については次項で詳細)
1行目の描き始めの x座標は 10px、y座標は 15px にしています。
文字列なので、図形と違って「横方向の整列(textAlign)」「ベースライン(textBaseline)」がありますが、デフォルトでは「横方向の整列(textAlign)」は頭揃え(左揃え)、「ベースライン(textBaseline)」が文字列の下部であることがわかります。(textAlign、textBaselineについては後半で詳細)
ctx1.fillText('描きたい文字列',10,15);
ctx1.strokeText('描きたい文字列',10,30);
フォントの太さ、サイズ、書体、色、線の太さの指定
太さ、サイズ、書体などは、「fontプロパティ」で、CSSと同じように指定します。
色、線の太さ、線の角の丸みなどは、カンバスの図形の時と同じです。
サンプル2は、1行目は fillText、2行目は strokeText で指定したもの。
3行目は、strokeText と fillTextを同じ座標に重ねて、袋文字(枠付き飾り文字)にしたものです。
テキストの線と塗りは同時に指定できないけど、このように2つ重ねればOKというわけ。
(クリックで別ウィンドウで開きます)
文字の太さは bold、サイズは40px、書体はCentury Gothic にしてみました。
strokeText の線の太さは6pxに、角の状態を丸くしています。図形のときの線の指定と同じ方法で。
ctx2.font= 'bold 40px Century Gothic';
ctx2.strokeStyle = '#00A3D9';
ctx2.lineWidth = 6;
ctx2.lineJoin = 'round';
ctx2.fillStyle = '#fff';
ctx2.fillText('fillText(text,x,y[,maxWidth])',15,55,520);
ctx2.strokeText('strokeText(text,x,y[,maxWidth])',15,115,520);
ctx2.strokeText('fillText on strokeText',15,175,520);
ctx2.fillText('fillText on strokeText',15,175);
ソースの1行目の「fontプロパティ」で、太さ、サイズ、書体を1度に指定しています。
これは「半角スペース」で区切る CSSの「fontのショートハンド」と同じやり方です。
「fontのショートハンド」では、最低限「font-size」と「font-family(書体名)」が必要ですが、キャンバスでも最低限この2つが必要。(例えばサイズ指定だけってのはムリ)
CSSでは「size/line-height」というカタチで指定できますが、キャンバスでは「line-height」は指定できないようでした。
style、variant、weight、size、family が指定できます。
順番もCSSと同じで、style・variant・weight は順不同で最初に、次に size、最後に familyで。
- style:フォントスタイル。normal、italic、oblique
- variant:スモールキャップの指定。normal、small-caps
(スモールキャップとは、英文字で、小文字の表示が小文字サイズの大文字のもの) - weight:太さの指定。
normal、bold、lighter、bolder、または100〜900の9段階(400がnormal) - size:サイズの指定。px、pt、em、% などの単位で数値での指定など。
- family:書体の指定。
sans-serif(ゴシック系)、serif(明朝系)、monospace(等幅) などのキーワード。
または「" "」か「' '」で囲んで、フォント名で指定する。「,」で区切って複数指定OK。
//fontプロパティの指定例 ctx4.font='bold 20px Century Gothic,"Hiragino Kaku Gothic ProN"';
引数「maxWidth」で最大幅を指定する(省略可能)
サンプル2の6〜8行目のテキストの指定で、x,y座標の他に、もう1つ数値が書いてあります(520って)。
ctx2.font= 'bold 40px "Century Gothic"';
ctx2.strokeStyle = '#00A3D9';
ctx2.lineWidth = 6;
ctx2.lineJoin = 'round';
ctx2.fillStyle = '#fff';
ctx2.fillText('fillText(text,x,y[,maxWidth])',15,55,520);
ctx2.strokeText('strokeText(text,x,y[,maxWidth])',15,115,520);
ctx2.strokeText('fillText on strokeText',15,175,520);
ctx2.fillText('fillText on strokeText',15,175);
これは「maxWidth」という最大幅を指定できる引数です。(不用なら省略OKです)
キャンバスからはみ出しそうな文字列に最大幅を指定して、はみ出さないようにするという場合に使うようです。
8行目にも「maxWidth」を指定していますが、これは実験です。
この文字列は、520pxよりずっと幅が小さいのですが、
このように、元々「maxWidth」より小さい幅の場合は無効。(拡大はナイ!)
textAlignプロパティで、横方向(x)の表示位置を指定する
「ctx.textAlign = 'キーワード';」で、横方向(x)の表示位置を指定します。
キーワードには start、end、left、right、center の5種類があります。
デフォルト値は「start」(textAlign を指定しなければ start の位置になります)
サンプル3で、実際に指定して位置を確認してみました。
(クリックで別ウィンドウで開きます)
ソースコードはこちら。textAlignを指定してから文字列を描きます。
ctx3.textAlign = 'start';
ctx3.fillText('start',340,38);
ctx3.textAlign = 'end';
ctx3.fillText('end',340,72);
ctx3.textAlign = 'left';
ctx3.fillText('left',340,106);
ctx3.textAlign = 'right';
ctx3.fillText('right',340,140);
ctx3.textAlign = 'center';
ctx3.fillText('center',340,180);
textBaselineプロパティで、縦方向(y)の表示位置を指定する
「ctx.textBaseline = 'キーワード';」で、縦方向(y)の表示位置を指定します。
キーワードには top、hanging、middle、alphabetic、ideographic、bottom の6種類です。
デフォルト値は「alphabetic」(textBaseline を指定しなければ alphabetic の位置になります)
サンプル4で、実際に指定してみました。
(クリックで別ウィンドウで開きます)
上画像は Firefox (on Mac) のプレビューです。
この textBaselineプロパティはブラウザによって表示に違いがあるようです。デフォの alphabetic と middle などは、どのブラウザでも同じ位置なので使えそうです。
ソースコードはこちら。textBaselineを指定してから文字列を描きます。
ctx4.textBaseline = 'top';
ctx4.fillText('top_漢あmjk',120,60);
ctx4.textBaseline = 'hanging';
ctx4.fillText('hanging_漢あmjk',340,60);
ctx4.textBaseline = 'middle';
ctx4.fillText('middle_漢あmjk',560,60);
ctx4.textBaseline = 'alphabetic';
ctx4.fillText('alphabetic_漢あmjk',120,140);
ctx4.textBaseline = 'ideographic';
ctx4.fillText('ideographic_漢あmjk',340,140);
ctx4.textBaseline = 'bottom';
ctx4.fillText('bottom_漢あmjk',560,140);
ベースラインがどんな位置かを示す図が、W3Cの仕様書に載っていますので、転載しておきます。(クリックで該当ページにリンクします。別ウィンドウで開きます)
描画した文字列の情報を測定する measureText()
描画したテキスト全体の横幅サイズは、フォントスタイルや書体によって、また、デバイスによっても微妙に違ってしまうので、数値で指定するのはムズカシイ。
そんな時 measureText()メソッド で、文字列の横幅サイズを取得することができます。メジャーテキスト。読んだとおり、テキストを計測するんですね。
measureText() を使って、文字列にアンダーラインや背景ボックスを
サンプル5では、この「measureText()」を使って、文字列の幅をゲットして、テキストにアンダーラインや背景ボックスをつけてみました。
(クリックで別ウィンドウで開きます)
「アンダーライン」のソースコードはです。
function tDraw5() {
var ctx5 = document.getElementById('canvas5').getContext('2d');
/*テキストの指定*/
ctx5.font= 'bold 20px sans-serif';
/*アンダーライン*/
var text = 'テキストにアンダーラインを描画する';
ctx5.fillStyle = '#008C22';
ctx5.textAlign = 'center';
ctx5.fillText(text,340,75);
var txw1 = ctx5.measureText(text);
ctx5.beginPath();
ctx5.moveTo(340-txw1.width/2,80);
ctx5.lineTo(340+txw1.width/2,80);
ctx5.strokeStyle = '#008C22';
ctx5.stroke();
/*背景ボックス*/
//省略
}
これはサンプル4までの指定と違って、文字列は「text」という変数に代入しています。(6行目)こうしておかないと、10行目の「var txw1 = ctx5.measureText(text);」で使えないから。
(「measureText()」の()の中に 変数 text を仕込んでいます。)
この指定で、変数「txw1」に、文字列(変数text)の情報が代入されました。
で、「txw1.width」が、この文字列(変数text)の横幅になります。
このサンプルの場合、文字列をセンター合わせにしたので指定が若干複雑ですが、単純な計算です。
センター合わせ(8行目、ctx5.textAlign = 'center';)にして、その基準の x座標を340pxにしました。(9行目)
なので、アンダーラインを引く「x方向の位置」は、340(センター合わせの基準点)から「文字列の幅の半分」を引いた地点から、340に「文字列の幅の半分」を足した地点までです。
それが、上のソースの 12、13行目の指定です。
文字のy座標は75pxにしていますので、5px下にずらした80pxのところのアンダーラインが引かれるように指定しています。
「背景ボックス」をつけるほうは、サンプルのコードを見てもらえばわかるはず。
サンプルのほうに解説も付けておきました。
次回予告
カンバス上で作成できるグラフィックス(線、図形、画像、カンバス、テキスト)を今回までで、ひととおり使ってみました。
次回は、これらのグラフィックスの「変形」をやりましょう。
「拡大縮小・回転・移動・反転」などの変形を指定してみます。
- 関連記事
-
- [69-13] Canvasで画像データをURLとして取得しよう
- (ちょっとメモ)Canvasで画像をランダムに描くサイト背景をWordPressで使ってみた
- [69-12] Canvasをサイトの背景に使おう
- [69-11] Canvasでビットマップを操作しよう(ビットマップの明度や色調の変更)
- [69-10] Canvasの描画の状態を保存・復元する save() と restore()
- [69-9] Canvasでグラフィックスの変形をしよう(拡大・回転・移動・反転など)
- (ちょっとメモ)Canvasで便利な javaScriptライブラリ
- [69-8] Canvasでテキストを描画しよう
- [69-7] Canvas上の重なった描画領域を指定しよう (globalCompositeOperationプロパティ)
- [69-6] Canvasにマウスの動きに合わせて描画しよう (クリックやマウスムーブとの組み合わせと Math.random)
- [69-5] Canvasにグラデーションやパターン、シャドウを指定しよう
- [69-4] Canvasに画像を描画しよう(トリミングやクリッピングも)
- [69-3] Canvasに曲線を描こう(線のスタイルも)
- [69-2] Canvasに基本的な図形を描こう
- [69-1] canvas要素でグラフィックスを表示する領域を作ろう
初心者にも使いやすい(と思う)レンタルサーバー
「初心者ですがレンタルサーバーはどこがいい?」というご質問をよくいただきます。
自由にファイルをアップロードできる自分のサーバがあると便利ですよね。ローカル環境じゃなくサーバ上で試してみたい時がありますからね。
私が使っているのは、
スターサーバーや ロリポップ!
です。どちらも管理画面がわかりやすく、マニュアルも充実していて、料金も安い。どちらもライトプラン以上で WordPress が使えます。
初心者が始めやすいサーバだと思います。
ちょっと料金は高いけど、さくらのレンタルサーバや、エックスサーバー
は、やはり老舗なのでおすすめです。
両方とも高スペックでコスパが良く、老舗でユーザーが多いので、質問する場がたくさんあります。初心者だけど仕事でサーバが欲しい場合は、安心なのではないかと思います。
スポンサーリンク