ฉันมีปัญหาที่คล้ายกัน แต่ฉันใช้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
ค่าในจาวาสคริปต์โดยใช้ข้อมูลเดียวกัน
แต่สิ่งนี้ใช้ไม่ได้ใน 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
สำหรับทุกแอตทริบิวต์
เมื่อใช้สตริงเท็มเพลตลิเทอรัลโปรดระวังการแบ่งบรรทัดตามที่แสดงในตัวอย่างแรก ซึ่งจะรวมถึงการขึ้นบรรทัดใหม่ในผลลัพธ์และอาจทำให้โค้ดของคุณเสียหาย