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
, cy
dan transform-origin
nilai-nilai dalam javascript menggunakan data yang sama.
TAPI ini tidak berhasil di Firefox! Apa yang harus saya lakukan adalah membungkus circle
di g
tag dan translate
menggunakan rumus posisi yang sama dari atas. Saya kemudian menambahkan circle
di g
tag, dan mengatur cx
dan cy
nilainya 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 circle
alih - alih .dot
, untuk menambahkan transform: scale(2)
. Saya bahkan tidak perlu menggunakan transform-origin
.
CATATAN:
Saya menggunakan d3-selection-multi
contoh kedua. Hal ini memungkinkan saya untuk meneruskan objek .attrs
daripada mengulang .attr
untuk 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.