SVGでテキストを表示するには、<text>
要素を使う。この要素は単純に見えて、座標の指定方法などに少しクセがある。基本的な使い方をまとめたいと思う。
text要素で使える属性
SVGの<text>
要素では、主に以下のような属性が使える(一般的な属性は省略している)。
属性名 | 概要 |
---|---|
x | テキストの左下の デフォルト値は 0 |
y | テキストの左下の デフォルト値は 0 |
dx | <text> 要素内の文字の |
dy | <text> 要素内の文字のnone 。 |
rotate | <text> 要素内の文字の角度を、各文字の左下を回転軸にして指定。指定する値は、カンマ区切りで文字と対応させる。 |
textLength | テキストの長さを、長さあるいは%で指定。デフォルト値はnone 。 |
lengthAdjust | textLength に応じて、テキストを伸ばすか、余白を入れるか。spacing かspacingAndGlyphs で指定。デフォルトはspacing (余白)。 |
text-anchor | <text> 座標の基準を、左下角、中央下、右下角のいずれかに設定。指定できる値はstart 、middle 、end のいずれか。デフォルトはstart (左下角)。 |
また、以下は各属性値を変更した際に<text>
要素がどのように変化するかを試すサンプルである。
dx
やdy
、rotate
は、カンマ区切りで複数の値を指定できる。しかし、うまくデモにする方法を思いつかなかったので、そのあたりの指定方法は割愛した。単発で指定すると全体、カンマ区切りで指定すると文字ごとに値を適用できる。
text要素のクセ
<text>
要素を使う際に、地味に躓きそうなポイントがいくつかある。
デフォルト値だと表示されない
一般的な図形要素の座標は、左上が基準となる。一方<text>
要素の座標は、左下が基準となる。デフォルトの座標が0.5px
見切れる程度しか表示されない。よく見ないと、文字が表示されていないのかと見紛う。
座標を指定しないケースは稀かと思うが、私は初見で戸惑ったのでメモしておく。
折り返しが指定できない
SVGには、HTMLのように自動折り返しできる機能が備わっていない。SVG 2.0では、inline-size
という属性値によって指定可能になるらしい。しかし、現在(2024年1月)のところ対応しているブラウザは見当たらない。
SVG 1.1で自動折り返しを実現するには、<text>
タグではなく<foreignObject>タグを使う。このタグの中では、SVG以外のタグ名(別のXML名前空間)を含むことができる。
HTMLを使う場合は、そのタグにxmlns="http://www.w3.org/1999/xhtml"
を追加する。
例えば以下のように書く。
<foreignObject>
要素には、x
、y
、width
、height
の4つの属性を指定できる。
中央寄せ、左寄せがない
<text>
要素は、HTMLのtext-align
のように、属性値によって中央寄せや左寄せを指定できない。座標値を直接指定するしかない。
デフォルトでは、テキスト領域の左下端が座標に対応する。ただ、これだと座標の計算が地味に面倒である。text-anchor
を使うと、この手間を削減できる。
text-anchor
属性にmiddle
を指定するとテキスト領域の中央、end
を指定すると同右下端に座標が変更される。中央寄せする場合はmiddle
、左寄せする場合はend
を使うと、細かい計算をしなくて済む。
text要素の中で使える要素
<text>
タグには、単純なテキストの他に以下の2つの要素を含められる。
タグ | 使いどころ |
---|---|
tspan | <text> タグ中の一部のテキストを装飾する。 |
textPath | <textPath> タグの中身を、<path> タグで定義したパスに沿って描画する。 |
両者は、同じ<text>
タグに含めることができる。ただ、<textPath>
タグは個別の<text>
タグで分けた方がわかり良さそうではある。
<tspan>
の属性値は、<text>
タグと共通している。<tspan>
に値を指定しない場合、<text>
の属性値がそのまま適用される。
また、<textPath>
タグの属性値は、まとめる気が起きないので割愛する。