J'ai eu un problème similaire. Mais j'utilisais D3 pour positionner mes éléments, et je voulais que la transformation et la transition soient gérées par CSS. C'était mon code d'origine, que j'ai fait travailler dans 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) ...
Cela m'a permis de définir les cx, cyet les transform-originvaleurs en javascript en utilisant les mêmes données.
MAIS cela n'a pas fonctionné dans Firefox! Ce que je devais faire était envelopper la circledans l' gétiquette et translateen utilisant la même formule de positionnement d' en haut. J'ai ensuite ajouté le circledans la gbalise et défini ses valeurs cxet cysur 0. À partir de là, transform: scale(2)serait mis à l'échelle du centre comme prévu. Le code final ressemblait à ceci.
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,
})
Après avoir apporté ce changement, j'ai changé mon CSS pour cibler le circleplutôt que le .dot, pour ajouter le transform: scale(2). Je n'avais même pas besoin d'être utilisé transform-origin.
REMARQUES:
J'utilise d3-selection-multidans le deuxième exemple. Cela me permet de passer un objet au .attrslieu de le répéter .attrpour chaque attribut.
Lorsque vous utilisez un littéral de modèle de chaîne, tenez compte des sauts de ligne, comme illustré dans le premier exemple. Cela inclura une nouvelle ligne dans la sortie et peut casser votre code.