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
, cy
e transform-origin
valores em JavaScript usando os mesmos dados.
MAS isso não funcionou no Firefox! O que eu tive que fazer foi embrulhar o circle
na g
tag e translate
usando a mesma fórmula de posicionamento de cima. Em seguida, anexei o circle
na g
tag e defini seus valores cx
e cy
como 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 circle
vez de .dot
, para adicionar o transform: scale(2)
. Eu nem precisei usar transform-origin
.
NOTAS:
Estou usando d3-selection-multi
no segundo exemplo. Isso me permite passar um objeto para, em .attrs
vez de repetir .attr
para 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.