echarts官方示例和默認樣式都比較難看,經過一頓搗鼓實現比較漂亮的漸變儀表盤。
第一步:設置軸線
將圖表軸線、label、分割線、隱藏,只保留刻度,然后修改刻度樣式達到最終效果。不過要注意的是axisLine不能簡單的設置show:false,還要設置opacity才能徹底隱藏底色。看看效果和代碼如下:
series: [ { type: 'gauge', radius: '90%', axisLine: { show: false, lineStyle: { width: 3, opacity: 0 } }, title: { show: false }, detail: { show: false }, splitLine: { show: false }, axisTick: { length: 20, splitNumber: 7, lineStyle: { color: '#52B8DF', width: 3 } }, axisLabel: { show: false }, pointer: { show: false }, itemStyle: {}, data: [ { value: 20, name: 'test gauge' } ] } ]
第一步效果
第二步:設置背景
因為這是個弧形的漸變,所以echarts自帶的球形和線形漸變填充都不符合,只能在PS中繪制一個如下圖正方形的漸變背景,將圖片作為背景顏色填充到刻度上。
Photoshop繪背景
echarts的背景圖片必須是一個dom節點,而不是圖片的url。所以先需要引入圖片到HTML文檔上。然后 display:none 將其隱藏。
<img src="bg.png" id="bg_img" style="display:none" />
刻度線配置:
axisTick: { length: 20, splitNumber: 7, lineStyle: { color: { image: document.getElementById('bg_img'), repeat: 'no-repeat' }, width: 3 } }
第二部效果,看起來還不錯。
第三步:計算角度
增加一個儀表盤,兩個儀表盤重疊拼成一個,通過startAngle 、 endAngle、pointerAngle配置控制角度,一個表示”已完成“部分,一個標識”未完成“部分,再計算刻度數量。
第四步:增加指示刻度
再增加一個儀表盤,將儀表盤開始結束角度都設置成計算后的 pointerAngle ,這樣只會有一個刻度,調整儀表盤大小和刻度長度,差不多完美了.
第五步:增加內圈
內圈依舊是圖片,通過markPoint引入,設置好大小,中心即可,最終效果如圖。
var value = 0.8, // 值,0~1之間 startAngle = 215, // 開始角度 endAngle = -35, // 結束角度 splitCount = 60, // 刻度數量 pointerAngle = (startAngle - endAngle) * (1 - value) + endAngle; // 當前指針(值)角度 var myChart = echarts.init(document.getElementById('sample')); var option = { series: [ { type: 'gauge', radius: '90%', startAngle: pointerAngle, endAngle: endAngle, splitNumber: 1, axisLine: { show: false, lineStyle: { width: 3, opacity: 0 } }, title: { show: false }, detail: { show: false }, splitLine: { show: false }, axisTick: { length: 27, splitNumber: Math.ceil((1 - value) * splitCount), lineStyle: { color: '#001242', width: 3 } }, axisLabel: { show: false }, pointer: { show: false }, itemStyle: {}, markPoint: { animation: false, silent: false, data: [ { symbol: 'image://' + document.getElementById('round1').src, x: '50%', y: '50%', symbolSize: 280, itemStyle: { borderWidth: 3 } }, { symbol: 'circle', symbolSize: 200 } ] }, data: [ { value: value, name: 'test gauge' } ] }, { type: 'gauge', radius: '90%', startAngle: startAngle, endAngle: pointerAngle, splitNumber: 1, axisLine: { show: false, lineStyle: { width: 3, opacity: 0 } }, title: { show: false }, detail: { show: false }, splitLine: { show: false }, axisTick: { length: 27, splitNumber: Math.ceil(value * splitCount), lineStyle: { color: { image: document.getElementById('bg_img'), repeat: 'no-repeat' }, width: 3 } }, axisLabel: { show: false }, pointer: { show: false }, itemStyle: {}, data: [ { value: value, name: 'test gauge' } ] }, { type: 'gauge', radius: '95%', startAngle: pointerAngle, endAngle: pointerAngle, splitNumber: 1, axisLine: { show: false, lineStyle: { width: 3, opacity: 0 } }, title: { show: false }, detail: { show: false }, splitLine: { show: false }, axisTick: { length: 20, splitNumber: 1, lineStyle: { color: { image: document.getElementById('bg_img'), repeat: 'no-repeat' }, width: 3 } }, axisLabel: { show: false }, pointer: { show: false }, itemStyle: {}, data: [ { value: value, name: 'test gauge' } ] } ] }; myChart.setOption(option);
最終效果……
注意
如連續刷新出現重影 重疊時,再setOption前 先調用 chart.clear();
示例代碼:vaynewang/SampleCode
使用echarts繪制漂亮的漸變鍵盤儀表盤 - vaynewang的文章 - 知乎 https://zhuanlan.zhihu.com/p/54542421