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
, cy
et les transform-origin
valeurs 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 circle
dans l' g
étiquette et translate
en utilisant la même formule de positionnement d' en haut. J'ai ensuite ajouté le circle
dans la g
balise et défini ses valeurs cx
et cy
sur 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 circle
plutô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-multi
dans le deuxième exemple. Cela me permet de passer un objet au .attrs
lieu de le répéter .attr
pour 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.