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
, cy
y transform-origin
los valores en JavaScript utilizando los mismos datos.
¡PERO esto no funcionó en Firefox! Lo que tenía que hacer era envolver el circle
en la g
etiqueta y translate
usando la misma fórmula de posicionamiento desde arriba. Luego agregué el circle
en la g
etiqueta y establecí sus valores cx
y cy
en 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 circle
lugar de .dot
, para agregar el transform: scale(2)
. Ni siquiera necesitaba uso transform-origin
.
NOTAS:
Estoy usando d3-selection-multi
en el segundo ejemplo. Esto me permite pasar un objeto a en .attrs
lugar de repetir .attr
para 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.