数据展示-条形图-canvas

10 篇文章 0 订阅
8 篇文章 0 订阅

假设后台要求实现一个条形图,而且还是动态生成,(此处暂时不考虑用户输入数值,仅考虑数据从后台生成);
大概效果如图:
这里写图片描述
比如在500*500的框内生成;以下是基本布局,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>trialgame</title>
    <style>
        * {
            margin: 0;
            padding: 0
        }
        canvas {
            margin: 0;
            padding: 0;
            background: #ddd;
        }
    </style>
</head>
<body>
<canvas id="cloth" width="500" height="500"></canvas>
<button id="btn">开始</button>
<script>
//此处写代码
</script>
</body>
</html>

首先,每一个矩形框就是具有位置(横纵坐标)高度宽度这四个属性;这样只要new rec,那么这个变量就会具有位置和高度等属性;

var rec = function (x, y, w, h) {
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
    }

其次,生成矩形框需要有一个方法,我选择增加给rec,(矩形颜色为京东红,默认未考虑兼容性;考虑兼容性也不难),

rec.prototype.draw = function () {
        var ctx = document.getElementById("cloth").getContext("2d");
        ctx.fillStyle = "#e4393c";
        ctx.rect(this.x, this.y, this.w, this.h);
        ctx.fill()
    }

假设后台传过来50 100 150等比增加的数据;这里用全局变量y代替;为了性能,防止用户狂点,这里定义全局变量timer;

var y=50;
var timer=null;

最后定义点击事件,这里假设只有9条数据,

btn.onclick= function (){
            clearInterval(timer);
            timer=setInterval(function () {
                if(y<500){
                    console.log("y:"+y);
                    var x = new rec(y - 30, 500 - y, 30, y);
                    x.draw();
                    y+=50
                }else{
                    clearInterval(timer);
                    console.log(y);
                }
            }, 1000)
    }

以上就达到效果了;
真正从后台传过来的数据;
一般是json格式,也可以处理,但那不是今天要讲的内容;
以下是完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>trialgame</title>
    <style>
        * {
            margin: 0;
            padding: 0
        }
        canvas {
            margin: 0;
            padding: 0;
            background: #ddd;
        }
    </style>
</head>
<body>
<canvas id="cloth" width="500" height="500"></canvas>
<button id="btn">开始</button>
<script>
    var rec = function (x, y, w, h) {
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
    }
    rec.prototype.draw = function () {
        var ctx = document.getElementById("cloth").getContext("2d");
        ctx.fillStyle = "#e4393c";
        ctx.rect(this.x, this.y, this.w, this.h);
        ctx.fill()
    }
    var y=50;
    var timer=null;
    btn.onclick= function (){
            clearInterval(timer);
            timer=setInterval(function () {
                if(y<500){
                    console.log("y:"+y);
                    var x = new rec(y - 30, 500 - y, 30, y);
                    x.draw();
                    y+=50
                }else{
                    clearInterval(timer);
                    console.log(y);
                }
            }, 1000)
    }

</script>
</body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liugang0605

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值