Eu tive uma questão semelhante. Mas eu estava usando o D3 para posicionar meus elementos e queria que a transformação e a transição fossem feitas por CSS. Este era meu código original, que comecei a trabalhar no 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) ...
Isso me permitiu definir as cx, cye transform-originvalores em JavaScript usando os mesmos dados.
MAS isso não funcionou no Firefox! O que eu tive que fazer foi embrulhar o circlena gtag e translateusando a mesma fórmula de posicionamento de cima. Em seguida, anexei o circlena gtag e defini seus valores cxe cycomo 0. A partir daí, transform: scale(2)escalaria do centro conforme o esperado. O código final ficou assim.
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,
})
Depois de fazer essa alteração, mudei meu CSS para direcionar o em circlevez de .dot, para adicionar o transform: scale(2). Eu nem precisei usar transform-origin.
NOTAS:
Estou usando d3-selection-multino segundo exemplo. Isso me permite passar um objeto para, em .attrsvez de repetir .attrpara cada atributo.
Ao usar um literal de modelo de string, esteja ciente das quebras de linha, conforme ilustrado no primeiro exemplo. Isso incluirá uma nova linha na saída e pode quebrar seu código.