[项目实战] 关于Echarts的二次封装

2,734 阅读3分钟

前言

最近在做报表类的项目,图表热门的框架有Echarts和Highcharts,两者的共同点是都是基于浏览器渲染技术的纯JS框架,且API文档全面,看着文档都能写出一个差不多的饼状图或者柱状图,但在最终做项目前,还是要看看两者的区别,来选择一个作为项目的主要框架。

两者区别

Echarts已经兼容了大部分的浏览器,且是国人开发,免费,首选。

Echarts

  • echarts是百度公司前端开发的一个图表库,
  • 支持柱状图、饼状图、k线图、map图、热导向图、折线图
  • 主要采用canvas画图,正式因为基于canvas绘图对于动态的增删节点是需要重新绘图加载数据,而且无法动态改变图表的尺寸,只能是缩放
  • 商用免费
  • 中文文档,学习成本低
  • 兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等)

Highcharts

  • highcharts是国外的一家公司开发的图表库,主要采用svg画图,对于动态的增删节点数据非常灵活,不需要重新绘图
  • 英文文档,学习成本高
  • 商用收费

对Echarts的二次封装

封装是结合自己的项目来更好的运用,对所有页面通用,如下,局部待完善。

项目效果图

项目功能

  • 图表自适应
  • 柱形图增加移上去cross指针效果
  • 自定义配置

所用语言

Jq + Ko.js + Echarts.js + bootstrap

项目地址

github.com/lirongrong/…

重要代码如下:可以直接看项目地址,有的UI配置二次更新过,下面为首次代码,有不对的地方请大神指正!

var ChartViewModel = function(){
    var that = this;
    //初始化页面
    that.init = function(){
        //加载饼图
        that.loadRound();
        //加载柱形
        that.loadColumn();
    },
    that.loadRound = function(){
        var data = [
            {
                value:10,
                name:'01',
                color:'#4285f4'
            },
            {
                value:20,
                name:'02',
                color:'#e94335'
            },
            {
                value:5,
                name:'03',
                color:'#fbbc05'
            }
        ];
        $('#chart_01').initRoundChart({
            title: "",
            legendData: $.initChartRoundData(data).legendData,
            seriesData: $.initChartRoundData(data).seriesData
        }); 
    },
    that.loadColumn = function(){
        var data = [
            {
                name:'01',
                type:'bar',
                color:'#4285f4',
                data:[12,22,33]
            },
            {
                name:'02',
                type:'line',
                color:'#e94335',
                data:[12,22,40]
            }
        ];
        $('#chart_02').initColumnChart({
            title: "",
            legendData: $.initChartColumnData(data).legendData,
            seriesData: $.initChartColumnData(data).seriesData
        }); 
    }
}
var vm = new ChartViewModel();
ko.applyBindings(vm);
vm.init();
//扩展dom方法
$.fn.extend({
    //圆饼图表方法
    initRoundChart: function (options) {
        var defaults = {
            title: '',
            number: '',
            legendData: [],
            seriesData: []
        };
        var opts = $.extend(defaults, options);
        if (!$(this)[0]) {
            return false;
        }
        // 基于准备好的dom,初始化echarts实例   
        var myChart = echarts.init($(this)[0]);

        // 指定图表的配置项和数据
        var option = {
            //标题
            title: {
                //text: opts.title + ':' + opts.number,
                // subtext: '纯属虚构',//副标题
                x: 'center',
                textStyle: {
                    color: "#333",
                    fontSize: 16,
                    fontWeight: 'normal'
                },
                bottom: '90'
            },
            tooltip: {
                trigger: 'item',
                formatter: "{a} <br/>{b} ({d}%)",//{a} <br/>{b} : {c} ({d}%) 
            },
            //图例
            legend: {
                orient: 'horizontal',
                left: 'center',
                data: opts.legendData,
                textStyle: {
                    fontSize: 12,
                    color: '#666'
                },
                itemWidth: 15,
                itemHeight: 12,
                top: '240'
            },
            series: [
                {
                    name: opts.title,
                    type: 'pie',
                    radius: '55%',
                    center: ['50%', '35%'],
                    data: opts.seriesData,
                    itemStyle: {
                        emphasis: {
                            shadowBlur: 10,
                            shadowOffsetX: 0,
                            shadowColor: 'rgba(0, 0, 0, 0.5)'
                        }
                    }
                }
            ]
        };

        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option); 
    },
    //柱形图表
    initColumnChart: function (options) {
        var defaults = {
            title: '',
            subText: '',
            xAxisData: [],
            rotate: 0,
            seriesData: [],
            legendData: []//图例
        };
        var opts = $.extend(defaults, options);
        if (!$(this)[0]) {
            return false;
        }

        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init($(this)[0]);

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: opts.title,
                subtext: opts.subText,//副标题
                //x: 'center',
                textStyle: {
                    color: "#333",
                    fontSize: 16,
                    fontWeight: 'normal'
                }
            },
            color: ['#ff6633'],
            tooltip: {
                trigger: 'axis',
                axisPointer: {            // 坐标轴指示器,坐标轴触发有效
                    type: 'cross',        // 默认为直线,可选为:'line' | 'shadow' | 'cross'//横纵指示
                    color: '#f5f5f5'
                }
            },
            //canvas的位置
            grid: {
                left: '3%',
                right: '4%',
                bottom: '3%',
                containLabel: true
            },
            xAxis: {
                type: 'category',
                splitLine: {
                    show: false
                },
                borderWidth: 0,
                borderColor: '#f5f5f5',
                axisLabel: {
                    interval: 0,//横轴信息全部显示
                    rotate: opts.rotate
                },
                data: opts.xAxisData
            },
            yAxis: [
                {
                    type: 'value'
                }
            ],
            legend: {
                data: opts.legendData
            },
            series: opts.seriesData
        };

        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
    }

});

//扩展$元素方法
$.extend({
    //遍历月份
    monthData: function () {
        var data = [];
        for (var i = 1; i <= 12; i++) {
            data.push(i + '月');
        }
        return data;
    },
    //封装圆饼图输出data的方法
    initChartRoundData: function (arr) {
        if (!arr)
            return false;
        var legendData = [];
        var seriesData = [];
        for (var i = 0; i < arr.length; i++) {
            legendData.push(arr[i].name);
            seriesData.push({
                value: arr[i].value,
                name: arr[i].name,
                itemStyle: {
                    color: arr[i].color
                }
            });
        };
        return {
            legendData,
            seriesData
        };
    },
    //封装柱形图输出data的方法
    initChartColumnData: function (arr) {
        if (!arr)
            return false;
        var defaults = {
            name: '',
            type: 'line',
            stack: '',
            data: [],
            barWidth: 30,//默认柱子宽度30px
            color: ''
        };
        var legendData = [];
        var seriesData = [];
        var ops = [];
        for (var i = 0; i < arr.length; i++) {
            ops = $.extend(defaults, arr[i]);
            legendData.push(ops.name);
            seriesData.push({
                name: ops.name,
                type: ops.type,
                stack: ops.stack,
                data: ops.data,
                barWidth: ops.barWidth,
                itemStyle: {
                    color: ops.color
                }
            });
        }
        return {
            legendData,
            seriesData
        };
    },
    //遍历13年至今的年份
    initYearData: function () {
        var date = new Date;
        var nowYear = date.getFullYear();
        var yearList = [];
        for (var i = 2013; i < nowYear + 1; i++) {
            yearList.push(i);
        }
        return yearList;
    },
    //图表自适应
    initChartResize: function (id) {
        var chart = echarts.init($('#' + id + '')[0]);
        $(window).resize(function () {
            chart.resize();
        });
    },

})

$(function () {
    //图表自适应,凡是有chartSize命名的图表都自适应
    var dom = $('.chartSize'); 
    for (var i = 0; i < dom.length; i++) { 
        $.initChartResize(dom[i].id);
    }
});