14

我正在尝试剪辑一个圆圈,以便它只显示在特定范围内的部分。但是,圆圈​​位于已转换的 ag 元素内。当我将剪辑路径应用于 g 元素或此元素中的路径(“g.site”或“g.site 路径”)时,完整的圆圈会被剪掉。显示我的问题的简短示例:

<svg width="600" height="600">
  <defs>
    <clipPath id="myClip">
      <path d="M435.1256860398758,144.76407538624122L419.76193083948306,273.83328117717105L469.9933509829825,301.0396981292212L483.3234271019269,296.67464757752555L535.23683445551,247.72472220603692L574.3496211247055,127.3184557867296Z"
      />
    </clipPath>
  </defs>
  <g id="voronoi">
    <g id="cells">
      <path class="cell" d="M435.1256860398758,144.76407538624122L419.76193083948306,273.83328117717105L469.9933509829825,301.0396981292212L483.3234271019269,296.67464757752555L535.23683445551,247.72472220603692L574.3496211247055,127.3184557867296Z"
      />
    </g>
    <g id="sites">
      <g class="site" transform="translate(483.29548177370367,267.14072835257724)" clip-path="url(#myClip)">
        <path fill="rgba(0, 255, 0, 0.5)" d="M0,30A30,20 0 1,1 0,-30A30,20 0 1,1 0,30M0,1A1,1 0 1,0 0,-1A1,1 0 1,0 0,1Z"
        />
      </g>
      <g class="site" transform="translate(483.29548177370367,267.14072835257724)">
        <path fill="rgba(0, 0, 255, 0.5)" d="M0,30A30,20 0 1,1 0,-30A30,20 0 1,1 0,30M0,1A1,1 0 1,0 0,-1A1,1 0 1,0 0,1Z"
        />
      </g>
    </g>
  </g>
</svg>

我的问题的工作演示可以在这个小提琴中找到:http: //jsfiddle.net/xRh6A/

我添加了两个圆圈。第一个被剪掉(因为设置了 clip-path 属性),第二个被显示但(显然)没有被剪掉。

我想这与剪辑路径是用绝对术语定义的事实有关,而圆形元素具有局部坐标然后被转换。我可以将 clipPath 与转换后的组一起使用,还是必须更改剪辑路径或圆形路径才能使它们匹配?

编辑我通过放置具有绝对坐标的“站点”来解决它。但是,这意味着我不能使用 d3.svg.arc (它在我附加的简化示例中生成代码),因为它会在局部坐标系中创建弧。

我仍然有兴趣看看它是否也可以以其他方式解决。

4

1 回答 1

18

您对g元素的翻译正在影响其clipPath呈现方式。您有 2 个选项:

  1. clip-path属性添加到静态父元素。然后,您可以在子元素上应用您的翻译,而不会影响clipPath渲染。

  2. clipPath元素应用反向翻译。我从未实现过这种方法,但我在这里读到了它:https ://stackoverflow.com/a/16166249/3123187 。此选项要求您在clipPath每次更改转换时更新g转换。

在您的情况下,您已经有一个父g元素,因此clip-path如果您打算将属性应用于clipPath元素中的每个元素,则可以在那里添加属性g#sites

<g id="sites" clip-path="url(#myClip)">
  <g class="site" transform="translate(483.29548177370367,267.14072835257724)">
    <path fill="rgba(0, 255, 0, 0.5)" d="M0,30A30,20 0 1,1 0,-30A30,20 0 1,1 0,30M0,1A1,1 0 1,0 0,-1A1,1 0 1,0 0,1Z" />
  </g>
  <g class="site" transform="translate(483.29548177370367,267.14072835257724)">
    <path fill="rgba(0, 0, 255, 0.5)" d="M0,30A30,20 0 1,1 0,-30A30,20 0 1,1 0,30M0,1A1,1 0 1,0 0,-1A1,1 0 1,0 0,1Z" />
  </g>
</g>

(jsfiddle:http: //jsfiddle.net/SWyeD/

如果您只打算clipPath将其应用于第一个圆圈,则只需添加一个中间容器元素。

<g id="sites">
  <g clip-path="url(#myClip)">
    <g class="site" transform="translate(483.29548177370367,267.14072835257724)">
      <path fill="rgba(0, 255, 0, 0.5)" d="M0,30A30,20 0 1,1 0,-30A30,20 0 1,1 0,30M0,1A1,1 0 1,0 0,-1A1,1 0 1,0 0,1Z" />
    </g>
  </g>
  <g class="site" transform="translate(483.29548177370367,267.14072835257724)">
    <path fill="rgba(0, 0, 255, 0.5)" d="M0,30A30,20 0 1,1 0,-30A30,20 0 1,1 0,30M0,1A1,1 0 1,0 0,-1A1,1 0 1,0 0,1Z" />
  </g>
</g>

(jsfiddle:http: //jsfiddle.net/bdB65/

于 2014-05-14T15:36:00.983 回答