2015-02-07 48 views
1

我使用D3.js創建一個弧和4個直線段。這些矩形將甜甜圈分成幾部分。D3.js,CSS3 - 旋轉矩形在一條直線上

我想

var width=200,height=300,innerRadius =100, outerRadius=80; 
var wheel = d3.select("#wheel") 
.append("svg").attr("width",width).attr("height",height) 

arc = d3.svg.arc() 
    .innerRadius(innerRadius).outerRadius(outerRadius) 
    .startAngle(0).endAngle(2*Math.PI) 

rectData = [ 
    {x:width/2,y:height/2}, 
    {x:width/2,y:height/2}, 
    {x:width/2,y:height/2}, 
    {x:width/2,y:height/2}, 
] 
rect = wheel.selectAll("g.rect") 
    .data(rectData).enter() 
    .append("g") 
.attr("transform",function(d,i){ 
    var rotate = 90*i; 
    return "translate(100,150) rotate("+rotate+")" 
}).attr("class","rect") 

rect.append("rect") 
    .attr("width",20).attr("height",outerRadius) 

wheel.append("path").attr("d",arc) 
    .attr("transform","translate("+width/2+","+height/2+")") 
    .attr("class","donut") 

我使用變換出身,但沒有工作Ractangles以直線排列。

http://jsfiddle.net/kmdr72wc/4/

+0

你想要達到的結果是什麼? – 2015-02-07 12:21:29

回答

0

transform-origin是一個CSS屬性,但您正在使用SVG屬性旋轉。

SVG rotate允許您設置origin但對你的情況可能是更容易修復翻譯:

.attr("transform",function(d,i){ 
    var rotate = 90*i; 
    var rotX = 100, rotY = 150; 
    if (i === 0){ 
    rotX -= 10; 
    } else if (i === 1){ 
    rotY -= 10; 
    } else if (i === 2){ 
    rotX += 10; 
    } else if (i === 3){ 
    rotY += 10; 
    } 
    return "translate("+rotX+","+rotY+") rotate("+rotate+")"; 
}); 

更新小提琴here

+0

此解決方案適用於旋轉角度爲90度的情況,但如果旋轉角度爲60度或30度,則該方案似乎無法正常工作或難以調整。 [rotation is 60deg] http://jsfiddle.net/kmdr72wc/23/ – ravins 2015-02-08 11:18:51

+0

這就是爲什麼我在考慮如果'transform-origin'對於這個 – ravins 2015-02-08 11:22:12

+0

的魅力可能會更復雜,如果不同的旋轉像[fiddle](http ://jsfiddle.net/kmdr72wc/26/) – ravins 2015-02-08 11:40:46