canvas 画布对象
1.画一条折线
<body>
<canvas id="canvas" width="500" height="500">
//canvas 默认大小300*150 可以指定画布大小
//css里面设置style width不能改变画布大小
</canvas>
<script type="text/javascript">
var cav = document.getElementById("canvas");
var cxt = cav.getContext("2d"); //2D图像
cxt.moveTo(10,10); //起点
cxt.lineTo(500,500); //画到某点
cxt.lineTo(100,500);
//线条颜色(画之前设置颜色才有效)
cxt.strokeStyle="coral";
cxt.stroke(); //开始画
</script>
</body>
2.实心长方形
<body>
<canvas id="canvas" width="500" height="500">
//canvas 默认大小300*150 可以指定画布大小
//css里面设置style width不能改变画布大小
</canvas>
<script type="text/javascript">
var cav = document.getElementById("canvas");
var cxt = cav.getContext("2d"); //2D图像
//实心长方形
cxt.fillStyle="cadetblue"
cxt.fillRect(0,0,100,150); //起点,大小
</script>
</body>
3.实心圆
<body>
<canvas id="canvas" width="500" height="500">
//canvas 默认大小300*150 可以指定画布大小
//css里面设置style width不能改变画布大小
</canvas>
<script type="text/javascript">
var cav = document.getElementById("canvas");
var cxt = cav.getContext("2d"); //2D图像
//实心圆
cxt.beginPath();
cxt.fillStyle="red"
cxt.moveTo(100,100); //起点
//cxt.arc(x,y,r,起点弧度 ,终点弧度[角度]);
cxt.arc(100,100,100,0,90*Math.PI/180);
cxt.fill();
</script>
</body>
3.空心扇形
<body>
<canvas id="canvas" width="500" height="500">
//canvas 默认大小300*150 可以指定画布大小
//css里面设置style width不能改变画布大小
</canvas>
<script type="text/javascript">
var cav = document.getElementById("canvas");
var cxt = cav.getContext("2d"); //2D图像
//空心扇形
cxt.beginPath();
cxt.strokeStyle="red"
cxt.moveTo(100,100); //起点
//cxt.arc(x,y,r,起点弧度 ,终点弧度[角度]);
cxt.arc(100,100,100,0,90*Math.PI/180);
cxt.closePath(); //闭合closePath
cxt.stroke(); //画图
</script>
</body>
4.空心圆
<body>
<canvas id="canvas" width="500" height="500">
//canvas 默认大小300*150 可以指定画布大小
//css里面设置style width不能改变画布大小
</canvas>
<script type="text/javascript">
var cav = document.getElementById("canvas");
var cxt = cav.getContext("2d"); //2D图像
//空心圆
cxt.beginPath();
cxt.strokeStyle="red"
//cxt.arc(x,y,r,起点弧度 ,终点弧度[角度]);
cxt.arc(100,100,60,0,360*Math.PI/180);
cxt.closePath();
cxt.stroke(); //画图
</script>
</body>
5.组合 空心圆+实心圆
<body>
<canvas id="canvas" width="500" height="500">
//canvas 默认大小300*150 可以指定画布大小
//css里面设置style width不能改变画布大小
</canvas>
<script type="text/javascript">
var cav = document.getElementById("canvas");
var cxt = cav.getContext("2d"); //2D图像
cxt.beginPath();
//实心圆
cxt.arc(100,100,50,0,360*Math.PI/180);
cxt.fillStyle="red"
cxt.fill();
cxt.strokeStyle="blue"
cxt.lineWidth=5 //线宽
cxt.stroke(); //画图
cxt.closePath();
</script>
</body>
例子:动态柱状图
<body>
<canvas id="canvas" width="650" height="600">
//canvas 默认大小300*150 可以指定画布大小
//css里面设置style width不能改变画布大小
</canvas>
<script type="text/javascript">
var cav = document.getElementById("canvas");
var cvsCtx = cav.getContext("2d"); //2D图像
var xItemName = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
var data = [80, 160, 185, 156, 266, 168, 106];
//调用绘图
var option = {
xList : xItemName,
data : data
};
createImage(option)
//绘图方法
function createImage(obj) {
let xList = obj.xList;
let data = obj.data;
let itemSp = 80; //坐标间隔
cvsCtx.moveTo(30, 10); //y轴小箭头(实心)
cvsCtx.lineTo(34, 6);
cvsCtx.lineTo(38, 10);
cvsCtx.moveTo(34, 6); //y轴竖线
cvsCtx.lineTo(34, 300);
cvsCtx.moveTo(6, 290); //x轴横线
cvsCtx.lineTo(600, 290);
cvsCtx.moveTo(596, 286); //x轴小箭头
cvsCtx.lineTo(600, 290);
cvsCtx.lineTo(596, 294);
cvsCtx.fillStyle = "red"; //柱状图颜色
let imageX = 60; //柱图x轴坐标
for (let i = 0; i < data.length; i++) {
const element = data[i];
//run(数值, x坐标, cvsCtx)
run(element, imageX, cvsCtx); //动态图
imageX += itemSp;
}
// cvsCtx.fillRect(140, 290, 50, -120);
// cvsCtx.fillRect(220, 290, 50, -120);
// cvsCtx.fillRect(300, 290, 50, -140);
// cvsCtx.fillRect(380, 290, 50, -130);
// cvsCtx.fillRect(460, 290, 50, -160);
// cvsCtx.fillRect(540, 290, 50, -180);
//y轴文字
cvsCtx.font = '16px normal 微软雅黑';
cvsCtx.fillStyle = "#000";
//cvsCtx.fillText('text', x, y);
cvsCtx.fillText('y轴', 0, 16);
//x轴文字
let itemTextX = 70; //文字x轴坐标
for (let i = 0; i < xList.length; i++) {
const element = xList[i];
cvsCtx.fillText(element, itemTextX, 310);
itemTextX += itemSp;
}
// cvsCtx.fillText('周一', 70, 310);
// cvsCtx.fillText('周二', 150, 310);
// cvsCtx.fillText('周三', 230, 310);
// cvsCtx.fillText('周四', 310, 310);
// cvsCtx.fillText('周五', 390, 310);
// cvsCtx.fillText('周六', 470, 310);
// cvsCtx.fillText('周日', 550, 310);
//每一个柱状图上的数字
let imageTextX = 70;
for (let i = 0; i < data.length; i++) {
const element = data[i];
cvsCtx.fillText(element, imageTextX, 300 - element - 20);
imageTextX += itemSp;
}
// cvsCtx.fillText('170', 70, 300 - 190);
// cvsCtx.fillText('120', 150, 300 - 140);
// cvsCtx.fillText('120', 230, 300 - 140);
// cvsCtx.fillText('140', 310, 300 - 160);
// cvsCtx.fillText('130', 390, 300 - 150);
// cvsCtx.fillText('160', 470, 300 - 180);
// cvsCtx.fillText('180', 550, 300 - 200);
cvsCtx.stroke();
}
//动态效果
function run(element, imageX, cvsCtx) {
let x = 0;
var time = setInterval(() => {
if (x > -element) {
cvsCtx.fillStyle = "red";
cvsCtx.clearRect(imageX, 290, 50, -element);
cvsCtx.fillRect(imageX, 290, 50, x);
x -= 3;
} else {
clearInterval(time); //关闭函数
}
}, 4);
}
</script>
</body>