我有一个类似的问题。但是我使用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
对每个属性都重复。
使用字符串模板文字时,请注意第一个示例中的换行符。这将在输出中包含换行符,并且可能会破坏您的代码。