专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > HTML5

HTML5-canvas范例:2D折线数据图

发布时间:2010-05-20 14:01:29 文章来源:www.iduyao.cn 采编人员:星星草
HTML5-canvas实例:2D折线数据图
基础知识:
<canvas id="demo" width="400" height="400"></canvas>

在页面上创建canvas标签,然后获取canvas这个元素,因为是画2D图,所以是调用.getContext('2d') 二维图方法

var target = document.getElementById('demo'),
     pic = target.getContext('2d');

canvas作图的平面空间,该空间的每个点都有自己的坐标,x表示横坐标,y表示竖坐标。原点(0, 0)位于图像左上角,x轴的正向是原点向右,y轴的正向是原点向下。

部分API的介绍: 

  pic.beginPath(); //创建开始描绘路径(每一条线都需要重新创建一次,否则以后的操作【如填充颜色】都会反映在此路径)
    pic.moveTo(0, 0); //描绘的起点
    pic.lineTo(100,100); // 设置描绘线的终点,可以调用多次(以上次的终点为起点,继续描绘)
    pic.lineTo(240,340);
    pic.lineWidth = 1; //设置宽度
    pic.strokeStyle = '#259'; //设置颜色
    pic.stroke(); //填充
    pic.closePath(); //关闭此路径,可选

封装:

  描绘路径必需知道起点坐标与终点坐标,因为可能是多次描绘,所以就需要用到二维数组把各个坐标保存下来,如[ [0,0],[100,50],[2,50] ],然后遍历二维数组,多次调用lineTo方法进行描绘。封装函数如下:

// 画线 
    function drawContLine(opt){
        pic.beginPath();
        var path = opt.path,//[[0,0],[20,30]......]
            color = opt.color;
        pic.moveTo(path[0][0],path[0][1]);
        var n = 1,
            len = path.length;
        for(;n<len;n++){
            pic.lineTo(path[n][0],path[n][1]);
        }
        pic.lineWidth = 1;
        pic.strokeStyle = color;
        pic.stroke();
        pic.closePath();
    }

例子:月份成绩分数对比曲线图

  

完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0"/>
    <title>Document</title>
    <style type="text/css">
    .ui-fill{border:1px solid #666;border-top:none;border-right:none;width:400px;height:400px;margin:50px auto;position:relative;}
    .scroe span{position:absolute;left:-40px;}
    .a10{top:-10px;}.a9{top:30px;}.a8{top:70px;}.a7{top:110px;}.a6{top:150px;}
    .a5{top:190px;}.a4{top:230px;}.a3{top:270px;}.a2{top:310px;}.a1{top:350px;}
    .year span{position:absolute;top:410px;white-space:nowrap;color:#700404;}
    .y1{left:70px;}.y2{left:150px;}.y3{left:230px;}.y4{left:310px;}.y5{left:390px;}
    </style>
</head>
<body>
    <div class="ui-fill">
        <canvas id="demo" width="400" height="400"></canvas>
        <div class="scroe">
            <span class="a1">10</span>
            <span class="a2">20</span>
            <span class="a3">30</span>
            <span class="a4">40</span>
            <span class="a5">50</span>
            <span class="a6">60</span>
            <span class="a7">70</span>
            <span class="a8">80</span>
            <span class="a9">90</span>
            <span class="a10">100</span>
        </div>
        <div class="year">
            <span class="y1">1月</span>
            <span class="y2">2月</span>
            <span class="y3">3月</span>
            <span class="y4">4月</span>
            <span class="y5">5月</span>
        </div>
    </div>
    <script type="text/javascript">
    var target = document.getElementById('demo');
    var pic = target.getContext('2d');
    //参数
    var sum = 400,
        ratio = 400/100;
    // 画线 
    function drawContLine(opt){
        pic.beginPath();
        var path = opt.path,//[[0,0],[20,30]......]
            color = opt.color;
        pic.moveTo(path[0][0],path[0][1]);
        var n = 1,
            len = path.length;
        for(;n<len;n++){
            pic.lineTo(path[n][0],path[n][1]);
        }
        pic.lineWidth = 1;
        pic.strokeStyle = color;
        pic.stroke();
        pic.closePath();
    }
    // 刻度线
    (function(){
        var scale = 20,
            i = sum/scale,
            n = 0;
        for(;n<i;n++){
            drawContLine({'path':[[scale*n*4,0],[scale*n*4,sum]],'color':'#f4f4f4'});
            drawContLine({'path':[[0,scale*n],[sum,scale*n]],'color':'#f4f4f4'});                        
        }
    })();
    // 分数转化为坐标输出
    function transforCoor(opt){
        var scroes = opt.scroes,
            scale = 20*4,
            n = 0,
            len = scroes.length,
            a_path = [];
        for(;n<len;n++){
            var x = sum - scroes[n]*ratio;
            var arry = [scale*(n+1),x];
            //console.log(arry);
            a_path.push(arry);
        }

        drawContLine({'path':a_path,'color':opt.color});
    }
    transforCoor({'scroes':[90,80,98,70,60],'color':'#259'});
    transforCoor({'scroes':[88,86,85,84,85],'color':'#f60'});
    </script>
</body>
</html>

 

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • 使用HBuilder编辑器将html五页面打包成APP

    使用HBuilder编辑器将html5页面打包成APP   使用HBuilder编辑器将html5页面打包成APP (ios+安卓) 1.首先先安装HBuilder编...

  • 基于phonegap,html5,ratchet,handlebars等技术的微神情APP

    基于phonegap,html5,ratchet,handlebars等技术的微表情APP 该app是由很多有意思的微表情构成的,支持40种表情,并且每种表情都有不同的...

  • HTML5 Web 客户端五种离线储存方式汇总

    HTML5 Web 客户端五种离线存储方式汇总 最近折腾HTML5游戏需要离线存储功能,便把目前可用的几种HTML5存储方式研究了下,基于H...

  • SPICE-HTML5 鼠标指针BUG修补

    SPICE-HTML5 鼠标指针BUG修复 研究SPICE,找到了他们官方指定的HTML5客户端。 下载下来用一下,发现跟网页VNC的水平差不多了。 http:...

  • HTML5+JS 《五子飞》游戏实现(5)移动棋子

    HTML5+JS 《五子飞》游戏实现(五)移动棋子 上一章 我们知道了怎么处理两个重要的吃棋动作,想要吃对方的棋子,首先得移动自己的棋子。...

  • HTML5中怎么上传Resize后的图片

    HTML5中如何上传Resize后的图片 参考资料: 不依赖form标签,而是自己定义FormData上传数据,文件被编码为一个Blob或File对象: https...

  • (1)HTML5

    (一)HTML5 可以解决什么问题: 可以实现网页的ajax加载,同时又能完成URL的改变而没有网页跳转刷新的迹象,就像是改变了网页的hash(#)一样。...

  • 一款纯html5实现的钟表

    一款纯html5实现的时钟 今天给大家分享一款非常漂亮的纯html5实现的时钟。整个界面都由html5绘制而成。一起看下效果图: 在线预览...

  • 使用 WebSockets 开展 HTML5 视频直播

    使用 WebSockets 进行 HTML5 视频直播 实验环境:Ubuntu。 参考以下两个链接进行实践: http://segmentfault.com/blog/xingrz/119...

  • 查询浏览器是不是支持html5

    查询浏览器是否支持html5 js判断 插入js代码====================================================== <script> wind...

热门推荐: