SVGのテキスト要素の垂直方向の配置


142

私がSVGファイルを持っているとしましょう:

<svg width="1024" height="768" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <text x='20' y='60' style="font-size: 60px">b</text>
    <text x='100' y='60' style="font-size: 60px">a</text>
</svg>

どういうわけか上を揃えたい ab。実は、ポジショニングrooflinebaseline!ではなく!


IEで機能する唯一の答え:stackoverflow.com/a/29089222/9069356
Dominus.Vobiscum

回答:


116

alignment-baselineプロパティは、以下の値を取ることができため、あなたが探しているものです

auto | baseline | before-edge | text-before-edge | 
middle | central | after-edge | text-after-edge | 
ideographic | alphabetic | hanging | mathematical | 
inherit

w3cからの説明

このプロパティは、オブジェクトが親に​​対してどのように配置されるかを指定します。このプロパティは、この要素のどのベースラインを親の対応するベースラインに揃えるかを指定します。たとえば、これにより、ローマ字テキストのアルファベットのベースラインを、フォントサイズの変更に合わせて調整できます。デフォルトでは、alignment-baselineプロパティの計算値と同じ名前のベースラインになります。つまり、ブロック進行方向の「表意文字」位置合わせポイントの位置は、位置合わせされるオブジェクトのベースラインテーブルの「表意文字」ベースラインの位置です。

W3Cソース

残念ながら、これは、FirefoxがSVGテキストモジュール('SVG in Firefox' MDN Documentation)のプレゼンテーション属性の多くを実装していないように見えるために、あなたが何をしているかを達成する「正しい」方法です。


運がなかった。例を挙げていただけますか?
SeMeKh

2
私の意見では最良の答えです。壁のテキストページに移動せずに私のものに答えたからです。y= 0にテキストを表示したいのですが、画面外にあるので、CSSルール "alignment-ベースライン:ぶら下げ」、そして私が探していたとおりに、SVGコンテナーの最も高い位置にあるテキストを1つのピクセルが画面外に出ることなく実行しました。
R.ヒル

1
@SeMeKh:うーん、ちなみに、Chromiumでは動作しましたが、Firefoxでは動作しないことを確認しました。そのため、現時点では、このプロパティはブラウザ間で一貫してサポートされていないようです。
R.ヒル

2
@ R.Hillここで前に11年にわたって開かれたFirefox用バグレポートbugzilla.mozilla.org/show_bug.cgi?id=308338ところで:「真ん中」と「中央」の違いは何ですか?
mxmlnkn 2016年

9
間違って賛成しました。以前に同じ間違いをしたことがあるので、元に戻すことはできません。Fire alignment-baseline: centralはFireFoxのSVG では機能しませ。これは仕様によるものと思われます。dominant-baseline: centralこの回答で示されているように、私がこれまで試したすべてのブラウザで動作します。stackoverflow.com/a/15997503/1450294
マイケルScheper

227

SVGの仕様によると、alignment-baselineのみに適用され<tspan><textPath><tref><altGlyph>。私の理解では、それらを上の<text>オブジェクトからオフセットするために使用されています。あなたが探しているのはだと思いますdominant-baseline

可能な値は次の dominant-baselineとおりです。

auto | use-script | no-change | reset-size | ideographic | alphabetic | hanging | mathematical | central | middle | text-after-edge | text-before-edge | inherit

可能な各値の詳細については、dominant-baselineプロパティのW3C勧告を確認してください。


8
これにより、Firefoxの問題が修正されました(「alignment-baseline」プロパティでは機能しませんでした)。「ドミナントベースライン」はChromeとFirefoxで動作します。ありがとう!
マリアーノデサンツェ2014

5
ただし、現時点ではIEのどのバージョンでも動作しないため、残念ながら実際のアプリケーションの多くではそれほど役に立ちません。
Yona Appletree、2015年

3
IEは、いずれかの主要ベースライン、またはアライメント・ベースラインをサポートしていないので、あなたはそうのような機能のサポートを確認することができelement.hasAttribute('dominant-baseline')、それがfalseを返した場合に適用dy=-0.4emこの回答に概説されているようstackoverflow.com/a/29089222/2296470
Tigran

1
支配的なベースライン:中央は私の場合働いた。ありがとう!
Liam Mitchell

1
IE10-12 および Edge16 ではdominant-baselineがサポートされていないことに注意してください
japrescott

47

attr( "dominant-baseline"、 "central")


1
これは文字の中心に揃えられます(フォントグリフが適切に再生されるのと同じくらい)、これがこの質問に対する答えであるかどうかはわかりません。
matanster 2014年

3
これは、属性を割り当てるd3またはjqueryの方法です
グリフ

1
このソリューションは、ベースラインをテキストの垂直方向の中央に配置します。したがって、y座標は垂直方向の中心にあります。これが私が探していた答えでした。ありがとう。
ヘンリー

1
答えの核心は正しいです。dominant-baseline属性をcentralに設定してください。ただし、attr()はネイティブJS関数ではなく、説明はありません。
jave.web

30

これをIEでテストしている場合、dominant-baselineとalignment-baselineはサポートされていません。

IEでテキストを中央揃えする最も効果的な方法は、 "dy"で次のようなものを使用することです。

<text font-size="ANY SIZE" text-anchor="middle" "dy"="-.4em"> Ya Text </text>

負の値は上にシフトし、dyの正の値は下にシフトします。私は-.4emを使用すると、-。5emよりも垂直方向に少し中央に位置しているように見えますが、あなたがそれを判断します。


5
IEで機能する唯一の回答をいただきありがとうございます。これを行う必要があるのは残念ですが、他の回答では、Chrome / FFですべてを機能させるのにかなりの時間を費やし、ブラウザのテスト中にIEで機能しないことがわかりました。
Yona Appletree、2015年

素晴らしくシンプルな決定!また、「alignment-baseline」属性を削除して、それをサポートするブラウザーのテキスト位置への影響を省略することを忘れないでください。
YaTaras 2017年

7

SVG推奨事項を確認した後、ベースラインプロパティは、特に異なるフォントや言語を混在させる場合に、テキストを他のテキストに対して相対的に配置することを目的としていることを理解しました。トップになるようにテキストを配置したい場合はy、を使用する必要がありますdy = "y + the height of your text"


仕様へのリンクに感謝します。"<list-of-lengths>"たとえば、(リンクされた)オプションを認識していなかった(文字ごとの操作が可能)
brichins
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.