我有一个类似的问题。但是我使用D3定位元素,并希望转换和过渡由CSS处理。这是我的原始代码,可以在Chrome 65中使用:
//...
this.layerGroups.selectAll('.dot')
.data(data)
.enter()
.append('circle')
.attr('transform-origin', (d,i)=> `${valueScale(d.value) * Math.sin( sliceSize * i)}
${valueScale(d.value) * Math.cos( sliceSize * i + Math.PI)}`)
//... etc (set the cx, cy and r below) ...
这让我设置cx,cy以及transform-origin使用相同的数据在JavaScript值。
但是,这在Firefox中不起作用!我要做的是将标签包裹circle在g标签中,translate并使用与上面相同的定位公式。然后,我circle在g标签中附加,并将其cx和cy值设置为0。从那里开始,transform: scale(2)将按预期从中心缩放。最终代码如下所示。
this.layerGroups.selectAll('.dot')
.data(data)
.enter()
.append('g')
.attrs({
class: d => `dot ${d.metric}`,
transform: (d,i) => `translate(${valueScale(d.value) * Math.sin( sliceSize * i)} ${valueScale(d.value) * Math.cos( sliceSize * i + Math.PI)})`
})
.append('circle')
.attrs({
r: this.opts.dotRadius,
cx: 0,
cy: 0,
})
进行此更改后,我将CSS更改为以circle而不是定位为目标.dot,以添加transform: scale(2)。我什至不需要使用transform-origin。
笔记:
我d3-selection-multi在第二个示例中使用。这使我可以将对象传递给,.attrs而不是.attr对每个属性都重复。
使用字符串模板文字时,请注意第一个示例中的换行符。这将在输出中包含换行符,并且可能会破坏您的代码。