)
前言
身为一个前端开发人员,肯定都是想开发出炫酷的应用程序,可以有很多动画特效,例如黑客帝国的数字,彩色炫酷的粒子动效,也可以实现各种面板,让页面特别秀!接下来这篇文章就是让大家了解和使用canvas在项目中开发和应用。
因为是工作之余才有时间写文章,更新可能都在晚上,觉得有用的可以先收藏,我会按时更新,学习成长的路上本就孤单,在之后的路上也希望大家多多支持和陪伴,我会尽我所能产出一些对大家有益的文章
canvas文档
前端使用Canvas绘图文章代码仓库地址
Canvas 教程
Context2D属性文档
一、canvas代码提示(插件和注释)
canvas的代码提示可以使用vscode的插件去进行提示i,也可以使用注释的方式,个人推荐使用插件,因为插件安装后即可使用,使用注释方式每次都需要添加注释代码再去提示,插件相对来说更友好一点。
1.1、使用插件方式(推荐这种方式) =>canvas-snippets
安装完成后,这样就有canvas的代码提示了
1.2、使用注释方式
//在js代码中添加洗面粉注释即可自动补全canvas 代码
/** @type {HTMLCanvasElement} */
二、初始canvas
2.1、什么是canvas
- canvas中文名叫 “画布”,是 HTML5 新增的一个标签
- canvas拥有多种绘制路径、矩形、圆形、字符以及图片的方法。
- Canvas 在某些情况下可以 “代替” 图片。
- Canvas 可用于动画、游戏、数据可视化、图片编辑器、实时视频处理等领域。
- Canvas 允许开发者通过 JS在这个标签上绘制各种图案。
2.2、 canvas 标签
提供了绘制2D 的图形接口和上下文。
参数:
- id:标识元素的唯一性
- width:画布的宽度
- height:画布的高度
代码
<!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>
</head>
<body>
<!--
参数:
id:标识元素的唯一性
width:画布的宽度
height:画布的高度
-->
<canvas id="canvas1" width="1920px" height="400px">
<!-- 画布 -->
</canvas>
<script>
// 1.获取画布
let canvas1=document.getElementById('canvas1')
// 2.获取画笔,上下文对象,用于画画用
let ctx=canvas1.getContext('2d')
// 3.绘制图形
// 绘制一个矩形 fillRect(位置x,位置y,宽、高)
ctx.fillRect(100,100,300,300);
</script>
</body>
</html>
效果:
三、canvas上下文对象与游览器支持
3.1、 canvas上下文对象getContext
console.log(document.body)
console.log(document.body.getContext)
console.log(canvas1.getContext)
3.2、画笔对象getContext
// 1.获取画布
let canvas1=document.getElementById('canvas1')
let ctx=canvas1.getContext('2d')
console.log(ctx)
3.3、canvas游览器支持
通过获取getContext上下文对象可以判断当前游览器是否支持canvas,如果不支持可以打印输出出来,我们canvas也就成了普通标签,canvas包裹的内容就会显示在页面上
<!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>
</head>
<body>
<!--
参数:
id:标识元素的唯一性
width:画布的宽度
height:画布的高度
-->
<canvas id="canvas1" width="1920px" height="400px">
当前游览器不支持canvas。请下载最新的游览器
<a href="https://www.google.com/intl/zh-CN/chrome/">立即下载新版谷歌游览器</a>
</canvas>
<script>
// 1.获取画布
let canvas1=document.getElementById('canvas1')
// 判断是否有getContext
if(!canvas1.getContext){
console.log('当前游览器不支持canvas。请下载最新的游览器')
}
// 2.获取画笔,上下文对象,用于画画用
let ctx=canvas1.getContext('2d')
// 3.绘制图形
// 绘制一个矩形 fillRect(位置x,位置y,宽、高)
ctx.fillRect(100,100,300,300);
</script>
</body>
</html>
四、canvas绘制基本图形
我们在绘制矩形时,设置了坐标和大小,有了坐标我们就能在画布的的那个位置绘制什么样式的图形,接下来我们可以深入了解如何在 canvas 上绘制。学会如何绘制矩形,三角形,直线,圆弧和曲线,变得熟悉这些基本的形状。绘制物体到 Canvas 前,需掌握路径,我们看看到底怎么做
4.1、canvas矩形绘制
4.1.1、canvas矩形绘制(填充模式)
填充模式也就是我们上面实现的那种
使用fillRect进行填充
fillRect属性:
// 绘制一个矩形 fillRect(位置x,位置y,宽、高)
ctx.fillRect(100,100,300,300);
// fillRect拆开写法
ctx.rect(00,100,300,300)
ctx.fill()
完整代码:
<!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>
</head>
<body>
<canvas id="canvas1" width="1920px" height="400px">
<a href="https://www.google.com/intl/zh-CN/chrome/">立即下载新版谷歌游览器</a>
</canvas>
<script>
// 1.获取画布
let canvas1=document.getElementById('canvas1')
// 判断是否有getContext
if(!canvas1.getContext){
console.log('当前游览器不支持canvas。请下载最新的游览器')
}
// 2.获取画笔,上下文对象,用于画画用
let ctx=canvas1.getContext('2d')
// 3.绘制图形
// 绘制一个矩形 fillRect(位置x,位置y,宽、高)
ctx.fillRect(100,100,300,300);
// fillRect拆开写法
// ctx.rect(00,100,300,300)
// ctx.fill()
</script>
</body>
</html>
效果:
4.1.2、canvas矩形绘制(路径模式)
使用strokeRect进行路径绘制
strokeRect属性:
// ctx.strokeRect(位置x,位置y,宽、高)
ctx.strokeRect(100, 100, 400, 200);
// strokeRect拆开写法
ctx.rect(100, 100, 400, 200)
ctx.stroke()
完整代码:
<!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>
</head>
<body>
<canvas id="canvas1" width="1920px" height="400px">
当前游览器不支持canvas。请下载最新的游览器
<a href="https://www.google.com/intl/zh-CN/chrome/">立即下载新版谷歌游览器</a>
</canvas>
<script>
// 1.获取画布
let canvas1=document.getElementById('canvas1')
// 判断是否有getContext
if(!canvas1.getContext){
console.log('当前游览器不支持canvas。请下载最新的游览器')
}
// 2.获取画笔,上下文对象,用于画画用
let ctx=canvas1.getContext('2d')
// 3.绘制图形
// 路径绘制矩形
// ctx.strokeRect(位置x,位置y,宽、高)
ctx.strokeRect(100, 100, 400, 200);
</script>
</body>
</html>
效果:
4.1.3、canvas矩形绘制(清除模式)
绘制并清除矩形:
// 清除方式绘制矩形
// beginPath和closePath可以完成路径的分段
ctx.beginPath();
// rect绘制路径
ctx.rect(100, 100, 200, 100);
// stroke显示路径
ctx.stroke();
// 画笔结束
ctx.closePath();
// 画笔开始
ctx.beginPath();
ctx.rect(200, 150, 200, 100);
// fill填充
ctx.fill();
// 画笔结束
ctx.closePath();
完整代码:
<!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>
</head>
<body>
<canvas id="canvas1" width="1920px" height="400px">
当前游览器不支持canvas。请下载最新的游览器
<a href="https://www.google.com/intl/zh-CN/chrome/">立即下载新版谷歌游览器</a>
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 判断是否有getContext
if (!canvas1.getContext) {
console.log("当前游览器不支持canvas。请下载最新的游览器");
}
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 3.绘制图形
// 清除方式绘制矩形
// beginPath和closePath可以完成路径的分段
ctx.beginPath();
// rect绘制路径
ctx.rect(100, 100, 200, 100);
// stroke显示路径
ctx.stroke();
// 画笔结束
ctx.closePath();
// 画笔开始
ctx.beginPath();
ctx.rect(200, 150, 200, 100);
// fill填充
ctx.fill();
// 画笔结束
ctx.closePath();
let height = 0;
// 把矩形部分清除
let t1 = setInterval(() => {
height++;
ctx.clearRect(0, 0, canvas1.clientWidth, height);
if (height > canvas1.clientHeight) {
clearInterval(t1);
}
}, 10);
</script>
</body>
</html>
效果:
4.2、canvas绘制圆弧与笑脸
绘制圆弧或者圆,我们使用arc0方法。当然可以使用arcTo0,不过这个的实现并不是那么的可靠,所以我们这里不作介绍。
4.2.1、绘制圆形
使用strokeRect进行绘制
arc属性:
// ctx.arc(圆心x坐标,圆心y坐标,半径,开始角度,结束角度,顺/逆时针,第六个参数(可选的)设置true则是逆时针)
//ctx.context.arc(x, y, radius, Math.PI / 180 * startAngle, Math.PI / 180 * endAngle, anticlockwise);
ctx.strokeRect(100, 100, 400, 200);
// strokeRect拆开写法
ctx.arc(300, 200, 100,0,Math.PI*2);
// fill填充
ctx.fill();
完整代码:
<!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>
</head>
<body>
<canvas id="canvas1" width="1920px" height="400px">
当前游览器不支持canvas。请下载最新的游览器
<a href="https://www.google.com/intl/zh-CN/chrome/">立即下载新版谷歌游览器</a>
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 判断是否有getContext
if (!canvas1.getContext) {
console.log("当前游览器不支持canvas。请下载最新的游览器");
}
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 3.绘制圆形
// arc绘制圆弧的方法
// ctx.arc(圆心x坐标,圆心y坐标,半径,开始角度,结束角度,顺/逆时针)
ctx.arc(300, 200, 100,0,Math.PI*2);
// fill填充
ctx.fill();
</script>
</body>
</html>
效果
4.2.2、绘制半圆
// arc绘制圆弧的方法
// ctx.arc(圆心x坐标,圆心y坐标,半径,开始角度,结束角度,顺/逆时针)
ctx.arc(300, 200, 100,0,Math.PI);
// fill填充
ctx.fill();
效果
4.2.3、绘制笑脸(方法一)
繁琐版代码
<!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>
</head>
<body>
<canvas id="canvas1" width="1920px" height="400px">
当前游览器不支持canvas。请下载最新的游览器
<a href="https://www.google.com/intl/zh-CN/chrome/">立即下载新版谷歌游览器</a>
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 判断是否有getContext
if (!canvas1.getContext) {
console.log("当前游览器不支持canvas。请下载最新的游览器");
}
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 3.绘制笑脸
// 绘制脸部
ctx.beginPath();
ctx.arc(75,75,50,0,Math.PI*2);
ctx.stroke();
ctx.closePath();
// 绘制嘴巴
ctx.beginPath();
ctx.arc(75, 75, 35, 0 , Math.PI );
ctx.stroke();
ctx.closePath();
// 绘制眼睛(左)
ctx.beginPath();
ctx.arc(60,65,5,0,Math.PI*2)
ctx.stroke();
ctx.closePath();
// 绘制眼睛(右)
ctx.beginPath();
ctx.arc(90,65,5,0,Math.PI*2)
ctx.stroke();
ctx.closePath();
// stroke路径
ctx.stroke();
</script>
</body>
</html>
效果
4.2.3、绘制笑脸(方法二)
使用move.To移动点绘制笑脸
moveTo可以用来绘制一条不连续的路径
完整代码
<!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>
</head>
<body>
<canvas id="canvas1" width="1920px" height="400px">
当前游览器不支持canvas。请下载最新的游览器
<a href="https://www.google.com/intl/zh-CN/chrome/">立即下载新版谷歌游览器</a>
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 判断是否有getContext
if (!canvas1.getContext) {
console.log("当前游览器不支持canvas。请下载最新的游览器");
}
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 3.绘制笑脸
// 绘制脸部
ctx.arc(75,75,50,0,Math.PI*2);
// moveTo可以用来绘制一条不连续的路径
ctx.moveTo(110, 75);
// 绘制嘴巴
ctx.arc(75, 75, 35, 0 , Math.PI );
ctx.moveTo(65, 65);
// 绘制眼睛(左)
ctx.arc(60,65,5,0,Math.PI*2)
ctx.moveTo(90, 65);
// 绘制眼睛(右)
ctx.arc(90,65,5,0,Math.PI*2)
// stroke路径
ctx.stroke();
</script>
</body>
</html>
效果
4.3、canvas绘制折线线段
4.3.1、绘制线段
绘制直线,需要用到的方法lineTo。开始点也可以通过moveTo0函数改变。
完整代码
<!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>
</head>
<body>
<canvas id="canvas1" width="1920px" height="400px">
当前游览器不支持canvas。请下载最新的游览器
<a href="https://www.google.com/intl/zh-CN/chrome/">立即下载新版谷歌游览器</a>
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 判断是否有getContext
if (!canvas1.getContext) {
console.log("当前游览器不支持canvas。请下载最新的游览器");
}
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 3.绘制线段
ctx.beginPath();
ctx.moveTo(300 ,300);
ctx.lineTo(350, 350);
ctx.stroke();
ctx.closePath();
</script>
</body>
</html>
效果
4.3.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>
</head>
<body>
<canvas id="canvas1" width="1920px" height="400px">
当前游览器不支持canvas。请下载最新的游览器
<a href="https://www.google.com/intl/zh-CN/chrome/">立即下载新版谷歌游览器</a>
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 判断是否有getContext
if (!canvas1.getContext) {
console.log("当前游览器不支持canvas。请下载最新的游览器");
}
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 3.绘制三角形
// 路经版
ctx.beginPath();
ctx.moveTo(300 ,200);
ctx.lineTo(350, 250);
ctx.lineTo(350,200)
ctx.lineTo(300,200)
ctx.stroke();
ctx.closePath();
// 填充版
ctx.beginPath();
ctx.moveTo(200 ,100);
ctx.lineTo(250, 150);
ctx.lineTo(250,100)
ctx.lineTo(200,100)
ctx.fill();
ctx.closePath();
</script>
</body>
</html>
效果
4.4、arcTo方法绘制圆弧方式
完整代码
<!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>
</head>
<body>
<canvas id="canvas1" width="1920px" height="400px">
当前游览器不支持canvas。请下载最新的游览器
<a href="https://www.google.com/intl/zh-CN/chrome/">立即下载新版谷歌游览器</a>
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 判断是否有getContext
if (!canvas1.getContext) {
console.log("当前游览器不支持canvas。请下载最新的游览器");
}
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 3.绘制圆弧
ctx.beginPath();
// 设置第一个点
ctx.moveTo(300, 200);
//设置第二个点和第三个点,以及圆弧半径
ctx.arcTo(300, 250, 250, 250, 50);
ctx.stroke();
ctx.closePath();
</script>
</body>
</html>
效果
4.5、二次贝塞尔曲线实现聊天气泡框
一个十分有用的路径类型就是贝塞尔曲线。二次及三次贝塞尔曲线都十分有用,一般用来绘制复杂有规律的图形。
完整代码
<!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>
</head>
<body>
<canvas id="canvas1" width="1920px" height="400px">
当前游览器不支持canvas。请下载最新的游览器
<a href="https://www.google.com/intl/zh-CN/chrome/">立即下载新版谷歌游览器</a>
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 判断是否有getContext
if (!canvas1.getContext) {
console.log("当前游览器不支持canvas。请下载最新的游览器");
}
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 3.绘制贝塞尔曲线
ctx.beginPath();
ctx.moveTo(200, 300);
ctx.quadraticCurveTo(150, 300, 150, 200);
ctx.quadraticCurveTo(150, 100, 300, 100);
ctx.quadraticCurveTo(450, 100, 450, 200);
ctx.quadraticCurveTo(450, 300, 250, 300);
ctx.quadraticCurveTo(250, 350, 150, 350);
ctx.quadraticCurveTo(200, 350, 200, 300);
ctx.stroke();
btx.closePath();
</script>
</body>
</html>
效果
4.6、三次贝塞尔曲线实现献给女朋友的爱心
贝塞尔曲线应用于二维图形应用程序的数学曲线。 一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。
完整代码
<!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>
</head>
<body>
<canvas id="canvas1" width="1920px" height="400px">
当前游览器不支持canvas。请下载最新的游览器
<a href="https://www.google.com/intl/zh-CN/chrome/">立即下载新版谷歌游览器</a>
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 判断是否有getContext
if (!canvas1.getContext) {
console.log("当前游览器不支持canvas。请下载最新的游览器");
}
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 3.绘制贝塞尔曲线实现爱心
ctx.beginPath();
// 移动到起点
ctx.moveTo(300,200)
// 2个控制点一个终点(右半心)
ctx.bezierCurveTo(350, 150,450, 200, 300, 300);
// 左边心
ctx.bezierCurveTo(150, 200,250, 150, 300, 200);
ctx.fillStyle = 'rgb(234, 67, 111)';
ctx.fill();
btx.closePath();
</script>
</body>
</html>
效果
4.8、封装路径path2d
完整代码
<!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>
</head>
<body>
<canvas id="canvas1" width="1920px" height="400px">
当前游览器不支持canvas。请下载最新的游览器
<a href="https://www.google.com/intl/zh-CN/chrome/">立即下载新版谷歌游览器</a>
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 判断是否有getContext
if (!canvas1.getContext) {
console.log("当前游览器不支持canvas。请下载最新的游览器");
}
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 封装爱心路径
var heatPath=new Path2D()
// ctx.beginPath();
// 移动到起点
heatPath.moveTo(300,200)
// 2个控制点一个终点(右半心)
heatPath.bezierCurveTo(350, 150,450, 200, 300, 300);
// 左边心
heatPath.bezierCurveTo(150, 200,250, 150, 300, 200);
ctx.fillStyle = 'rgb(234, 67, 111)';
ctx.fill(heatPath);
// ctx.closePath(heatPath);
// 封装聊天框路径
var chatPath=new Path2D()
chatPath.moveTo(200, 300);
chatPath.quadraticCurveTo(150, 300, 150, 200);
chatPath.quadraticCurveTo(150, 100, 300, 100);
chatPath.quadraticCurveTo(450, 100, 450, 200);
chatPath.quadraticCurveTo(450, 300, 250, 300);
chatPath.quadraticCurveTo(250, 350, 150, 350);
chatPath.quadraticCurveTo(200, 350, 200, 300);
ctx.stroke(chatPath);
// 创建折线
// M 起点10 10 h水平移动80 垂直移动v80 垂直移动-80 z回原点
var polyline=new Path2D("M 10 10 h 80 v 80 h -80 z")
ctx.stroke(polyline)
</script>
</body>
</html>
效果
五、canvas样式
5.1、样式和颜色控制
在绘制图形的竟节里,我只用到默认的线条和填充样式。接下来,我们将会探讨 anvas 全部的可选项,来绘制出更加吸引人的内容。
strokeStyle轮廓样式和fillStyle填充样式和globalAlpha设置全局透明度
// globalAlpha设置全局透明度,一般不这样使用
// ctx.globalAlpha = 0.5;
// strokeStyle轮廓样式 支持单词、rgb、rgba、十六进制 ctx.strokeStyle='blue';
ctx.stroke(heatPath)
// fillStyle填充样式 支持单词、rgb、rgba、十六进制
ctx.fillStyle = 'rgb(234, 67, 111)';
ctx.fill(heatPath);
完整代码
<!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>
</head>
<body>
<canvas id="canvas1" width="1920px" height="400px">
当前游览器不支持canvas。请下载最新的游览器
<a href="https://www.google.com/intl/zh-CN/chrome/">立即下载新版谷歌游览器</a>
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 判断是否有getContext
if (!canvas1.getContext) {
console.log("当前游览器不支持canvas。请下载最新的游览器");
}
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// globalAlpha设置全局透明度,一般不这样使用
// ctx.globalAlpha = 0.5;
// 封装爱心路径
var heatPath = new Path2D()
// ctx.beginPath();
// 移动到起点
heatPath.moveTo(300, 200)
// 2个控制点一个终点(右半心)
heatPath.bezierCurveTo(350, 150, 450, 200, 300, 300);
// 左边心
heatPath.bezierCurveTo(150, 200, 250, 150, 300, 200);
// strokeStyle轮廓样式 支持单词、rgb、rgba、十六进制
ctx.strokeStyle = 'blue';
ctx.stroke(heatPath)
// fillStyle填充样式 支持单词、rgb、rgba、十六进制
ctx.fillStyle = 'rgba(255, 200,200,0.3)';
ctx.fill(heatPath);
</script>
</body>
</html>
效果
strokeStyle轮廓样式
fillStyle填充样式
globalAlpha设置全局透明度
5.2、线性渐变和径向渐变
线性渐变
常用方法
// 创建线性渐变 createLinearGradient(起点x,起点y,终点x,终点y)
let lineGradient = ctx.createLinearGradient(0, 0, 600, 400);
// addColorStop(number, 'color') 从0开始过程中颜色设置从红到粉色
lineGradient.addColorStop(0, "red");
lineGradient.addColorStop(1, "pink");
完整代码
<!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>
</head>
<body>
<!--
参数:
id:标识元素的唯一性
width:画布的宽度
height:画布的高度
-->
<canvas id="canvas1" width="1920px" height="400px">
<!-- 画布 -->
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 3.线性渐变和径向渐变
// 绘制一个矩形 fillRect(位置x,位置y,宽、高)
// 创建线性渐变 createLinearGradient(起点x,起点y,终点x,终点y)
let lineGradient = ctx.createLinearGradient(0, 0, 600, 400);
// addColorStop(number, 'color') 从0开始过程中颜色设置从红到粉色
lineGradient.addColorStop(0, "red");
lineGradient.addColorStop(1, "pink");
// 从红到粉到蓝
// lineGradient.addColorStop(0, 'red');
// lineGradient.addColorStop(0.5, 'pink');
// lineGradient.addColorStop(1, 'blue');
ctx.fillStyle = lineGradient;
ctx.fillRect(0, 0, 600, 400);
</script>
</body>
</html>
效果
红=>粉线性渐变
红=>粉=>蓝线性渐变
封装渲染函数结合请求动画帧实现动画渐变
完整代码
`<!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>
</head>
<body>
<!--
参数:
id:标识元素的唯一性
width:画布的宽度
height:画布的高度
-->
<canvas id="canvas1" width="1920px" height="400px">
<!-- 画布 -->
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 封装渲染函数reader
let index = 0;
function reader() {
// ctx.clearRect(0, 0, 600, 400);
index += 0.01;
if (index > 1) {
index = 0;
// index大于再从0开始
}
let lineGradient = ctx.createLinearGradient(0, 0, 600, 400);
lineGradient.addColorStop(0, "red");
lineGradient.addColorStop(index, "pink");
lineGradient.addColorStop(1, "blue");
ctx.fillStyle = lineGradient;
ctx.fillRect(0, 0, 600, 400);
requestAnimationFrame(reader);
}
// requestAnimationFrame请求动画帧;
requestAnimationFrame(reader);
</script>
</body>
</html>
效果
径向渐变
常用方法
//createRadialGradient径向渐变
let radiaGradent=ctx.createRadialGradient(300, 200, 0, 300, 200, 100);
完整代码
<!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>
</head>
<body>
<!--
参数:
id:标识元素的唯一性
width:画布的宽度
height:画布的高度
-->
<canvas id="canvas1" width="1920px" height="400px">
<!-- 画布 -->
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 径向渐变
let index = 0;
//createRadialGradient径向渐变
let radiaGradent=ctx.createRadialGradient(300, 200, 0, 300, 200, 100);
// 从内到外 红=>粉=>蓝径向渐变
radiaGradent.addColorStop(0, 'red');
radiaGradent.addColorStop(0.3, 'pink');
radiaGradent.addColorStop(1, 'blue');
ctx.fillStyle=radiaGradent;
ctx.fillRect(0, 0, 600, 400);
// requestAnimationFrame请求动画帧;
// requestAnimationFrame(reader);
</script>
</body>
</html>
效果
使用径向渐变绘制球体效果
完整代码
<!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>
</head>
<body>
<!--
参数:
id:标识元素的唯一性
width:画布的宽度
height:画布的高度
-->
<canvas id="canvas1" width="1920px" height="400px">
<!-- 画布 -->
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 绘制球体
let radiaGradent=ctx.createRadialGradient( 250, 150, 10,300, 200, 100,);
// 从内到外 红=>粉=>蓝径向渐变
radiaGradent.addColorStop(0, 'pink');
radiaGradent.addColorStop(1, 'red');
ctx.fillStyle=radiaGradent;
ctx.arc(300,200,100,0,Math.PI*2)
ctx.fill();
// requestAnimationFrame请求动画帧;
requestAnimationFrame(reader);
</script>
</body>
</html>
效果
5.3、 圆锥渐变
完整代码
<!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>
</head>
<body>
<!--
参数:
id:标识元素的唯一性
width:画布的宽度
height:画布的高度
-->
<canvas id="canvas1" width="1920px" height="400px">
<!-- 画布 -->
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 3.圆锥渐变
// createConicalGradient(角度,位置x,位置y)
let coneGradient=ctx.createConicGradient(Math.PI/4,300,200)
coneGradient.addColorStop(0, 'red');
coneGradient.addColorStop(0.5, 'blue');
coneGradient.addColorStop(1, 'pink');
ctx.fillStyle=coneGradient;
ctx.fillRect(0,0,600,400);
</script>
</body>
</html>
效果
5.4、 pattern印章填充方式
pattern印章填充方式可以填充canvas对象也可以弹窗图片
完整代码
<!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>
</head>
<body>
<!--
参数:
id:标识元素的唯一性
width:画布的宽度
height:画布的高度
-->
<canvas id="canvas1" width="1920px" height="400px">
<!-- 画布 -->
</canvas>
<script>
// 1.获取画布
let canvas1 = document.getElementById("canvas1");
// 2.获取画笔,上下文对象,用于画画用
let ctx = canvas1.getContext("2d");
// 3.圆锥渐变创建图案样式pattern
var img=new Image()
img.src='./img/mc.jpg';
img.onload=function(){
// 创建图案对象createPattern(Image图片对象也可以是canvas对象, repetition重复方式)
//repetition重复方式 重复方式 repeat重复 no-repeat不重复 repeat-x水平重复 repeat-y竖向重复
var pattern=ctx.createPattern(img, "no-repeat");
ctx.fillStyle=pattern;
ctx.fillRect(0,0,400,600);
}
</script>
</body>
</html>
效果
总结
如果这篇【文章】有帮助到你💖,希望可以给我点个赞👍,创作不易,如果有对前端端或者对python感兴趣的朋友,请多多关注💖💖💖,学习成长的路上本就孤单,在之后的路上也希望大家多多支持和陪伴,我会尽我所能产出一些对大家有益的文章,在成长的路上我们一起做大做强😂。!!!
👨🔧 个人主页 : 前端初见