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, cyvà transform-origincá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ẻ circletrong gthẻ và translatenó sử dụng cùng một công thức định vị từ phía trên. Sau đó, tôi đã thêm thẻ circlevào gthẻ và đặt cxvà cycá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 circlethay 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-multitrong ví dụ thứ hai. Điều này cho phép tôi chuyển một đối tượng đến .attrsthay vì lặp lại .attrcho 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.