Saya memiliki masalah serupa. Tapi saya menggunakan D3 untuk memposisikan elemen saya, dan ingin transformasi dan transisi ditangani oleh CSS. Ini adalah kode asli saya, yang saya kerjakan di 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) ...
Hal ini memungkinkan saya untuk mengatur cx, cydan transform-originnilai-nilai dalam javascript menggunakan data yang sama.
TAPI ini tidak berhasil di Firefox! Apa yang harus saya lakukan adalah membungkus circledi gtag dan translatemenggunakan rumus posisi yang sama dari atas. Saya kemudian menambahkan circledi gtag, dan mengatur cxdan cynilainya ke 0. Dari sana, transform: scale(2)akan skala dari pusat seperti yang diharapkan. Kode terakhir terlihat seperti ini.
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,
})
Setelah melakukan perubahan ini, saya mengubah CSS saya untuk menargetkan circlealih - alih .dot, untuk menambahkan transform: scale(2). Saya bahkan tidak perlu menggunakan transform-origin.
CATATAN:
Saya menggunakan d3-selection-multicontoh kedua. Hal ini memungkinkan saya untuk meneruskan objek .attrsdaripada mengulang .attruntuk setiap atribut.
Saat menggunakan literal template string, perhatikan baris baru seperti yang diilustrasikan dalam contoh pertama. Ini akan menyertakan baris baru dalam output dan dapat merusak kode Anda.