我遇到了类似的问题。但是我使用D3来定位我的元素,并希望transform和transition由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)}`)
这使我能够在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
。
注意事项:
1. 在第二个例子中,我使用了
d3-selection-multi
。这使我可以将一个对象传递给
.attrs
,而不是为每个属性重复使用
.attr
。
2. 当使用字符串模板时,请注意换行符,如第一个示例所示。这将在输出中包含一个换行符,并可能破坏您的代码。