成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

從0開始擼一個(gè)支持單軸輪播的雷達(dá)圖之未篇-解決Echarts雷達(dá)圖單軸輪播

Prasanta / 3624人閱讀

摘要:今天要用到的理論在前兩篇都講過,如果你錯(cuò)過了前兩篇,你應(yīng)該先看看。但是我們可否用生成一個(gè)圖,自己為其寫一個(gè)呢答案是肯定的。但一切的一切前提是,要支持單軸輪播,這個(gè)圖只有一個(gè)系列。

今天要用到的理論在前兩篇都講過,如果你錯(cuò)過了前兩篇,你應(yīng)該先看看。
從0開始寫一個(gè)支持單軸輪播的雷達(dá)圖之首篇
從0開始寫一個(gè)支持單軸輪播的雷達(dá)圖之中篇

前言

通過前面我們自己實(shí)現(xiàn)了一個(gè)Radar圖,并對其實(shí)現(xiàn)了單軸輪播和hover,我們已經(jīng)明白了其中的坐標(biāo)變換,在工作中,我們用自己寫的雷達(dá)圖來做產(chǎn)品的可能性不大,畢竟精力有限,而且和Echarts的圖表相比,展示效果和魯棒性都沒法比。但是我們可否用Echarts生成一個(gè)radar圖,自己為其寫一個(gè)tooltip呢,答案是肯定的。
但一切的一切前提是,要支持單軸hover輪播,這個(gè)Radar圖只有一個(gè)系列。其實(shí)現(xiàn)的核心思想:通過實(shí)例化Echarts對象的option,我們可以獲取畫布大小,獲取標(biāo)簽和值,生成坐標(biāo)系,算出要hover點(diǎn)的坐標(biāo),然后添加上面說的hover事件和自動(dòng)輪播事件,直接上源碼:

第一步繪制對應(yīng)坐標(biāo)系
/*target 添加畫布的容器,option即為setOption中的Option,autoOption用于設(shè)定是否自動(dòng)輪播,是否hover觸發(fā),*/  
 function addHover(target,option,autoOption={autoShow:false,hoverEnable:true,time:1000}){
    const m =Math;
    var center ={  //獲取畫布的中心偏離比,因?yàn)閑charts支持百分?jǐn)?shù)控制radar圖在畫布中的位置,所以我們需要計(jì)算這個(gè)點(diǎn),當(dāng)然我們也可以為了方便,不在option中設(shè)置,這樣我們就可以直接用畫布的中心點(diǎn),即(0.5,0.5);
        pointx:(option.radar.center&&Number(option.radar.center[0].substr(0,option.radar.center[0].length-1))/100)||0.5,  //計(jì)算X軸的偏離比例
        pointy:(option.radar.center&&Number(option.radar.center[1].substr(0,option.radar.center[1].length-1))/100)||0.5, //計(jì)算y軸的偏離比例
    };
    var x=target.offsetWidth*center.pointx,y=target.offsetHeight*center.pointy; //計(jì)算radar中心點(diǎn)x的值,計(jì)算radar中心點(diǎn)x的值
    var indicator = option.radar.indicator; //獲取option中radar的標(biāo)簽
    var data = option.series[0].data[0].value;//獲取option中radar的值,我們在這里只去第一個(gè)series的值;
    var length = indicator.length; //獲取標(biāo)簽的長度,即雷達(dá)的拐點(diǎn)數(shù),這個(gè)很重要
    var step =-1; //自動(dòng)輪播要用到的參數(shù)
    var hovering =false ; //這個(gè)參數(shù)是控制輪播與hover同時(shí)觸發(fā),顯示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
創(chuàng)建hover事件和自動(dòng)輪播顯示標(biāo)簽
創(chuàng)建標(biāo)簽
    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);
        }
    }))
}

至于調(diào)用,那就簡單了

 第一步:
 var ele = document.getElementById("chart");
 var draw = echarts.init(ele);
 第二步:
 配置你的option
 var option ={};
 第三步畫出你的雷達(dá)圖
 draw.setOption(option);
 第四步:綁定事件:
 addHover(ele,option,{autoShow:true,hoverEnable:true});

上面,其實(shí)只是一個(gè)簡易的版本,在實(shí)際應(yīng)用中,我們需要考慮很多問題。

圖表局部刷新帶來的數(shù)據(jù)重載,就上面的代碼,完全不行,我們沒有清除定時(shí)器,這樣會(huì)找出多個(gè)hover重疊

用過Echarts的人,我們都知道,tooltip有個(gè)formatter函數(shù),用于顯示數(shù)據(jù)的格式化,以便展示出我們想要的效果。

性能問題,每次Hover生成一個(gè)labe元素,是否太消耗性能,作為產(chǎn)品,我們應(yīng)該怎樣優(yōu)化

怎樣才能更通用,更方便的讓人使用

基于上述問題,我對這個(gè)輪播函數(shù)做了改進(jìn)和封裝,使用方法是這樣的:

   /*Echarts圖表的正常實(shí)例化*/ 
    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看我的試驗(yàn)源碼,文件是radarAutoTip.html,歡迎star

本文首發(fā)于:http://closertb.site ,轉(zhuǎn)載請注明

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/89052.html

相關(guān)文章

  • 0開始一個(gè)支持單軸播的雷達(dá)圖之加強(qiáng)篇(解決Echarts單軸輪播問題)

    摘要:如果你嫌上面太瑣碎,可以直接取看我的試驗(yàn)源碼,文件是歡迎本文后續(xù)從開始擼一個(gè)支持單軸輪播的雷達(dá)圖之末篇本文首發(fā)于 在線示例如果你還不了解canvas,還不知道要講啥,建議從首篇看起:從0開始寫一個(gè)支持單軸輪播的雷達(dá)圖在首篇我們已經(jīng)講了怎么實(shí)現(xiàn)輪播,在這里我們將要用這一篇文章來說一下雷達(dá)圖的單軸hover效果的實(shí)現(xiàn),也是我寫這篇文章的原因,因?yàn)閑charts只支持單個(gè)series的hov...

    xcold 評(píng)論0 收藏0
  • 0開始一個(gè)支持單軸播的雷達(dá)圖(Ehcarts的單軸顯示問題)之頭篇

    摘要:引子最近做公司的數(shù)據(jù)展示項(xiàng)目,用的核心插件是,但在雷達(dá)圖的展示案列上,需求上出現(xiàn)了需要單軸輪播標(biāo)簽和數(shù)據(jù),在看完上的后,這個(gè)不支持,看了一下源碼,似乎有點(diǎn)復(fù)雜,改了改,只實(shí)現(xiàn)了多個(gè)的輪播,和需求還是有差距,周末反正無聊,何不自己動(dòng)手?jǐn)]一個(gè)。 引子 最近做公司的數(shù)據(jù)展示項(xiàng)目,用的核心插件是Echarts,但在雷達(dá)圖的展示案列上,需求上出現(xiàn)了需要單軸輪播標(biāo)簽和數(shù)據(jù),在看完github上的i...

    wemall 評(píng)論0 收藏0
  • 關(guān)于css動(dòng)態(tài)樣式注入,你不知道的那些冷知識(shí)

    摘要:以上三種動(dòng)態(tài)樣式注入,不同的使用場景,各有利弊,至于你想用哪一種,需要你自己權(quán)衡,睡覺去啦。。。。 前言 作為一個(gè)前端,我們都聽過結(jié)構(gòu),樣式,行為分離;關(guān)于樣式,我們都聽過外聯(lián)樣式,內(nèi)聯(lián)樣式和行內(nèi)樣式;關(guān)于這三者,什么權(quán)重啊,啊,對了,這些都不會(huì)出現(xiàn)在這篇文章里,這篇文章就說一些那些我們不怎么使用的,動(dòng)態(tài)引入css樣式的方法; 靜態(tài)樣式引入 前面說過外聯(lián)樣式,內(nèi)聯(lián)樣式和行內(nèi)樣式,所謂外...

    ztyzz 評(píng)論0 收藏0
  • echarts4.x雷達(dá)圖如何展示一維數(shù)據(jù)?

    摘要:另外,需要將雷達(dá)圖的半徑設(shè)置和極坐標(biāo)的半徑設(shè)置設(shè)為相同,以便他們有相同的放縮比例。極坐標(biāo)的徑向軸的分隔個(gè)數(shù)和雷達(dá)圖的指示器軸的分割個(gè)數(shù)必須相同。 最近做的項(xiàng)目其中一個(gè)功能是畫雷達(dá)圖,鼠標(biāo)滑過雷達(dá)圖的拐點(diǎn),展示該維相關(guān)數(shù)據(jù),并且需要顯示雷達(dá)圖的刻度。 但是我發(fā)現(xiàn)單純的雷達(dá)圖似乎沒辦法展示一維數(shù)據(jù)。 我總結(jié)了一下,關(guān)于畫雷達(dá)圖,我遇到的難點(diǎn)有三個(gè): (1)如何顯示刻度。 (2)如何判斷滑過...

    godruoyi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<