Miałem podobny problem. Ale używałem D3 do pozycjonowania moich elementów i chciałem, aby transformacja i przejście były obsługiwane przez CSS. To był mój oryginalny kod, który otrzymałem pracując w 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) ...
Pozwoliło mi to ustawić wartości cx
, cy
i transform-origin
w javascript przy użyciu tych samych danych.
ALE to nie działało w Firefoksie! Co miałem robić zawinąć circle
w g
znaczniku i translate
że przy użyciu tego samego wzoru pozycjonowania z góry. Następnie dołączyłem circle
w g
tagu i ustawiłem jego cx
i cy
wartości na 0
. Stamtąd transform: scale(2)
będzie skalowany od środka zgodnie z oczekiwaniami. Ostateczny kod wyglądał następująco.
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,
})
Po wprowadzeniu tej zmiany zmieniłem mój CSS, aby kierował się na circle
zamiast .dot
, aby dodać transform: scale(2)
. Nawet nie potrzebowałem użycia transform-origin
.
UWAGI:
Używam d3-selection-multi
w drugim przykładzie. To pozwala mi przekazać obiekt .attrs
zamiast powtarzać go .attr
dla każdego atrybutu.
Korzystając z literału szablonu ciągu, należy pamiętać o podziałach wiersza, jak pokazano w pierwszym przykładzie. Spowoduje to wyświetlenie nowej linii w danych wyjściowych i może spowodować uszkodzenie kodu.