65
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

javascriptで文字列の描画幅を取得する方法

Last updated at Posted at 2012-12-26

文字列の長さに応じてフォントサイズを縮小したり、省略表示したりできないかと思って調べてみました。
canvasのmeasureText()を使う方法と、DOMのoffsetWidthの値を使う方法があるようです。

  1. canvasを使う方法

 HTML5のcanvasを使いますので、canvas要素に非対応なIE8以前ではexcanvas.jsが必要です。

 IEとexcanvasのバージョンの組み合わせ次第で動かない可能性もあります。

手順:
(1)まずHTML中にcanvasを用意する

<canvas id="canvas" width="0" height="0" style="visibility:hidden;position:absolute;"></canvas>

Firefox9ではstyleでdisplay:none;としても大丈夫でしたが、IE+excanvasでは駄目だったので、hidden指定のうえ、positionをabsoluteにして浮かせておきます。

(2)幅を測定する処理は以下のように記述します。

function strWidth(str) {
  var canvas = document.getElementById('canvas');
  if (canvas.getContext) {
    var context = canvas.getContext('2d');
    var metrics = context.measureText(str);
    return metrics.width;
  }
  return -1;
}

context.font = でフォントの指定も必要ですね。

  1. DOMのoffsetWidthの値を使う

こちらを参考にしました。→http://d.hatena.ne.jp/Psychs/20070525/1180077269

手順:
(1)まずHTML中に測定に使用するspanを用意する

<span id="ruler" style="visibility:hidden;position:absolute;white-space:nowrap;"></span>

折り返しが発生すると測定結果が狂うのでwhite-space:nowrap;にした方がいいです。
必要に応じてフォントなどの条件指定も。

(2)幅を測定する処理は以下のように記述します。(jQuery使用してます)

function strWidth(str) {
  var e = $("#ruler");
  var width = e.text(str).get(0).offsetWidth;
  e.empty();
  return width;
}

私の環境(Firefox9)ではどちらの方法でも同じ値が取得できました。
最初、違う値が出たので「あれ?」と思ったら、フォントを合わせるのを忘れてました……。

65
57
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
65
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?