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。实际上,我希望我的定位符合roofline而不是baseline


IE中唯一
可行的

Answers:


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文本模块(“ Firefox中的SVG” MDN文档)实现了很多演示属性。


没有运气。你能举个例子吗?
SeMeKh 2012年

2
在我看来,最好的答案是,它无需浏览至文本墙页面即可回答我的问题。我想在y = 0处显示文本,但该文本不在屏幕上,因此我使用了CSS规则“ alignment-基线:挂起”,并且它恰好实现了我要寻找的内容,即SVG容器中最高处的文本,没有单个像素离开屏幕。
R. Hill

1
@SeMeKh:嗯,顺便说一句,它在Chromium上对我有用,但现在我只是验证了同样的功能在Firefox上不起作用。因此,到目前为止,似乎所有浏览器均未一致支持此属性。
R. Hill

2
@ R.Hill这是11年前打开的firefox错误报告bugzilla.mozilla.org/show_bug.cgi?id=308338顺便说一句:“中”和“中央”有什么区别?
mxmlnkn

9
错误地提出了建议,并且由于我之前犯过同样的错误,因此无法撤消。☹ alignment-baseline: central确实没有在Firefox SVGs工作,这似乎是由设计。dominant-baseline: central可以在到目前为止我尝试过的每种浏览器中工作,如此答案所示:stackoverflow.com/a/15997503/1450294
Michael 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

检查W3C建议中的优势基线属性,以获取有关每个可能值的更多信息。


8
这解决了我的Firefox问题(不适用于“ alignment-baseline”属性)。“主要基准”可在Chrome和Firefox上使用。谢谢!
Mariano Desanze 2014年

5
到目前为止,除了在IE的任何版本中均不起作用外,不幸的是,它对于许多实际应用程序并没有那么有用。
Yona Appletree,2015年

3
由于IE不支持主要基线或对齐基线,因此您可以像这样检查功能的支持element.hasAttribute('dominant-baseline'),如果它返回false dy=-0.4em,则按此答案中的说明套用stackoverflow.com/a/29089222/2296470
Tigran

1
主导基准:在我的案例中,中央工作。谢谢!
利亚姆·米切尔

1
请注意,IE10-12 Edge16 不支持优势基准
japrescott

47

attr(“主要基线”,“中央”)


1
这与字符的中心对齐(与字体字形播放得很好一样),不确定在此问题的答案如何。
matanster,2014年

3
这是分配属性的d3或jquery方法
字形2014年

1
此解决方案将基线置于文本的垂直中心。因此,y坐标位于垂直中心。这就是我一直在寻找的答案。谢谢。
亨利

1
答案的核心是正确的-将dominant-baseline属性设置为central,但是attr()不是原生的JS函数,根本没有任何解释。
jave.web

30

如果要在IE中进行测试,则不支持优势基准和对齐基准。

在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

7

看完SVG建议书后,我了解到基线属性旨在相对于其他文本定位文本,尤其是在混合使用不同的字体和/或语言时。如果要将文本放在顶部,y则需要使用dy = "y + the height of your text"


感谢规范的链接,那里有一些非常有用的阅读资料。例如,不知道(链接的)"<list-of-lengths>"选项(允许按字符操作)
brichins
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.