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