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