Ho avuto un problema simile. Ma stavo usando D3 per posizionare i miei elementi e volevo che la trasformazione e la transizione fossero gestite dai CSS. Questo era il mio codice originale, che ho ottenuto lavorando in 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) ...
Questo mi ha permesso di impostare la cx
, cy
ei transform-origin
valori in JavaScript utilizzando gli stessi dati.
MA questo non ha funzionato in Firefox! Quello che ho dovuto fare è stato avvolgere il circle
nel g
tag e translate
utilizzando la stessa formula posizionamento dall'alto. Ho quindi aggiunto il circle
nel g
tag e ho impostato i suoi valori cx
e cy
su 0
. Da lì, transform: scale(2)
scalerebbe dal centro come previsto. Il codice finale era così.
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,
})
Dopo aver apportato questa modifica, ho cambiato il mio CSS per scegliere come target circle
invece di .dot
, per aggiungere il file transform: scale(2)
. Non ne avevo nemmeno bisogno transform-origin
.
APPUNTI:
Sto usando d3-selection-multi
nel secondo esempio. Questo mi permette di passare un oggetto a .attrs
invece di ripetere .attr
per ogni attributo.
Quando si utilizza un modello di stringa letterale, prestare attenzione alle interruzioni di riga come illustrato nel primo esempio. Ciò includerà una nuova riga nell'output e potrebbe interrompere il codice.