canvas 画直线

731 阅读4分钟

为什么选择canvas

启因:
    为了实现绚丽多彩的页面,一般使用的是图片。
    当是图片体积大、加载速度慢,使用图片的代价就是降低了页面的性能。

什么是canvas?

 Canvas,又称“画布”,是HTML5的核心技术之一。HTML5中新增了一个Canvas元素,我们常说的Canvas技术,指的就是使用Canvas元素结合JavaScript来绘制各种图形的技术。

它可以做那些事?

  1. 绘制图形
  2. 绘制图表
  3. 绘制动画
  4. 制作游戏

为啥使用canvas 而不是svg?

HTML5有两个主要的2D图形技术,Canvas是使用JavaScript动态生成的,SVG是使用XML静态描述的。

优缺点:

canvas:

  1. 它是位图,放大缩小会失桢,适合像素处理和动态渲染
  2. 发生修改,会重汇

svg:

  1. 不适合像素处理和适合静态描述
  2. 放大缩小不会失桢
  3. 发生修改不会重汇

如何使用canvas

简单来说就是使用javascript操作canvas元素绘制图形
  • 第一步: 先canvas标签放入body中设置属性id,和宽高。
  • 第二步: js获取canvas元素
  • 第三步: 获取上下文环境对象context,使用属性方法绘制图形
  • 第四步: 开始绘制图形

简单事例:

绘制一条直线

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px dashed gray;"></canvas>
    <script>
        //1、获取canvas对象
        var cnv = document.getElementById("canvas");
        //2、获取上下文环境对象context
        var cxt = cnv.getContext("2d");
        //3、开始绘制图形
        cxt.moveTo(50, 100);
        cxt.lineTo(150, 50);
        cxt.stroke();
        }
    </script>
</body>
</html>
描述canvas

Canvas是一个行内块元素(即inline-block),我们一般需要指定其3个属性:id、width和height。width和height分别用于定义Canvas元素的宽度和高度。

通常我们不要在css选择器定义,会导致不能会获取正确的width和height。

Canvas坐标系

两个概念:
数学坐标系:y轴正方向向上。
W3C坐标系:y轴正方向向下。
canvas使用的是w3c坐标系

基本图形

直线图形
直线 距形 多边形

直线的绘制
方法:
moveTo(),lineTo(),stroke()
语法
cxt.moveTo(x1, y1);
cxt.lineTo(x2, y2);
cxt.stroke();
说明
cxt表示上下文环境对象context。
(x1,y1)表示直线“起点”的坐标。moveTo(x1,y1)的含义是“将画笔移到点(x1,y1)位置,然后开始绘图”。
(x2,y2)表示直线“终点”的坐标。lineTo(x2,y2)的含义是“使用画笔从起点(x1,y1)开始画直线,一直画到终点(x2,y2)”。
stroke()方法是动笔。
描述:
使用canvas画直线,跟我们平常用笔在纸张上画直线的道理一样,都是先确定直线起点(x1,y1)与终点(x2,y2),然后再用笔连线,即stroke()。

多条直线的绘画

语法
连续画线:先起点,再确定两个终点
cxt.moveTo(x1, y1);
cxt.lineTo(x2, y2);
cxt.lineTo(x3, y3);
cxt.stroke();
或者
两段直线:通过两个起点,两个终点。
cxt.moveTo(x1, y1);
cxt.lineTo(x2, y2);
cxt.moveTo(x3, y3);
cxt.lineTo(x4, y4);
cxt.stroke();

这样你可以画个三角形,距形,多边形

举例:用直线画一个三角形

<html>
<head>
<meta charset="utf-8" />
<title></title>
<script>
function $$(id){
return document.getElementById(id);
}
window.onload = function () {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
cxt.moveTo(50, 100);//起点
cxt.lineTo(150, 50); //起点到这是向上的直线
cxt.lineTo(150, 100);//竖线点
cxt.lineTo(50, 100);//横线的点
cxt.stroke();//绘画
}
</script>
</head>
<body>
<canvas id="canvas" width="200" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>
绘制统计图表的柱状图(距形)

划分

描边矩形填充矩形
配合使用moveTo()和lineTo()方法来画一个矩形。但是这种画矩形的方法代码量过多,因此在实际开发中并不推荐使用。 对于绘制矩形,Canvas另外为我们提供了独立的方法来实现。在Canvas中,矩形分为两种:描边矩形和填充矩形。

语法
cxt.strokeStyle = 属性值; 颜色值、渐变色和图案
cxt.strokeRect(x,y,width,height); 其中(x,y)为矩形左上角点的坐标,width距形的宽,height距形的高

598E4528-DA31-00A3-4900-214BAFEB4B5A.jpg

特别注意一点,strokeStyle属性必须在使用strokeRect()方法之前定义,否则strokeStyle属性无效。

填充矩形

语法
cxt.fillStyle=属性值;
cxt.fillRect(x, y, width, height);
解释:
fillStyle属性跟strokeStyle属性一样,取值也有3种:颜色值、渐变色和图案。
fillRect()方法跟strokeRect()方法一样,用于确定矩形的坐标

9D48FD36-C4A6-4413-5AEE-8E698BB6CACE.jpg

rect()方法

语法
rect(x,y,width,height);
说明
x和y为矩形左上角点的坐标,width表示矩形的宽度,height表示矩形的高度

描边距形
ctx.rect(x,y,width,height);
ctx.stroke()
填冲距形
rect(x,y,width,height);
ctx.fill()

<html>
<head>
<meta charset="utf-8" />
<title></title>
<script>
function $$(id){
return document.getElementById(id);
}
window.onload = function () {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
//绘制描边矩形
cxt.strokeStyle = "red";
cxt.rect(50, 50, 80, 80);
cxt.stroke();
//绘制填充矩形
cxt.fillStyle = "#FFE8E8";
cxt.rect(50, 50, 80, 80);
cxt.fill();
}
</script>
</head>
<body>
<canvas id="canvas" width="200" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>
清空矩形

在Canvas中,我们可以使用clearRect()方法来清空“指定矩形区域”。
语法
cxt.clearRect(x, y, width, height);
说明
在画板中绘画的图形想要清除指定距形区域

5D4BB204-53F9-339D-18DB-5245E3C7E91F.jpg