用HTML5的canvas畫一個餅狀圖,開始吧!
第一步:設置畫布的寬高
const canvas = document.getElementById("canvas");
const context = canvas.getContext("2d");
//設置畫布的寬高
canvas.width = 831;
canvas.height = 706;
第二步:變換座標原點到畫布中心
function translate(context) {
context.translate(canvas.width / 2, canvas.height / 2)
}
第三步:繪製扇形
// 準備數據
const data = [
{ value: 1048, name: '搜索引擎' },
{ value: 735, name: '直接訪問' },
{ value: 580, name: '郵件營銷' },
{ value: 484, name: '聯盟廣告' },
{ value: 300, name: '視頻廣告' }
]
// 計算比例
function dataProcess(data) {
let total = 0
for (const item of data) {
total += item.value
}
for (const item of data) {
item.percent = item.value / total
}
}
dataProcess(data)
// 定義顏色
const colors = ['#e6a0c4', '#c6cdf7', '#d8a499', '#7294d4', '#fdc765']
// 半徑
const r = 300
// 開始繪製
function drawFan(context) {
const startAngle = -0.5 * Math.PI
context.save()
for (let i = 0; i < data.length; i++) {
const item = data[i]
context.beginPath()
context.moveTo(0, 0)
context.lineTo(0, -r)
const endAngle = item.percent * 2 * Math.PI + startAngle
context.arc(0, 0, r, startAngle, endAngle, false)
context.closePath()
context.fillStyle = colors[i]
context.fill()
// 旋轉座標系,計算更方便
context.rotate(item.percent * 2 * Math.PI)
}
context.restore()
}
第四步:繪製文本
function drawText(context) {
context.font = "14px sans-serif";
context.fillStyle = "#fff"
const a = 180
let angle = 0
for (const item of data) {
const thita = (angle * 2 + item.percent) * Math.PI
const x = a * Math.sin(thita)
const y = -a * Math.cos(thita)
const textWidth = context.measureText(item.name)
context.fillText(item.name, x - textWidth.width / 2, y)
angle += item.percent
}
}