【问题标题】:Apply clipPath to transformed g element将 clipPath 应用于转换后的 g 元素
【发布时间】:2013-01-05 13:55:34
【问题描述】:

我正在尝试剪辑一个圆圈,以便它只显示在特定范围内的部分。但是,该圆位于已变换的 g 元素内。当我将剪辑路径应用于 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(它在我附加的简化示例中生成代码),因为它会在局部坐标系中创建弧。

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

【问题讨论】:

    标签: svg


    【解决方案1】:

    您对g 元素的翻译影响了clipPath 的呈现方式。你有两个选择:

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

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

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

    <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/)

    【讨论】:

      猜你喜欢
      • 2015-03-10
      • 2011-12-13
      • 1970-01-01
      • 2013-11-05
      • 2012-05-16
      • 2013-05-30
      • 2020-07-11
      • 1970-01-01
      • 2011-11-05
      相关资源
      最近更新 更多