如何在SVG路径内居中文本

41

我需要帮助,当我使用svg绘制一个圆形并放置一些文本时,如何在SVG路径内居中文本

 <svg height="500"width="500">
       <path d="M250 250 L250 0 A250,250,0,0,1,250,0  L250 250 Z"fill="#fff"stroke="#fff"></path>
       <defs>
          <path id="p0"d="M250 50 A200,200,0,0,1,250,50 Z"fill="#fff"stroke="#fff"></path>
       </defs>
       <text style="font-size: 24px;"x="0"text-anchor="center">
          <textPath xmlns:xlink="http://www.w3.org/1999/xlink"xlink:href="#p0">0test text</textPath>
       </text>
       <path d="M250 250 L250 0 A250,250,0,0,1,466.50635094610965,124.99999999999997  L250 250 Z"fill="#ddd"stroke="#ddd"></path>
       <defs>
          <path id="p1"d="M250 50 A200,200,0,0,1,423.2050807568877,149.99999999999997 Z"fill="#ddd"stroke="#ddd"></path>
       </defs>
       <text style="font-size: 24px;"x="0"text-anchor="center">
          <textPath xmlns:xlink="http://www.w3.org/1999/xlink"xlink:href="#p1">1test text</textPath>
       </text>
       <path d="M250 250 L466.50635094610965 124.99999999999997 A250,250,0,0,1,466.5063509461097,374.99999999999994  L250 250 Z"fill="#fff"stroke="#fff"></path>
       <defs>
          <path id="p2"d="M423.2050807568877 149.99999999999997 A200,200,0,0,1,423.20508075688775,349.99999999999994 Z"fill="#fff"stroke="#fff"></path>
       </defs>
       <text style="font-size: 24px;"x="0"text-anchor="center">
          <textPath xmlns:xlink="http://www.w3.org/1999/xlink"xlink:href="#p2">2test text</textPath>
       </text>
       <path d="M250 250 L466.5063509461097 374.99999999999994 A250,250,0,0,1,250.00000000000003,500  L250 250 Z"fill="#ddd"stroke="#ddd"></path>
       <defs>
          <path id="p3"d="M423.20508075688775 349.99999999999994 A200,200,0,0,1,250.00000000000003,450 Z"fill="#ddd"stroke="#ddd"></path>
       </defs>
       <text style="font-size: 24px;"x="0"text-anchor="center">
          <textPath xmlns:xlink="http://www.w3.org/1999/xlink"xlink:href="#p3">3test text</textPath>
       </text>
       <path d="M250 250 L250.00000000000003 500 A250,250,0,0,1,33.49364905389038,375.0000000000001  L250 250 Z"fill="#fff"stroke="#fff"></path>
       <defs>
          <path id="p4"d="M250.00000000000003 450 A200,200,0,0,1,76.7949192431123,350.0000000000001 Z"fill="#fff"stroke="#fff"></path>
       </defs>
       <text style="font-size: 24px;"x="0"text-anchor="center">
          <textPath xmlns:xlink="http://www.w3.org/1999/xlink"xlink:href="#p4">4test text</textPath>
       </text>
       <path d="M250 250 L33.49364905389038 375.0000000000001 A250,250,0,0,1,33.49364905389024,125.00000000000017  L250 250 Z"fill="#ddd"stroke="#ddd"></path>
       <defs>
          <path id="p5"d="M76.7949192431123 350.0000000000001 A200,200,0,0,1,76.79491924311219,150.0000000000001 Z"fill="#ddd"stroke="#ddd"></path>
       </defs>
       <text style="font-size: 24px;"x="0"text-anchor="center">
          <textPath xmlns:xlink="http://www.w3.org/1999/xlink"xlink:href="#p5">5test text</textPath>
       </text>
       <path d="M250 250 L33.49364905389024 125.00000000000017 A250,250,0,0,1,249.99999999999994,0  L250 250 Z"fill="#fff"stroke="#fff"></path>
       <defs>
          <path id="p6"d="M76.79491924311219 150.0000000000001 A200,200,0,0,1,249.99999999999994,50 Z"fill="#fff"stroke="#fff"></path>
       </defs>
       <text style="font-size: 24px;"x="0"text-anchor="center">
          <textPath xmlns:xlink="http://www.w3.org/1999/xlink"xlink:href="#p6">6test text</textPath>
       </text>
    </svg>


1
获取路径的边界框,适当设置文本的x、y坐标。 - Robert Longson
4个回答

78
你已经完成了一部分,但是犯了一些错误。 text-anchor="center" 是不正确的。正确的应该是 text-anchor="middle"
另外,你应该在 <textPath> 元素中添加 startOffset="50%",以指定文本应位于路径的中间点居中显示。
最后你需要修复路径本身。你需要删除路径描述末尾的 Z 路径命令。你只想要弧线,而不是回到弧线起点的连线。
<svg height="500"width="500">
 
  <path d="M250 250 L250 0 A250,250,0,0,1,466.50635094610965,124.99999999999997  L250 250 Z" fill="#ddd" stroke="#ddd"></path>
  <defs>
    <path id="p1" d="M250 50 A200,200,0,0,1,423.2050807568877,149.99999999999997" fill="#ddd" stroke="#ddd"></path>
  </defs>
  <text style="font-size: 24px;">
    <textPath xlink:href="#p1" startOffset="50%" text-anchor="middle">1test text</textPath>
  </text>
  
</svg>


如果我需要在路径之外添加文本,类似于这个图像https://ibb.co/FsY5PPR,该怎么办? - Ahmed ElMetwally
1
@AhmedElMetwally只需将<taxtPath path>指向与显示的形状相同的位置即可。https://jsfiddle.net/k0h1r5nq/ - Paul LeBeau
@AhmedElMetwally 请尝试使用基线偏移属性。 - R OMS
这对我不起作用。 `<svg version="1.1" baseProfile="full" width="500" height="500" xmlns="http://www.w3.org/2000/svg"> <path id="1" fill="none" stroke="black" d="M 0 250 L 250 250"></path> <text> <textPath href="#1" text_anchor="middle" startOffset="50%" baseline-shift="10px">未居中</textPath> </text></svg> `https://imgur.com/slEn5xs - R OMS
1
@ROMS中的text_anchor是错误的。它应该是text-anchor - Paul LeBeau

6

我在此将六个文本放在一条路径上。路径是一个完整的圆(弧),长度为12(pathLength)。0点钟位置是在12点方向。第一个startOffset是1,以此类推。文本位于中心处。"披萨片"由被遮罩的<circle>制成。遮罩由三个倾斜和旋转的<rect>组成。

这是最简洁的描述。

<svg viewBox="0 0 100 100" height="500" width="500">
  <defs>
    <path id="p1" d="M50 10 a 40 40 1 1 0 1 0" pathLength="12" />
    <mask id="m1">
      <g transform="translate(50 50) rotate(15)">
        <rect id="r1" width="50" height="50" fill="white"
          transform="skewX(15) skewY(15)" />
        <use href="#r1" transform="rotate(120)"/>
        <use href="#r1" transform="rotate(240)"/>
      </g>
    </mask>
  </defs>
  <circle cx="50" cy="50" r="50" fill="#ddd" mask="url(#m1)"/>
  <text font-size="6" text-anchor="middle">
    <textPath href="#p1" startOffset="1" side="right">1test text</textPath>
    <textPath href="#p1" startOffset="3" side="right">2test text</textPath>
    <textPath href="#p1" startOffset="5" side="right">3test text</textPath>
    <textPath href="#p1" startOffset="7" side="right">4test text</textPath>
    <textPath href="#p1" startOffset="9" side="right">5test text</textPath>
    <textPath href="#p1" startOffset="11" side="right">6test text</textPath>
  </text>
</svg>


3

例如,使用text-anchor属性,并将值设置为middle:

<svg width="250" height="250">
  <circle cx="125" cy="125" r="100" fill="#aeaeae" />
  <text x="50%" y="50%" text-anchor="middle" fill="white" font-size="100px" font-family="Arial" dy=".3em">BC</text>
Sorry, your browser does not support inline SVG.
</svg>


这会将文本放置在<svg>元素的中心,而不是路径的中心(正如OP所问)。 - ashleedawg

1
应该使用text-anchor="middle"。此外,您应该在<textPath>元素中添加startOffset="50%",以指定文本应居中于路径的中点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接