[英]Create SVG circle using path with 6 segments
如何使用svg使用多路径创建带有6个角度为7的线段的圆。每个线段具有不同的路径,并且每个线段之间也有间隙。 请参考以下链接以供参考。 想要对svg元素使用相同的图像。 如何在角度7中创建?
这就是我要这样做的方式:我正在创建路径id="segment"
,并且将其旋转6次:
let R = 45;// the outer radius let r = 15;// the inner radius //the radius for the text let textR = r + (R - r)/2 // the angle for the slice let A = Math.PI/3; //points used to draw a slice let p1 = {} let p2 = {} let p3 = {} let p4 = {} p1.x = r*Math.cos(-A/2); p1.y = r*Math.sin(-A/2); p2.x = R*Math.cos(-A/2); p2.y = R*Math.sin(-A/2); p3.x = R*Math.cos(A/2); p3.y = R*Math.sin(A/2); p4.x = r*Math.cos(A/2); p4.y = r*Math.sin(A/2); // the d attribute for the slice let d =`M${p1.x},${p1.y} L${p2.x},${p2.y} A${R},${R} 0 0 1 ${p3.x},${p3.y} L${p4.x},${p4.y} A${r},${r} 0 0 0 ${p1.x},${p1.y}`; // set the d attribute for the slice sectorpath.setAttributeNS(null,"d", d); // set the x and y attributes for the text let text = document.querySelectorAll("#txt text") text.forEach((t,i) =>{ let x = textR * Math.cos(A*i - Math.PI/2); let y = textR * Math.sin(A*i - Math.PI/2); t.setAttributeNS(null,"x",x); t.setAttributeNS(null,"y",y); })
svg{border:1px solid} use{fill:blue; stroke:white; stroke-width:3}
<svg viewBox="-50 -50 100 100" width="300" > <defs> <path id="sectorpath" /> <mask id="themask"> <use xlink:href="#sectorpath" style="stroke:#000; stroke-width:3; fill: #ffffff"/> </mask> <use xlink:href="#sectorpath" id="sector" fill="blue" style="mask: url(#themask)" /> </defs> <use xlink:href="#sector" transform="rotate(-90)" /> <use xlink:href="#sector" transform="rotate(-30)" /> <use xlink:href="#sector" transform="rotate(30)" /> <use xlink:href="#sector" transform="rotate(90)" /> <use xlink:href="#sector" transform="rotate(150)" /> <use xlink:href="#sector" transform="rotate(210)" /> </svg>
使用属性stroke-dasharray
可以将圆分为6段
2 * 3.1415 * 100 = 628.3px
628.3 / 6 = 104.71px
stroke-dasharray = "100 4.71"
参数stroke-dasharray = "100 4.71"
<svg width="50%" height="50%" viewBox="50 90 400 400" > <circle cx="250" cy="250" r="100" style="stroke:dodgerblue; fill:none; stroke-opacity:0.5; stroke-width:50; stroke-dasharray:100 4.71;" /> </svg>
作者没有问,但是对于某人学习如何为stroke-dasharray
进行动画制作也许会很有用
主要技巧是,在分为六个扇区的第一个圆上,将一个扇区叠加在另一个扇区上,该扇区离散地移动等于一个扇区的长度
<svg width="50%" height="50%" viewBox="50 90 400 400" > <circle cx="250" cy="250" r="100" style="stroke:black; fill:none; stroke-opacity:0.3; stroke-width:70; stroke-dasharray:100 4.71;" /> <circle transform="rotate(-90 250 250)" cx="250" cy="250" r="100" style="stroke:dodgerblue; fill:none; stroke-opacity:0.9; stroke-width:70; stroke-dasharray:104.71 523.59; stroke-dashoffset: -52.31;" > <animate attributeName="stroke-dashoffset" values="-52.31;-157.11;-261.82;-366.53;-471.24;-575.91" dur="4s" repeatCount="indefinite" calcMode="discrete" fill="freeze" /> </circle> </svg>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.