Tôi đã có một vấn đề tương tự. Nhưng tôi đã sử dụng D3 vị trí các yếu tố của tôi, và muốn chuyển đổi và chuyển tiếp để được xử lý bởi CSS. Đây là mã gốc của tôi, mà tôi đã làm việc trong 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) ...
Điều này cho phép tôi để thiết lập cx
, cy
và transform-origin
các giá trị trong javascript sử dụng cùng dữ liệu.
NHƯNG điều này không hoạt động trong Firefox! Những gì tôi phải làm là bọc thẻ circle
trong g
thẻ và translate
nó sử dụng cùng một công thức định vị từ phía trên. Sau đó, tôi đã thêm thẻ circle
vào g
thẻ và đặt cx
và cy
các giá trị của nó thành 0
. Từ đó, transform: scale(2)
sẽ mở rộng quy mô từ trung tâm như mong đợi. Mã cuối cùng trông như thế này.
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,
})
Sau khi thực hiện thay đổi này, tôi đã thay đổi CSS của mình để nhắm mục tiêu circle
thay vì .dot
, để thêm transform: scale(2)
. Tôi thậm chí không cần sử dụng transform-origin
.
LƯU Ý:
Tôi đang sử dụng d3-selection-multi
trong ví dụ thứ hai. Điều này cho phép tôi chuyển một đối tượng đến .attrs
thay vì lặp lại .attr
cho mọi thuộc tính.
Khi sử dụng theo nghĩa đen của mẫu chuỗi, hãy lưu ý các dấu ngắt dòng như được minh họa trong ví dụ đầu tiên. Điều này sẽ bao gồm một dòng mới trong đầu ra và có thể phá vỡ mã của bạn.