剪切SVG中的已转换文本

时间:2014-03-19 14:25:52

标签: html svg d3.js

我用d3创建了一个径向图,我想剪切一条路径上的文字。但是,要使文本在路径上方,需要进行翻译和旋转。

the effect I'm trying for

The first image in this codepen显示一条路径,其中包含已旋转和翻译的文字;我想要的是将文本剪辑到它下面的路径。

第二张图片展示了当我这样做时会发生什么; clipPath(它只是svg上路径的链接)受到与文本相同的变换的影响,因此它会向右倾斜并向右移动,而不是与它引用的弧位于同一个点上

第三张图片展示了我想要发生的事情。但是,我通过反转应用于文本的变换并将其应用于clipPath来实现这一点,如下所示:

   <clipPath id="clipfix" transform="translate(-30,0)rotate(-30)">

我可以通过这样做来解决我的问题,但这似乎有点荒谬。在我的实际绘图中,我有很多路径和大量文本。有没有更好的方法将我的文字剪辑到它下面的路径,或者我得到了正确的答案,只需要接受丑陋?

演示SVG的全文如下:

<svg width=1000 height=1000>
  <g transform="translate(20,200)">
    <path d="M0,-150A150,150 0 0,1 150,0L100,0A100,100 0 0,0 0,-100Z"
          style="fill: #ffffff; stroke: #000000;"></path>
    <path d="M150,0A150,150 0 0,1 0,150L0,100A100,100 0 0,0 100,0Z"
          style="fill: #ffffff; stroke: #000000;"></path>
    <text transform="rotate(30)translate(30,0)">The first thing to know about Schnauzers</text>
    <text transform="rotate(-45)translate(30,0)">I once met a cactus that could talk</text>
  </g>
  <g transform="translate(320,200)">
    <path d="M0,-150A150,150 0 0,1 150,0L100,0A100,100 0 0,0 0,-100Z"
          id="path3" style="fill: #ffffff; stroke: #000000;"></path>
    <path d="M150,0A150,150 0 0,1 0,150L0,100A100,100 0 0,0 100,0Z"
          id="path4" style="fill: #ffffff; stroke: #000000;"></path>
    <clipPath id="clip">
      <use xlink:href="#path3"></use>
      <use xlink:href="#path4"></use>
    </clipPath>
    <text transform="rotate(30)translate(30,0)"
          clip-path="url(#clip)">The first thing to know about Schnauzers</text>
    <text transform="rotate(-45)translate(30,0)"
          clip-path="url(#clip)">I once met a cactus that could talk</text>
  </g>
  <g transform="translate(550,200)">
    <path d="M0,-150A150,150 0 0,1 150,0L100,0A100,100 0 0,0 0,-100Z"
          id="path5" style="fill: #ffffff; stroke: #000000;"></path>
    <path d="M150,0A150,150 0 0,1 0,150L0,100A100,100 0 0,0 100,0Z"
          id="path6" style="fill: #ffffff; stroke: #000000;"></path>
    <clipPath id="clipfix" transform="translate(-30,0)rotate(-30)">
      <use xlink:href="#path5"></use>
      <use xlink:href="#path6"></use>
    </clipPath>
    <text transform="rotate(30)translate(30,0)"
          clip-path="url(#clipfix)">The first thing to know about Schnauzers</text>
    <text transform="rotate(-45)translate(30,0)"
          clip-path="url(#clipfix)">I once met a cactus that could talk</text>
  </g>
</svg>

1 个答案:

答案 0 :(得分:4)

只需将文本元素包装在一个组中,然后将剪辑应用于该文章。

  <g transform="translate(320,200)">
    <path d="M0,-150A150,150 0 0,1 150,0L100,0A100,100 0 0,0 0,-100Z"
          id="path3" style="fill: #ffffff; stroke: #000000;"></path>
    <path d="M150,0A150,150 0 0,1 0,150L0,100A100,100 0 0,0 100,0Z"
          id="path4" style="fill: #ffffff; stroke: #000000;"></path>
    <clipPath id="clip">
      <use xlink:href="#path3"></use>
      <use xlink:href="#path4"></use>
    </clipPath>
    <g clip-path="url(#clip)">
      <text transform="rotate(30)translate(30,0)"
            >The first thing to know about Schnauzers</text>
      <text transform="rotate(-45)translate(30,0)"
            >I once met a cactus that could talk</text>
    </g>
  </g>