1.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
canvas {
border: 1px solid #000;
background-color: #1fff;
}
</style>
</head>
<body>
<div>
<div>部分浏览器不支持canvas 只需要在canvas标签内书写提示文字即可 <br> canvas只有三个属性 id width默认300 height默认150</div>
<canvas id="mycanvas" width="300" height="150">浏览器不支持cancas 请升级!</canvas>
</div>
<script>
// 部分浏览器不支持canvas 只需要在canvas标签内书写提示文字即可 canvas只有三个属性 id width默认300 height默认150
function draw() {
var canvas = document.getElementById("mycanvas")
if (canvas.getContext) {
var ctx = canvas.getContext('2d')
} else {
// canvas-unsupported code here
}
}
draw()
</script>
</body>
</html>
var canvas = document.getElementById("mycanvas")
if (!canvas.getContext) return;
var ctx = canvas.getContext('2d')
// 1.先设置颜色 在绘制图形 否则颜色失效
// 2.超出canvas的部分会被隐藏
// 3.下方的会覆盖上方的
ctx.fillStyle = "#FF0000"
ctx.fillRect(0, 0, 200, 300)
ctx.fillStyle = "#00FF00"
ctx.fillRect(100, 0, 200, 100)
3.绘制矩形的三种方法
var canvas = document.getElementById("mycanvas")
if (!canvas.getContext) return;
var ctx = canvas.getContext('2d')
// canvas 提供了三种方法绘制矩形:
// 1.fillRect(x, y, width, height) 绘制一个填充的矩形
// 2.strokeRect(x, y, width, height) 绘制一个矩形的边框
// 3.clearRect(x, y, widh, height) 清除指定的矩形区域,然后这块区域会变的完全透明。
ctx.fillStyle = "#FF0000"
ctx.fillRect(0, 0, 30, 50)
ctx.strokeRect(0, 60, 30, 40)
ctx.clearRect(10, 10, 10, 10)
// 几种渲染和画图的区别
cvsCtx.fillRect(10, 10, 100, 50); //直接填充出矩形
cvsCtx.strokeRect(10, 10, 100, 50); //直接画矩形边框
cvsCtx.rect(10, 10, 100, 50); //直接画矩形边框
cvsCtx.clearRect(20, 20, 20, 20) // 清空某块矩形区域
cvsCtx.fill(); // 只是填充--需要先画图
cvsCtx.stroke(); // 描边--需要先画图
4.路径划线
注意点:
1.beginPath() 新建一条路径, 路径一旦创建成功, 图形绘制命令被指向到路径上生成路径--必须
2.moveTo(x, y) 把画笔移动到指定的坐标(x, y)。 相当于设置路径的起始点坐标。---必须
3.closePath() 创建从当前点回到起始点的路径 相当于将当前点终点1回到起始点0进行连接闭合 下次再划出的线只会从起点0到终点2 而不是从终点1画到终点2
4.stroke() 通过线条来绘制图形轮廓----划线描边---不会自动closePath()----必须要有--否则不会有描出的线
5.fill() 通过填充路径的内容区域生成实心的图形---填充闭合区域。如果closePath路径未关闭,那么 fill() 方法会从路径结束点到最初的开始点moveTo之间添加一条线,以关闭该路径,然后填充该路径。
划线1.
var canvas = document.getElementById("mycanvas")
if (!canvas.getContext) return;
var cvsCtx = canvas.getContext('2d')
cvsCtx.beginPath();
cvsCtx.moveTo(10, 50);
cvsCtx.lineTo(100, 100);
cvsCtx.closePath();
cvsCtx.lineTo(200,100)
cvsCtx.stroke();
划线2.
var canvas = document.getElementById("mycanvas")
if (!canvas.getContext) return;
var cvsCtx = canvas.getContext('2d')
cvsCtx.beginPath();
cvsCtx.moveTo(10, 50);
cvsCtx.lineTo(100, 100);
// cvsCtx.closePath();
cvsCtx.lineTo(200,100)
cvsCtx.stroke();
划线3
var canvas = document.getElementById("mycanvas")
if (!canvas.getContext) return;
var cvsCtx = canvas.getContext('2d')
cvsCtx.beginPath();
cvsCtx.moveTo(10, 50);
cvsCtx.lineTo(100, 100);
cvsCtx.lineTo(200,100)
cvsCtx.closePath();
cvsCtx.stroke();
5.画弧线
方法1:
cvsCtx.arc(x, y, r, sAngle, eAngle, false);
x,y原点 r半径 开始和技术的角度Math.PI就是圆周率 2* Math.PI为圆 画图方向默认顺时针false
var canvas = document.getElementById("mycanvas")
if (!canvas.getContext) return;
var cvsCtx = canvas.getContext('2d')
cvsCtx.beginPath();
cvsCtx.arc(50, 50, 40, 0, 1.5 * Math.PI, false);
// cvsCtx.closePath();
cvsCtx.stroke()
// cvsCtx.fillStyle = "#00ff00";
// cvsCtx.fill()
cvsCtx.beginPath();
cvsCtx.arc(150, 50, 40, 0, 1.5 * Math.PI, false);
cvsCtx.closePath();
cvsCtx.stroke()
cvsCtx.fillStyle = "#00ff00";
cvsCtx.fill()
cvsCtx.arcTo(x1, y1, x2, y2, radius);
弧线点1 弧线点2 半径r 就是两点的切线画弧度
cvsCtx.beginPath();
cvsCtx.moveTo(20, 20); // 创建开始点
cvsCtx.lineTo(100, 20); // 创建水平线
cvsCtx.arcTo(150, 20, 150, 70, 50); // 创建弧
cvsCtx.lineTo(150, 120); // 创建垂直线
cvsCtx.stroke(); // 进行绘制
6.二次贝塞尔曲线和三次贝塞尔曲线
var canvas = document.getElementById("mycanvas")
if (!canvas.getContext) return;
var cvsCtx = canvas.getContext('2d')
cvsCtx.fillRect(40, 40, 2, 2)
cvsCtx.fillRect(240, 40, 2, 2)
cvsCtx.fillRect(80, 140, 2, 2)
// cvsCtx.quadraticCurveTo(cpx, cpy, x, y); cpx, cpy是控制点 x, y是结束点
cvsCtx.beginPath();
cvsCtx.moveTo(40, 40); //起始点
cvsCtx.quadraticCurveTo(80, 140, 240, 40);
cvsCtx.strokeStyle = "#0000ff";
cvsCtx.stroke();
var canvas = document.getElementById("mycanvas")
if (!canvas.getContext) return;
var cvsCtx = canvas.getContext('2d')
cvsCtx.beginPath();
cvsCtx.moveTo(40, 200); //起始点
var cp1x = 20,
cp1y = 100; //控制点1
var cp2x = 100,
cp2y = 120; //控制点2
var x = 200,
y = 200; // 结束点
//绘制二次贝塞尔曲线
cvsCtx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
cvsCtx.stroke();
cvsCtx.beginPath();
cvsCtx.rect(40, 200, 10, 10);
cvsCtx.rect(cp1x, cp1y, 10, 10);
cvsCtx.rect(cp2x, cp2y, 10, 10);
cvsCtx.rect(x, y, 10, 10);
cvsCtx.fill();
7.样式和颜色
var canvas = document.getElementById("mycanvas")
if (!canvas.getContext) return;
var cvsCtx = canvas.getContext('2d')
// cvsCtx.fillStyle = "#00cc00"; //填充色
// cvsCtx.strokeStyle = "##00dd00";//描边色
for (let x = 0; x < 12; x++) {
for (let y = 0; y < 12; y++) {
console.log(x, y);
cvsCtx.fillStyle = 'rgba(' + Math.floor(255 - x * 21.25) + ',' + Math.floor(255 - y * 21.25) + ',' + 255 +
',' +
'1)';
cvsCtx.fillRect(x * 25, y * 25, 25, 25);
}
}
<script type="text/javascript">
function draw() {
var canvas = document.getElementById('mycanvas');
if (!canvas.getContext) return;
var ctx = canvas.getContext("2d");
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.strokeStyle = `rgb(${randomInt(0, 255)},${randomInt(0, 255)},${randomInt(0, 255)})`;
ctx.strokeRect(j * 50, i * 50, 40, 40);
}
}
}
draw();
/**
作者:李振超 4 Jun 2017 12:12
返回随机的 [from, to] 之间的整数(包括from,也包括to)
*/
function randomInt(from, to) {
return parseInt(Math.random() * (to - from + 1) + from);
}
</script>
8.透明度
var canvas = document.getElementById('mycanvas');
if (!canvas.getContext) return;
var cvsCxt = canvas.getContext("2d");
cvsCxt.fillStyle = "rgba(1,255,255)";
cvsCxt.fillRect(20, 20, 75, 50);
// 调节透明度--设置后会影响到下方的透明度--所以可以一个一设或者设置一个后 在重置掉
// 最好的办法是使用rgba()设置透明度
cvsCxt.globalAlpha = 0.2;
cvsCxt.fillStyle = "#00ff00";
cvsCxt.fillRect(50, 50, 75, 50);
cvsCxt.globalAlpha = 0.8;
cvsCxt.fillStyle = "red";
cvsCxt.fillRect(80, 80, 75, 50);
9.线段样式
1.线段宽度
var canvas = document.getElementById('mycanvas');
if (!canvas.getContext) return;
var cvsCtx = canvas.getContext("2d");
cvsCtx.beginPath();
cvsCtx.moveTo(10, 10);
cvsCtx.lineTo(100, 10);
cvsCtx.strokeStyle = "#ff0000";
cvsCtx.stroke();
cvsCtx.beginPath();
cvsCtx.moveTo(20, 20);
cvsCtx.lineTo(200, 20);
cvsCtx.lineWidth = 5; // lineWidth = num 默认是1 会影响后面的线条宽度
cvsCtx.strokeStyle = "#00ff00";
cvsCtx.stroke();
var canvas = document.getElementById('mycanvas');
if (!canvas.getContext) return;
var cvsCtx = canvas.getContext("2d");
var lineCaps = ["butt", "round", "square"];
// cvsCtx.lineCap = "" 线段末端以方形、圆形、多一块方形结束
for (var i = 0; i < 3; i++) {
cvsCtx.beginPath();
cvsCtx.moveTo(20 + 30 * i, 30);
cvsCtx.lineTo(20 + 30 * i, 100);
cvsCtx.lineWidth = 20;
cvsCtx.lineCap = lineCaps[i];
cvsCtx.stroke();
}
cvsCtx.beginPath();
cvsCtx.moveTo(0, 30);
cvsCtx.lineTo(300, 30);
cvsCtx.moveTo(0, 100);
cvsCtx.lineTo(300, 100)
cvsCtx.strokeStyle = "red";
cvsCtx.lineWidth = 1;
cvsCtx.stroke();
var canvas = document.getElementById('mycanvas');
if (!canvas.getContext) return;
var cvsCtx = canvas.getContext("2d");
var lineJoin = ['round', 'bevel', 'miter']; //cvsCtx.lineJoin = 线段连接处以圆形、矩形、菱角相连接
cvsCtx.lineWidth = 20;
for (var i = 0; i < lineJoin.length; i++) {
cvsCtx.lineJoin = lineJoin[i];
cvsCtx.beginPath();
cvsCtx.moveTo(50, 50 + i * 50);
cvsCtx.lineTo(100, 100 + i * 50);
cvsCtx.lineTo(150, 50 + i * 50);
cvsCtx.lineTo(200, 100 + i * 50);
cvsCtx.lineTo(250, 50 + i * 50);
cvsCtx.stroke();
}
var canvas = document.getElementById('mycanvas');
if (!canvas.getContext) return;
var cvsCtx = canvas.getContext("2d");
cvsCtx.setLineDash([20, 2]); // [实线长度, 每个间隙长度]
cvsCtx.lineDashOffset = -10; //属性设置起始偏移量
cvsCtx.strokeRect(20, 20, 200, 100);