Echarts 折線圖區域鼠標事件高亮

最近又用起了百度echarts,好久沒用了,特別推薦之前寫的文章: Echarts柱狀圖詳解


在使用折線圖時,當折線很多且密集時,去查看節點數據,很難分清是哪一個類別的數據,如下圖:
在這裏插入圖片描述
這時就需要找一種方式區別出來,當點擊節點時,區域進行高亮(我給了大紅色),折線加粗,鼠標移開節點,恢復正常,提示內容爲當前折線名稱,如下圖:
在這裏插入圖片描述
動態效果如下:
在這裏插入圖片描述
實現過程:
   點擊節點時,暫存當前折線區域顏色, 改變區域背景顏色及折線樣式,當鼠標離開節點時,還原區域背景色及折線樣式。
   因爲還原折線點擊後區域的樣式使用的是鼠標移開事件,這個事件如果不加以判斷,每當鼠標聚焦到節點然後離開時,都會觸發該事件,所以要加一個標誌,只有當點擊事件後,纔可以成功觸發鼠標移開事件,見下面代碼。

代碼:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Demo</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <script src="js/jquery-3.2.1.min.js"></script>
    <script src="js/echarts.min.js"></script>
    <script>
        var dataJson = {
            IsClickFlg: false,
        }
        
        $(document).ready(function () {
            EchartInit();
        });

        function EchartInit() {
            var dom = document.getElementById("div_echart");
            var mychart = echarts.init(dom);
            var app = {};
            var option = {
                tooltip: {
                    trigger: 'axis',
                    axisPointer: {
                        type: 'cross',
                        label: {
                            backgroundColor: '#6a7985'
                        }
                    }
                },
                legend: {
                    data: ['電話銷售', '紙質傳媒', '郵件營銷', '聯盟廣告', '視頻廣告', '直接訪問', '搜索引擎']
                },
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    containLabel: true
                },
                xAxis: [
                    {
                        type: 'category',
                        boundaryGap: false,
                        data: ['週一', '週二', '週三', '週四', '週五', '週六', '週日']
                    }
                ],
                yAxis: [
                    {
                        type: 'value'
                    }
                ],
                series: [
                    {
                        name: '電話銷售',
                        type: 'line',
                        stack: '總量',
                        areaStyle: {},
                        data: [10, 22, 11, 24, 10, 23, 21]
                    },
                    {
                        name: '紙質傳媒',
                        type: 'line',
                        stack: '總量',
                        areaStyle: {},
                        data: [12, 13, 10, 13, 90, 23, 21]
                    },
                    {
                        name: '郵件營銷',
                        type: 'line',
                        stack: '總量',
                        areaStyle: {},
                        data: [120, 132, 101, 134, 90, 230, 210]
                    },
                    {
                        name: '聯盟廣告',
                        type: 'line',
                        stack: '總量',
                        areaStyle: {},
                        data: [220, 182, 191, 234, 290, 330, 310]
                    },
                    {
                        name: '視頻廣告',
                        type: 'line',
                        stack: '總量',
                        areaStyle: {},
                        data: [150, 232, 201, 154, 190, 330, 410]
                    },
                    {
                        name: '直接訪問',
                        type: 'line',
                        stack: '總量',
                        areaStyle: {},
                        data: [320, 332, 301, 334, 390, 330, 320]
                    },
                    {
                        name: '搜索引擎',
                        type: 'line',
                        stack: '總量',
                        label: {
                            normal: {
                                show: true,
                                position: 'top'
                            }
                        },
                        areaStyle: {},
                        data: [220, 332, 401, 234, 590, 630, 320]
                    }
                ]
            };

            if (option && typeof option === "object") {
                mychart.setOption(option, true);
            }

            var color = "";
            mychart.on('click', function (params) {
                //觸發了點擊事件
                dataJson.IsClickFlg = true;

                //記錄區域高亮前的顏色
                color = params.color;
                mychart.setOption({
                    tooltip: {
                        trigger: 'item',
                    },
                    series: {
                        name: params.seriesName,
                        symbolSize: 5,
                        lineStyle: {
                            width: 5
                        },
                        areaStyle: {
                            color: 'red'
                        },
                        tooltip: {
                            textStyle: {
                                color: 'white',
                                fontSize: 14
                            }
                        }
                    },
                });
            });

            mychart.on('mouseout', function (params) {
                //加上判斷是否點擊過的標誌作用,避免鼠標監控事件一直觸發,導致區域顏色會改變,可以去掉這句代碼試下
                if (dataJson.IsClickFlg) {
                    mychart.setOption({
                        tooltip: {
                            trigger: 'axis',
                        },
                        series: {
                            name: params.seriesName,
                            symbolSize: 2,
                            lineStyle: {
                                width: 2
                            },
                            areaStyle: {
                                color: color
                            },
                        }
                    });
                    //區域顏色還原,點擊標誌還原
                    dataJson.IsClickFlg = false;
                }
            });
        }
    </script>
</head>
<body>
    <div id="div_echart" style="width: 1000px; height: 500px; margin: 0 auto">
    </div>
</body>
</html>

可能有人覺得點擊節點太費事,手抖點不準節點咋辦啊,沒事… 我們可以將點擊事件改爲鼠標聚焦事件mouseover,這樣只要你的鼠標慢慢移動到節點即可觸發高亮效果。但是這種方式最好用於折線很少且鬆散時,當折線很多且密集時,你的鼠標在圖上亂抖時,畫面可想而知…如下圖,我的電腦當時直接卡死…
在這裏插入圖片描述
最後推薦我自己寫的幾篇Echarts文章:Echarts專欄

歡迎
關注
CSDN Github
博客園 個人網站
此博客內容是本人在平時工作、學習中,寫下這些小總結,其中內容多爲初次接觸,不能保證完全正確、最優,如有疑問或不足之處,望評論指出。謝謝!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章