我有一个类似的问题。但我使用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) ...
这使我可以使用相同的数据在 javascript 中设置cx
、cy
和值。transform-origin
但这在 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
。
使用字符串模板文字时,请注意第一个示例中所示的换行符。这将在输出中包含一个换行符,并且可能会破坏您的代码。