简体   繁体   English

将文本行对齐到SVG的中心

[英]Align lines of text to center in SVG

I need to output multiple lines of text in SVG. 我需要在SVG中输出多行文本。 For that I'm using the following scheme: 为此,我使用以下方案:

<text>
  <tspan> First line </tspan>
  <tspan> Second line </tspan>
</text>

First and second line of the text can have different number of characters, which can change dynamically. 文本的第一行和第二行可以具有不同数量的字符,这些字符可以动态地改变。 I want the second line to appear under the first line and text in both of them to be centered. 我希望第二行出现在第一行下面,并且两个文本都要居中。

I can make second line appear below the first line by adding dy="15" for the second <tspan> . 我可以通过为第二个<tspan>添加dy="15"来使第二行出现在第一行之下。

I can align the text in each individual <tspan> by adding text-anchor="middle" to it. 我可以通过添加text-anchor="middle"来对齐每个<tspan>text-anchor="middle"

But how to do relative centric alignment of those <tspan> 's? 但是如何做那些<tspan>的相对中心对齐?

I tried to use x="0" for each <tspan> but apparently it doesn't work since each <tspan> has different width and the rendered text in the shorter line is shifted to the left. 我尝试对每个<tspan>使用x="0" ,但显然它不起作用,因为每个<tspan>具有不同的宽度,并且较短行中的渲染文本向左移动。

Is there a way to align centres of 2 <tspan> 's of different width using only CSS and/or SVG. 有没有办法只使用CSS和/或SVG对齐不同宽度的2 <tspan>的中心。

If you add text-anchor="middle" to each tspan you will center them (you have to remove the space between the tspans as well, otherwise the extra space will be considered as part of the first line and they won't be completely centered). 如果你将text-anchor="middle"每个 tspan你将把它们居中(你必须删除tspans 之间的空间,否则额外的空间将被视为第一行的一部分,它们将不会完全居中)。

For example: 例如:

<svg>
    <text y="50" transform="translate(100)">
       <tspan x="0" text-anchor="middle">000012340000</tspan><tspan x="0" text-anchor="middle" dy="15">1234</tspan>
   </text>
</svg>

See: JSFiddle 请参阅: JSFiddle

DEMO DEMO

在此输入图像描述

text-anchor='start' for right align. text-anchor='start'用于右对齐。

text-anchor='middle' for middle align. text-anchor='middle'表示中间对齐。

text-anchor='end' for left align. 左对齐的text-anchor='end'

Code from demo: 演示代码:

<svg width="100%" height="230" viewBox="0 0 120 230"
     xmlns="http://www.w3.org/2000/svg" version="1.1">

    <!-- Materialisation of anchors -->
    <path d="M60,15 L60,110 M30,40 L90,40 M30,75 L90,75 M30,110 L90,110" stroke="grey" />


    <!-- Anchors in action -->
    <text text-anchor="start"
          x="60" y="40">This text will align right</text>

    <text text-anchor="middle"
          x="60" y="75">This text will align middle</text>

    <text text-anchor="end"
          x="60" y="110">This text will align left</text>

    <!-- Materialisation of anchors -->
    <circle cx="60" cy="40" r="3" fill="red" />
    <circle cx="60" cy="75" r="3" fill="red" />
    <circle cx="60" cy="110" r="3" fill="red" />

<style><![CDATA[
text{
    font: bold 15px Verdana, Helvetica, Arial, sans-serif;
}
]]></style>
</svg>

Read more about text-anchor property here 在此处阅读有关text-anchor属性的更多信息

Key points to horizontally centering the text: 水平居中文本的关键点:
1. x="50%" 1. x="50%"
2. text-anchor='middle' 2. text-anchor='middle'

In your case, you may write as: 在您的情况下,您可以写为:

<svg style="width:100%">
  <text y="50">
    <tspan x="50%" text-anchor="middle"> First line </tspan>
    <tspan x="50%" dy="15" text-anchor="middle"> Second line </tspan>
  </text>
</svg>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM