У мене було подібне питання. Але я використовував D3 для позиціонування своїх елементів і хотів, щоб перетворення та перехід оброблялися CSS. Це був мій оригінальний код, над яким я працював у 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) ...
Це дозволило мені встановити значення cx
, cy
і transform-origin
значення в JavaScript за допомогою тих самих даних.
Але це не працювало у Firefox! Те , що я повинен був зробити обернути circle
в g
тег і translate
його , використовуючи ту ж саму формулу визначення місця розташування зверху. Потім я додав circle
у g
тег, встановив його cx
та cy
значення 0
. Звідти можна transform: scale(2)
було б масштабувати з центру, як очікувалося. Кінцевий код виглядав приблизно так.
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,
})
Після внесення цієї зміни я змінив свій CSS, щоб націлити на, circle
а .dot
не на transform: scale(2)
. Мені навіть не потрібно було користуватися transform-origin
.
ПРИМІТКИ:
Я використовую d3-selection-multi
у другому прикладі. Це дозволяє мені передавати об’єкт .attrs
замість повторення .attr
для кожного атрибуту.
Використовуючи буквальний шаблон рядка, пам’ятайте про розриви рядків, як показано в першому прикладі. Це буде включати в рядок новий рядок і може порушити ваш код.