Tuve un problema similar. Pero estaba usando D3 para colocar mis elementos y quería que la transformación y la transición fueran manejadas por CSS. Este era mi código original, que conseguí trabajar en 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) ...
Esto permitió que fije las cx, cyy transform-originlos valores en JavaScript utilizando los mismos datos.
¡PERO esto no funcionó en Firefox! Lo que tenía que hacer era envolver el circleen la getiqueta y translateusando la misma fórmula de posicionamiento desde arriba. Luego agregué el circleen la getiqueta y establecí sus valores cxy cyen 0. A partir de ahí, transform: scale(2)escalaría desde el centro como se esperaba. El código final se ve así.
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,
})
Después de realizar este cambio, cambié mi CSS para apuntar al en circlelugar de .dot, para agregar el transform: scale(2). Ni siquiera necesitaba uso transform-origin.
NOTAS:
Estoy usando d3-selection-multien el segundo ejemplo. Esto me permite pasar un objeto a en .attrslugar de repetir .attrpara cada atributo.
Cuando utilice un literal de plantilla de cadena, tenga en cuenta los saltos de línea como se ilustra en el primer ejemplo. Esto incluirá una nueva línea en la salida y puede romper su código.