canvas帶有座標的柱狀圖效果

admin發表於2018-05-28
本章節分享一段程式碼例項,它實現了柱狀圖效果。

並且此柱狀圖帶有座標,在底部文字框輸入資料即可生成柱狀效果。

程式碼例項如下:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<style>
.canvas {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 20%;
  margin: auto;
}
.text {
  width: 560px;
  height: 50px;
  border: 1px solid #000;
  position: absolute;
  left: 50%;
  top: 80%;
  margin-left: -280px;
  text-align: center;
  line-height: 50px;
}
.btn {
  cursor: pointer;
}
</style>
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
<script>
// 繪製座標軸
function drawBone() {
  var c = document.getElementById("canvas");
  var can = c.getContext("2d");
 
  // 繪製X座標軸
  can.beginPath();
  can.lineWidth = "2";
  can.moveTo(50, 50);
  can.lineTo(50, 350);
  can.strokeStyle = "#000";
  can.stroke();
 
  // 繪製y座標軸
  can.beginPath();
  can.lineWidth = "2";
  can.moveTo(50, 350);
  can.lineTo(650, 350);
  can.strokeStyle = "#000";
  can.stroke();
 
  // 繪製x座標軸刻度線
  for (var i = 0; i < 12; i++) {
    can.beginPath();
    can.lineWidth = "1";
    can.moveTo(70 + i * 50, 340);
    can.lineTo(70 + i * 50, 350);
    can.strokeStyle = "#000";
    can.stroke();
    // 繪製x座標軸刻度值
    can.font = "12px Arial";
    can.fillStyle = "#000";
    can.fillText(i, 66 + i * 50, 365);
  }
  can.font = "30px Arial";
  can.fillText("x", 660, 365);
 
 
  // 繪製y座標軸刻度線
  for (var i = 0; i < 5; i++) {
    can.beginPath();
    can.lineWidth = "2";
    can.moveTo(50, 100 + i * 50);
    can.lineTo(60, 100 + i * 50);
    can.strokeStyle = "#000";
    can.stroke();
  }
  // 繪製y座標軸刻度值
  for (var i = 0; i < 6; i++) {
    can.font = "12px Arial";
    can.fillStyle = "#000";
    can.fillText(i * 50, 20, 350 - i * 50);
  }
  can.font = "20px Arial";
    can.fillText("y", 20, 50);
  }
 
  // 繪製條形圖
  function drawPic(data, color) {
    var c = document.getElementById("canvas");
    var can = c.getContext("2d");
 
    for (var i = 0; i < data.length; i++) {
      can.fillStyle = color[i];
      can.fillRect(70 + 2 * i * 50, 350 - data<i>, 50, data<i>);
 
      can.beginPath();
      can.lineWidth = "0.5";
      can.strokeStyle = color<i>;
      can.moveTo(50 + 70 + 2 * i * 50, 350 - data<i>);
      can.lineTo(50, 350 - data[i])
      can.stroke();
 
 
      can.font = "12px Arial";
      //設定字型填充顏色
      can.fillStyle = color[i];
      // can.fillText(string,x,y,maxWidth);
      can.fillText(data[i], 88 + 2 * i * 50, 350 - data[i] - 5, 50);
    }
  }
 
  // 初始化
  function init() {
    drawBone();
    var data = new Array();
    var color = new Array();
 
    $("#btn").click(function () {
      // 獲取隨機顏色
      // 1、16777215為16進位制的顏色ffffff轉成10進位制的數字
      // 2、>>數字取整
      // 3、轉成16進位制不足6位的以0來補充
      if (data.length < 6) {
        var color_random = "#" + ("00000" + ((Math.random() * 16777215 + 0.5) >> 0).toString(16)).slice(-6);
        color.push(color_random);
        var value = $("#val").val();
        if (value <= 300 && value >= 0) {
          data.push(value);
          drawPic(data, color);
          // console.log(data);
          // console.log(data.length);
          $("#val").val("");
        }
        else {
          alert("請輸入0-300以內的數字");
          $("#val").val("");
        }
      }
      else {
        alert("最多輸入6個資料");
      }
    });
 
    // 回車事件
    $("body").keydown(function () {
      if (event.keyCode == "13") {//keyCode=13是Enter鍵
        $('#btn').click();
      }
    });
  }
  //頁面載入時執行init()函式
 window.onload = init;
</script>
</head>
<body>
<p>輸入數值後按確定或者回車</p>
<p>
  <canvas id="canvas" width="700" height="400" style="border:2px solid #0026ff;" class="canvas"></canvas>
</p>
<div class="text">
  數值:<input type="text" id="val" class="val" placeholder="輸入數值後按回車">
  <div id="btn" class="btn">確定</div>
</div>
</body>
</html>

相關文章