Ich hatte ein ähnliches Problem. Aber ich habe D3 verwendet, um meine Elemente zu positionieren, und wollte, dass die Transformation und der Übergang von CSS übernommen werden. Dies war mein ursprünglicher Code, den ich in Chrome 65 zum Laufen gebracht habe:
//...
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) ...
Das erlaubte mir , die zu setzen cx
, cy
und transform-origin
Werte in Javascript , die gleichen Daten.
ABER das hat in Firefox nicht funktioniert! Was ich tun musste, war das circle
in das g
Tag zu wickeln und translate
es mit der gleichen Positionierungsformel von oben zu verwenden. Ich habe dann das circle
im g
Tag angehängt und seine cx
und cy
Werte auf gesetzt 0
. Von dort transform: scale(2)
würde wie erwartet vom Zentrum aus skaliert. Der endgültige Code sah so aus.
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,
})
Nachdem ich diese Änderung vorgenommen hatte, änderte ich mein CSS so, dass es auf das Ziel circle
anstatt auf das .dot
abzielte, das hinzuzufügen transform: scale(2)
. Ich brauchte nicht einmal Gebrauch transform-origin
.
ANMERKUNGEN:
Ich benutze d3-selection-multi
im zweiten Beispiel. Dadurch kann ich ein Objekt übergeben, .attrs
anstatt es .attr
für jedes Attribut zu wiederholen .
Beachten Sie bei der Verwendung eines Zeichenfolgenvorlagenliteral die Zeilenumbrüche, wie im ersten Beispiel dargestellt. Dies enthält eine neue Zeile in der Ausgabe und kann Ihren Code beschädigen.