摘要:今天要用到的理論在前兩篇都講過,如果你錯過了前兩篇,你應該先看看。但是我們可否用生成一個圖,自己為其寫一個呢答案是肯定的。但一切的一切前提是,要支持單軸輪播,這個圖只有一個系列。
今天要用到的理論在前兩篇都講過,如果你錯過了前兩篇,你應該先看看。
從0開始寫一個支持單軸輪播的雷達圖之首篇
從0開始寫一個支持單軸輪播的雷達圖之中篇
通過前面我們自己實現了一個Radar圖,并對其實現了單軸輪播和hover,我們已經明白了其中的坐標變換,在工作中,我們用自己寫的雷達圖來做產品的可能性不大,畢竟精力有限,而且和Echarts的圖表相比,展示效果和魯棒性都沒法比。但是我們可否用Echarts生成一個radar圖,自己為其寫一個tooltip呢,答案是肯定的。
但一切的一切前提是,要支持單軸hover輪播,這個Radar圖只有一個系列。其實現的核心思想:通過實例化Echarts對象的option,我們可以獲取畫布大小,獲取標簽和值,生成坐標系,算出要hover點的坐標,然后添加上面說的hover事件和自動輪播事件,直接上源碼:
/*target 添加畫布的容器,option即為setOption中的Option,autoOption用于設定是否自動輪播,是否hover觸發,*/ function addHover(target,option,autoOption={autoShow:false,hoverEnable:true,time:1000}){ const m =Math; var center ={ //獲取畫布的中心偏離比,因為echarts支持百分數控制radar圖在畫布中的位置,所以我們需要計算這個點,當然我們也可以為了方便,不在option中設置,這樣我們就可以直接用畫布的中心點,即(0.5,0.5); pointx:(option.radar.center&&Number(option.radar.center[0].substr(0,option.radar.center[0].length-1))/100)||0.5, //計算X軸的偏離比例 pointy:(option.radar.center&&Number(option.radar.center[1].substr(0,option.radar.center[1].length-1))/100)||0.5, //計算y軸的偏離比例 }; var x=target.offsetWidth*center.pointx,y=target.offsetHeight*center.pointy; //計算radar中心點x的值,計算radar中心點x的值 var indicator = option.radar.indicator; //獲取option中radar的標簽 var data = option.series[0].data[0].value;//獲取option中radar的值,我們在這里只去第一個series的值; var length = indicator.length; //獲取標簽的長度,即雷達的拐點數,這個很重要 var step =-1; //自動輪播要用到的參數 var hovering =false ; //這個參數是控制輪播與hover同時觸發,顯示hover值,暫停輪播顯示 var radius=option.radar.radius,pointData=[]; //獲取radar的半徑 var style ={ //hover顯示的樣式 color:"#fff", border:"1px solid rgb(51,51,51)", borderRadius:"4px", backgroundColor:"rgba(50,50,50,0.7)" }; const single = 2*m.PI /length*(-1); for(let i = 0;i創建hover事件和自動輪播顯示標簽 創建標簽 let label =document.createElement("label"); label.style.position="absolute"; label.style.display="none"; target.appendChild(label); function hoverLabel(label,point,text,style){ label.style.display ="none"; label.style.top=point.y+"px"; label.style.left=point.x+"px"; label.style.border=style.border; label.style.color =style.color; label.style.borderRadius=style.borderRadius; label.style.backgroundColor = style.backgroundColor; label.style.transition ="left 0.4s cubic-bezier(0.23,1,0.32,1),top 0.4s cubic-bezier(0.23,1,0.32,1)"; label.style.zIndex = 999; label.innerHTML =text; label.style.display ="inline"; } function removeLabel(dom) { dom.style.display ="none"; }添加輪播事件autoOption.autoShow&&(setInterval(function () { //控制輪播 step = (step+1)%length; var showPoint={ x:pointData[step][0]+x, y:y-pointData[step][2] } var tag =indicator[step]; var text = tag.name+":"+m.round(data[step]*100/tag.max)+"%"; (!hovering)&&hoverLabel(label,showPoint,text,style); },autoOption.time||1000)); target.addEventListener("click",function(event){ console.log(event); });添加hover事件autoOption.hoverEnable&&(target.addEventListener("mousemove",function(event){ //控制hover const canvas= target.querySelector("canvas"); const mouse = getMousePos(canvas, event); let point={}; let index =-1; const r =5; point.x=mouse.x-x; point.y=y-mouse.y; for(let i=0;i(item[0] - r) && point.x < (item[0] + r) && point.y > (item[1] - r) && point.y < (item[1] + r)) { index = i; break; } } if(index!==-1){ var tag =indicator[index] var text = tag.name+":"+m.round(data[index]*100/tag.max)+"%"; hovering =true; hoverLabel(label,mouse,text,style); }else{ hovering =false; removeLabel(label); } })) } 至于調用,那就簡單了
第一步: var ele = document.getElementById("chart"); var draw = echarts.init(ele); 第二步: 配置你的option var option ={}; 第三步畫出你的雷達圖 draw.setOption(option); 第四步:綁定事件: addHover(ele,option,{autoShow:true,hoverEnable:true});上面,其實只是一個簡易的版本,在實際應用中,我們需要考慮很多問題。
圖表局部刷新帶來的數據重載,就上面的代碼,完全不行,我們沒有清除定時器,這樣會找出多個hover重疊
用過Echarts的人,我們都知道,tooltip有個formatter函數,用于顯示數據的格式化,以便展示出我們想要的效果。
性能問題,每次Hover生成一個labe元素,是否太消耗性能,作為產品,我們應該怎樣優化
怎樣才能更通用,更方便的讓人使用
基于上述問題,我對這個輪播函數做了改進和封裝,使用方法是這樣的:
/*Echarts圖表的正常實例化*/ var target = document.getElementById("highOpinionChart"); myChart = echarts.init(target); myChart.setOption(option); /*為圖表綁定輪播事件和Hover事件*/ var radarAutoInfo = {hoverEnable: true, autoShow: true, time: 2000, formatter:function(v){ return v.text + ":" + (v.value*100/v.max).toFixed(2)+"%"; }}; RadarAutoTip(myChart,target, option, radarAutoInfo); //綁定 //測試停止,開始和重置方法 document.querySelector("#reset").addEventListener("click",function (e) { console.log(e); if(e.target.innerText === "停止"){ e.target.innerText ="開始" myChart.radarAutoTip.stop(); }else{ e.target.innerText = "停止"; myChart.radarAutoTip.start(); } }); document.querySelector("#rereset").addEventListener("click",function (e) { myChart.radarAutoTip.reset(); });至此,我們就完全解決了Echarts單軸輪播問題。
如果你嫌上面講的太瑣碎,不直觀,可以直接取github看我的試驗源碼,文件是radarAutoTip.html,歡迎star本文首發于:http://closertb.site ,轉載請注明
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89052.html
摘要:如果你嫌上面太瑣碎,可以直接取看我的試驗源碼,文件是歡迎本文后續從開始擼一個支持單軸輪播的雷達圖之末篇本文首發于 在線示例如果你還不了解canvas,還不知道要講啥,建議從首篇看起:從0開始寫一個支持單軸輪播的雷達圖在首篇我們已經講了怎么實現輪播,在這里我們將要用這一篇文章來說一下雷達圖的單軸hover效果的實現,也是我寫這篇文章的原因,因為echarts只支持單個series的hov...
摘要:引子最近做公司的數據展示項目,用的核心插件是,但在雷達圖的展示案列上,需求上出現了需要單軸輪播標簽和數據,在看完上的后,這個不支持,看了一下源碼,似乎有點復雜,改了改,只實現了多個的輪播,和需求還是有差距,周末反正無聊,何不自己動手擼一個。 引子 最近做公司的數據展示項目,用的核心插件是Echarts,但在雷達圖的展示案列上,需求上出現了需要單軸輪播標簽和數據,在看完github上的i...
摘要:以上三種動態樣式注入,不同的使用場景,各有利弊,至于你想用哪一種,需要你自己權衡,睡覺去啦。。。。 前言 作為一個前端,我們都聽過結構,樣式,行為分離;關于樣式,我們都聽過外聯樣式,內聯樣式和行內樣式;關于這三者,什么權重啊,啊,對了,這些都不會出現在這篇文章里,這篇文章就說一些那些我們不怎么使用的,動態引入css樣式的方法; 靜態樣式引入 前面說過外聯樣式,內聯樣式和行內樣式,所謂外...
摘要:另外,需要將雷達圖的半徑設置和極坐標的半徑設置設為相同,以便他們有相同的放縮比例。極坐標的徑向軸的分隔個數和雷達圖的指示器軸的分割個數必須相同。 最近做的項目其中一個功能是畫雷達圖,鼠標滑過雷達圖的拐點,展示該維相關數據,并且需要顯示雷達圖的刻度。 但是我發現單純的雷達圖似乎沒辦法展示一維數據。 我總結了一下,關于畫雷達圖,我遇到的難點有三個: (1)如何顯示刻度。 (2)如何判斷滑過...
閱讀 3256·2021-09-22 15:58
閱讀 1719·2019-08-30 14:17
閱讀 1722·2019-08-28 18:05
閱讀 1508·2019-08-26 13:33
閱讀 688·2019-08-26 12:20
閱讀 611·2019-08-26 12:18
閱讀 3195·2019-08-26 11:59
閱讀 1408·2019-08-26 10:36