javascript - SVG donut 形状,可访问两个圆圈

标签 javascript svg

我想创建一个 SVG donut 形状(内部有另一个空圆圈的圆圈)。我希望能够访问和调整两个圆圈的大小,例如通过它们的 id 属性。这将允许动画。

我考虑过三种方法,但没有一个那么好:

  • 复杂路径:不允许通过#id访问内圈
  • 轮廓笔划:可能,但对我的目的来说很复杂(当我增加笔划时必须重新定位)
  • clippath/mask:不像复合路径那样工作,只是一个外框

有办法做到这一点吗?

最佳答案

可能最简单的方法是使用面具。

如果您正在使用一组离散的 donut 尺寸,则可以为每个尺寸使用 CSS 和 mask :

<svg width="500" height="500">
    <defs>
        <mask id="bigmask">
            <rect width="100%" height="100%" fill="white"/>
            <circle cx="250" cy="250" r="50"/>
        </mask>
        <mask id="smallmask">
            <circle cx="250" cy="250" r="150" fill="white"/>
            <circle cx="250" cy="250" r="100"/>
        </mask>
    </defs>
    <circle id="donut" cx="250" cy="250" r="200" mask="url(#bigmask)"/>
</svg>

CSS:

#donut:hover
{
    mask: url(#smallmask);
}

Demo here

遗憾的是,您无法使用 CSS 修改圆圈的大小。 “r”(还)不是可以用 CSS 操作的属性。因此,您需要使用 SMIL (SVG) 动画,或使用 javascript 操作 mask 圆:

<svg width="500" height="500">
    <defs>
        <mask id="donutmask">
            <circle id="outer" cx="250" cy="250" r="200" fill="white"/>
            <circle id="inner" cx="250" cy="250" r="50"/>
        </mask>
    </defs>
    <circle id="donut" cx="250" cy="250" r="200" mask="url(#donutmask)"/>
</svg>

JS

$("#donut").mouseenter(function(evt) {
    $("#outer").attr("r", 100 + Math.random() * 100);
    $("#inner").attr("r", 100 - Math.random() * 50);
});

Demo here

关于javascript - SVG donut 形状,可访问两个圆圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26329365/

相关文章:

linux - 将 base64 svg 数据解码为 svg 文件

javascript - JavaScript 如何在浏览器地址栏中工作?

javascript - 通过 javascript 从 &lt;input type ='image'> 获取点击坐标

linux - 使用 rsvg-convert 可以将多页或多文件 SVG 转换为多页 PDF 吗?

svg - 是否有混合模式来替换黑色并保留其他颜色(即白色)?

javascript - 如何创建一个 <embed> svg 按钮?

javascript - 改进 JavaScript 正则表达式以匹配带有或不带有结束标记的标记内的内容,不包括 self

javascript - 路由器在 NavigationStart 事件中导航

javascript - 将 "new Number"分配给原型(prototype)字段在 Chrome 中打印为 {}

javascript - JavaScript 或 Processing 中的矢量路径混合