--- title: SVG フォント slug: Web/SVG/Tutorial/SVG_fonts tags: - Advanced - NeedsUpdate - SVG - SVG:Tutorial translation_of: Web/SVG/Tutorial/SVG_fonts ---
{{ PreviousNext("Web/SVG/Tutorial/Filter_effects", "Web/SVG/Tutorial/SVG_Image_Tag") }}
SVG が規定された時点では、ブラウザーでウェブフォントの対応は普及していませんでした。しかし、テキストを正しく描画するためには、正しいフォントファイルへのアクセスが不可欠であるため、この機能を提供するためにフォント記述技術が SVG に追加されました。これは PostScript や OTF などの他のフォーマットとの互換性を目的としたものではなく、レンダリング時にグリフ情報を SVG に埋め込む簡単な手段です。
SVG フォントを定義するためのベースは {{ SVGElement("font") }} 要素です。
フォントに必要なすべての情報を得ることに、連携して関わる要素がいくつかあります。始めに (仕様書 で示されている) 宣言の例、その後に詳しい説明を示します。
<font id="Font1" horiz-adv-x="1000"> <font-face font-family="Super Sans" font-weight="bold" font-style="normal" units-per-em="1000" cap-height="600" x-height="400" ascent="700" descent="300" alphabetic="0" mathematical="350" ideographic="400" hanging="500"> <font-face-src> <font-face-name name="Super Sans Bold"/> </font-face-src> </font-face> <missing-glyph><path d="M0,0h200v200h-200z"/></missing-glyph> <glyph unicode="!" horiz-adv-x="300"><!-- Outline of exclam. pt. glyph --></glyph> <glyph unicode="@"><!-- Outline of @ glyph --></glyph> <!-- more glyphs --> </font>
まずは {{ SVGElement("font") }} 要素から始まります。これは id 要素を持っており、それは URI を通してフォントを参照する (後述) ために必要です。horiz-adv-x
属性は 1 つのグリフのパス定義に比べて、文字の幅を平均してどのくらい広げるかを定義します。値 1000
は、作業を行うにあたりほどよい値を設定します。また、基本的なグリフボックスのレイアウトをさらに定義するための付随的な属性がいくつかあります。
{{ SVGElement("font-face") }} 要素 CSS の @font-face
宣言と対になるものです。これはフォントウェイトやフォントスタイルの分類など、最終的なフォントの基本的なプロパティを定義します。前出の例で最も重要で、最初に定義するものは font-family
です。この値は、CSS や SVG の font-family
プロパティで参照することができます。font-weight
および font-style
属性は、同じ目的を持ちます。その後に続く属性は、フォントレンダリングエンジンへのレンダリング指示になります。例えば、グリフ全体の高さを表すのがアセンダーです。
子要素である {{ SVGElement("font-face-src") }} 要素は、CSS の @font-face
宣言の src
プロパティに対応します。子要素の {{ SVGElement("font-face-name") }} や {{ SVGElement("font-face-uri") }} を用いて、フォントの宣言で外部のソースを指し示すことができます。前出の例では、レンダラーの手元に "Super Sans Bold" という名前のローカルフォントが存在する場合は、そのフォントを用いるべきであることを示します。
{{ SVGElement("font-face-src") }} の後に {{ SVGElement("missing-glyph") }} 要素があります。これはあるグリフがフォント内で見つからず、またフォールバックする仕組みもない場合に何を表示するべきかを定義します。またこの要素では、どのようにグリフを作成するかも示しています。単純にグラフィックの SVG コンテンツを内部に追加するのです。また、{{ SVGElement("filter") }}、{{ SVGElement("a") }}、あるいは {{ SVGElement("script") }} といった、他の SVG 要素もここで用いることができます。ただし単純なグリフを作るなら、標準の SVG パスと同様に d
属性を追加することもできます。
実際のグリフは {{ SVGElement("glyph") }} 要素で定義します。ここで最も重要な属性は unicode
です。この属性は Unicode のコードポイントを定義して、その文字が glyph
要素で示すグリフで表現されます。lang
属性を指定した場合は、さらにグリフを特定の言語 (フォントを使用する側の xml:lang
で示されます) のみに限定することができます。繰り返しになりますがグリフを定義するために任意の SVG を用いることができ、またユーザエージェントが対応するすばらしいエフェクトを用いることもできます。
font
の内部では、さらに {{ SVGElement("hkern") }} と {{ SVGElement("vkern") }} の 2 つの要素を定義することができます。それぞれ、少なくとも 2 つの文字 (u1
および u2
属性) への参照と、それらの文字間の距離をどの程度縮めるかを決定する属性 k
を持ちます。以下の例では、ユーザーエージェントに "A" と "V" の文字を標準的な文字間の距離よりも近づけるように指示しています。
<hkern u1="A" u2="V" k="20" />
これはとても単純です。これまで説明したようにフォントの宣言をひとまとめに収めた場合は、font-family
属性を用いるだけでよいのです。
<font> <font-face font-family="Super Sans" /> <!-- and so on --> </font> <text font-family="Super Sans">My text uses Super Sans</text>
ただし、どこでどのようにフォントを定義するかの自由のために、複数の方法を自由に組み合わせてもかまいません。
リモートの (またはリモートでない) フォントの参照に @font-face
を用いることができます。
<font id="Super_Sans"> <!-- and so on --> </font> <style type="text/css"> @font-face { font-family: "Super Sans"; src: url(#Super_Sans); } </style> <text font-family="Super Sans">My text uses Super Sans</text>
前に述べた font-face-uri
で外部のフォントを参照することができ、高い再利用性を得ることができます。
<font> <font-face font-family="Super Sans"> <font-face-src> <font-face-uri xlink:href="fonts.svg#Super_Sans" /> </font-face-src> </font-face> </font>
{{ PreviousNext("Web/SVG/Tutorial/Filter_effects", "Web/SVG/Tutorial/SVG_Image_Tag") }}