自定义一个canvas柱状图demo

一、html

html本身很简单,就是引入jquery和自己写的一个js,调用一下自己写的js的一个方法。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>canvas柱状图demo</title>
    <!--<link rel="stylesheet" type="text/css" href="css/style.css">-->
    <script src="jquery-2.0.3.min.js"></script>
    <script src="drawCanvas.js"></script>
</head>
<body id="body">
</body>
<script>
    showResult();
</script>
</html>
二、drawCanvas.js

这里我写的有点复杂,考虑适配了。有时间来重新优化一下这里的代码,至少有点可读性吧。

function showResult(info){
        //console.log(info);
        //console.log(JSON.parse(info));
        info = '[{"selectName":"A","selectNum":3,"isRight":0},{"selectName":"A","selectNum":13,"isRight":0},{"selectName":"B","selectNum":28,"isRight":1}]';
        var results = JSON.parse(info);
        var selectNum = results.length;
        var maxNum = 0;
        for(var i =0;i<results.length;i++){
            console.log(maxNum+"/"+results[i].selectNum);
            if(maxNum < parseInt(results[i].selectNum)){
                maxNum = parseInt(results[i].selectNum);
            }
        }
        var maxLineNum = Math.ceil(maxNum/5)*5;
        var xPlus = 0.9/(selectNum+1);
        var xStart = xPlus;
        var yStart = 0.9;

        var lineColor = "#e5e5e5";
        var rightRecColor = '#3dc600';
        var wrongRecColor = '#f65e5e';
        var xyFontColor = "#aaaaaa";//#999999不好看
        var selectFontColor = "#666666";

        var cw = document.documentElement.clientWidth;
        var ch = document.documentElement.clientHeight;
        var fontSize = cw/54;//54 
        var fontAndSize = fontSize + "px Arial";
        var rect_w = cw/12;//120
        $("body").append('<canvas id="js-test-result" width="'+cw+'" height="'+ ch +'"></canvas>');
//        $("#js-test-result").css("width",cw);
//        $("#js-test-result").css("height",ch);
        $("#js-test-result").css("background","#ffffff");
        var resultCanvas = document.getElementById("js-test-result");
        var rcxt = resultCanvas.getContext("2d");
        rcxt.clearRect(0,0,cw,ch);
        $("#js-test-result").show();
        var num = 35;
        //x轴 及其平行轴
        for(var i =1;i< 9;i++){
            rcxt.strokeStyle= lineColor;
            rcxt.beginPath();
            rcxt.moveTo(cw*0.1,ch*(i*0.1+0.1));
            rcxt.lineTo(cw*0.9,ch*(i*0.1+0.1));
            rcxt.closePath();
            rcxt.stroke();
            //画选项
            rcxt.font=fontAndSize;
            rcxt.fillStyle = selectFontColor;
            if(num<10){
                //rcxt.fillText(" "+num,cw*0.1-fontSize*2,ch*(i*0.1+0.1));
            }else{
                //rcxt.fillText(num,cw*0.1-fontSize*2,ch*(i*0.1+0.1));
            }

            num=num-5;
        }
        //y轴
        rcxt.strokeStyle= lineColor;
        rcxt.beginPath();
        rcxt.moveTo(cw*0.1,ch*0.9);
        rcxt.lineTo(cw*0.1,ch*0.1);
        rcxt.closePath();
        rcxt.stroke();



        // 画方块
        for (var i =0;i<selectNum;i++){
            var result = results[i];
            if(result.isRight == 1){
                rcxt.fillStyle = rightRecColor;
            }else{
                rcxt.fillStyle = wrongRecColor;
            }
            var recH = ch*0.8*result.selectNum/maxLineNum;
            console.log(result.selectNum+"/"+maxLineNum);
            rcxt.fillRect(cw*(xStart+i*xPlus),ch*yStart-recH,rect_w,recH);//(x,y,width,height);
            //画选项
            rcxt.font=fontAndSize;
            rcxt.fillStyle = selectFontColor;
            rcxt.fillText(result.selectName + "选项 ("+result.selectNum+"人)",cw*(xStart+(i-0.03)*xPlus),ch*yStart+fontSize);
        }

        //画正确标识
        rcxt.fillStyle = rightRecColor;
        rcxt.fillRect(cw*0.8-1.2*fontSize,ch*0.1-1.6*fontSize,fontSize,fontSize/2);//(x,y,width,height);
        rcxt.font=fontAndSize;
        rcxt.fillStyle = xyFontColor;
        rcxt.fillText("正确答案",cw*0.8,ch*0.1-fontSize);

        //画正确标识
        rcxt.fillStyle = wrongRecColor;
        rcxt.fillRect(cw*0.9-1.2*fontSize,ch*0.1-1.6*fontSize,fontSize,fontSize/2);//(x,y,width,height);
        rcxt.font=fontAndSize;
        rcxt.fillStyle = xyFontColor;
        rcxt.fillText("错误答案",cw*0.9,ch*0.1-fontSize);
    }

效果:

效果图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,906评论 25 709
  • 在线阅读 http://interview.poetries.top[http://interview.poetr...
    前端进阶之旅阅读 115,191评论 24 450
  • Sunny飞镜阅读 1,238评论 0 0
  • 你知道我有多想你么? 每天早上拖着迷乱的身体爬起做早操的路上就开始一遍一遍默念你的名字。做早操前会放歌,此时满是...
    唯敏如汐阅读 1,441评论 0 0
  • 团团两岁半,第一次离开我身边,不知道对于两岁半的孩子来说,是跟妈妈窝在一起比较好,还是出去看看多彩的天空更...
    唐朝李白阅读 5,203评论 24 51

友情链接更多精彩内容