У меня была похожая проблема.Но я использовал D3 для позиционирования своих элементов и хотел, чтобы CSS * обрабатывали transform и transition .Это был мой оригинальный код, который я получил в 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
для каждого атрибута.
При использовании строкового литерала шаблона учитывайте разрывы строк, как показано в первом примере.Это будет включать новую строку в вывод и может нарушить ваш код.