首页/ mobileweb/ 图表工具大全 · 移动端数据可视化图表库(原生 JS 无依赖)/ 代码预览

💻 代码预览 · 图表工具大全 · 移动端数据可视化图表库(原生 JS 无依赖)

mw_tool · 上传者 驰旭教育
← 返回详情
r111/radar.html · 约 5805 字符
1<!DOCTYPE html>2<html lang="zh-CN">3<head>4<meta charset="UTF-8">5<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">6<meta name="theme-color" content="#4263eb">7<title>雷达图与仪表盘 · 图表工具大全</title>8<link rel="stylesheet" href="style.css">9</head>10<body data-page="radar" class="nopad">11<div class="navbar"><a class="bk" href="gallery.html">‹</a><div class="tt">雷达图与仪表盘</div><div class="rt"><a href="#" id="viewjson">JSON</a></div></div>12<div class="wrap" style="padding-bottom:0">13  <div class="seg" id="tab">14    <button class="on" data-v="radar">雷达图</button>15    <button data-v="gauge">仪表盘</button>16  </div>17</div>1819<div id="pane-radar">20  <div class="card mt12">21    <div class="ch"><b id="tt">--</b><span id="src"></span></div>22    <div class="chart" id="c1"></div>23    <div class="legend" id="lg"></div>24  </div>25  <div class="card">26    <div class="ch"><b>维度得分对比</b><span>本店 vs 行业均值</span></div>27    <div id="cmp"></div>28  </div>29  <div class="card">30    <div class="ch"><b>能力短板诊断</b></div>31    <div id="diag"></div>32  </div>33</div>3435<div id="pane-gauge" style="display:none">36  <div class="card mt12">37    <div class="ch"><b>核心指标达成</b><span id="src2"></span></div>38    <div class="chips" id="kpisel" style="padding-left:0;padding-right:0"></div>39    <div class="chart" id="g1"></div>40  </div>41  <div class="card">42    <div class="ch"><b>全部指标</b><span>进度环</span></div>43    <div class="kpis4" style="padding:0" id="ring"></div>44  </div>45</div>46<div style="height:18px"></div>4748<div class="sheet" id="sjson">49  <div class="sh"><b>数据源 JSON</b><span class="x">×</span></div>50  <div class="sb"><pre class="code" id="jsonbox"></pre></div>51</div>525354<div class="mask" id="mask"></div>55<div class="toast" id="toast"></div>56<script src="data/fallback.js"></script>57<script src="chart.js"></script>58<script src="app.js"></script>59<script>6061var RD=null, KPI=null, gi=0;6263function drawRadar(){64  if(!RD) return;65  CH.radar($('#c1'), {indicators:RD.indicators, series:RD.series, h:290});66}67function cmp(){68  var a=RD.series[0], b=RD.series[1];69  $('#cmp').innerHTML = RD.indicators.map(function(ind,i){70    var d = a.data[i] - (b ? b.data[i] : 0);71    return '<div class="rank"><div class="rt"><span>'+ind.name+'</span>'+72      '<b>'+a.data[i]+' 分 <span style="color:'+(d>=0?'#12b886':'#fa5252')+';font-size:11px">('+(d>=0?'+':'')+d+')</span></b></div>'+73      '<div class="bar"><i style="width:'+(a.data[i]/ind.max*100)+'%;background:#4263eb"></i></div>'+74      (b ? '<div class="bar" style="margin-top:3px"><i style="width:'+(b.data[i]/ind.max*100)+'%;background:#f59f00"></i></div>' : '')+75      '</div>';76  }).join('');77}78function diag(){79  var a=RD.series[0];80  var arr = RD.indicators.map(function(ind,i){ return {name:ind.name, v:a.data[i], max:ind.max}; })81    .sort(function(x,y){ return x.v/x.max - y.v/y.max; });82  $('#diag').innerHTML = arr.slice(0,3).map(function(x,i){83    var lv = x.v/x.max;84    var tag = lv<0.7 ? '<span class="tag" style="background:var(--danger-l);color:#c92a2a">待提升</span>'85            : lv<0.85 ? '<span class="tag o">可优化</span>' : '<span class="tag g">表现良好</span>';86    return '<div class="row" style="padding:10px 0"><div class="ic">'+['🔧','⚙️','🛠'][i]+'</div>'+87      '<div class="mn"><b>'+x.name+'</b><span>得分 '+x.v+' / '+x.max+',处于第 '+(i+1)+' 短板</span></div>'+tag+'</div>';88  }).join('');89}90function drawGauge(){91  if(!KPI) return;92  var it = KPI.items[gi];93  CH.gauge($('#g1'), {value:it.value, max:100, name:it.name, unit:'%', color:it.color, h:200});94}95function rings(){96  $('#ring').innerHTML = KPI.items.map(function(it){97    var r=26, c=2*Math.PI*r, off=c*(1-it.value/100);98    return '<div class="kpi" style="text-align:center">'+99      '<svg viewBox="0 0 70 70" style="width:70px;height:70px;display:block;margin:0 auto">'+100      '<circle cx="35" cy="35" r="'+r+'" fill="none" stroke="#eef1f7" stroke-width="7"/>'+101      '<circle cx="35" cy="35" r="'+r+'" fill="none" stroke="'+it.color+'" stroke-width="7" stroke-linecap="round"'+102      ' stroke-dasharray="'+c.toFixed(1)+'" stroke-dashoffset="'+off.toFixed(1)+'" transform="rotate(-90 35 35)"/>'+103      '<text x="35" y="39" text-anchor="middle" font-size="14" font-weight="800" fill="#1f2430">'+it.value+'</text>'+104      '</svg><div class="kn mt8">'+it.name+'</div></div>';105  }).join('');106}107108loading($('#c1'));109DS.all(['ability','kpi']).then(function(r){110  RD = JSON.parse(JSON.stringify(r[0])); RD.__from = r[0].__from;111  KPI = JSON.parse(JSON.stringify(r[1])); KPI.__from = r[1].__from;112  $('#tt').textContent = RD.name;113  $('#src').innerHTML = srcBadge(RD);114  $('#src2').innerHTML = srcBadge(KPI);115  drawRadar(); cmp(); diag();116  CH.legend($('#lg'), RD.series, drawRadar);117  $('#kpisel').innerHTML = KPI.items.map(function(it,i){118    return '<button class="'+(i===0?'on':'')+'" data-v="'+i+'">'+it.name+'</button>';119  }).join('');120  segGroup('#kpisel', function(v){ gi=+v; drawGauge(); });121  rings();122  $('#jsonbox').innerHTML = hlJSON(r[0]);123})['catch'](function(e){ failBox($('#c1'), e); });124125segGroup('#tab', function(v){126  $('#pane-radar').style.display = v==='radar' ? '' : 'none';127  $('#pane-gauge').style.display = v==='gauge' ? '' : 'none';128  if(v==='gauge') drawGauge(); else drawRadar();129});130$('#viewjson').addEventListener('click', function(e){ e.preventDefault(); openSheet('#sjson'); });131132if(/tab=gauge/.test(location.search)){133  $$('#tab button').forEach(function(b){ b.classList.toggle('on', b.dataset.v==='gauge'); });134  $('#pane-radar').style.display='none';135  $('#pane-gauge').style.display='';136  setTimeout(drawGauge, 300);137}138139</script>140</body>141</html>142