html的画布

在网页中,我们把用于绘制图形的特殊区域也称为“画布”,网页设计师可以在该区域义绘制自定的图形样式。

画布的使用方法

1.创建画布

<canvas id="画布名称" width="数值" height="数值">您的浏览器不支持canvas(当浏览器不支持画布标签会弹出此内容)
</canvas>

2.获取画布

使用getElementById()方法可以获取网页中的画布对象。
语法格式:

var canvas = document.getElementById('cavs');

3.准备画笔

有了画布之后,要开始绘图,还需要准备一只画笔,这支画笔就是context对象。context对象也被称为绘制环境,通过该对象,可以在画布中绘制图形。
基本语法格式:

canvas.getContext('2d');

4.确定初始位置

在绘制图形时,我们首先需要确定从哪里下“笔”,这个下“笔”的位置就是初始位置。在平面中(2d),初始位置可以通过“x,y”的坐标轴来表示。在画布中从最左上角“0,0”开始,x轴向右增大, y轴向下增大。
基本语法格式:

context.moveTo(100,100);

5.确定末端位置

连线末点用于定义一个端点,并绘制一条从该端点到初始位置的连线。在画布中使用lineTo(x,y)方法来定义连线端点。
基本语法格式:

context.lineTo(100,100);

6.描边

通过初始位置和连线端点可以绘制一条线,但这条线并不能被看到。这时我们需要为线添加描边,让线变得可见。使用画布中的stroke()方法,可以实现线的可视效果。
基本语法格式:

context.stroke();

画布的一些方法

颜色、样式和阴影

属性 描述
fillStyle 设置或返回用于填充绘画的颜色、渐变或模式。
strokeStyle 设置或返回用于笔触的颜色、渐变或模式。
shadowColor 设置或返回用于阴影的颜色。
shadowBlur 设置或返回用于阴影的模糊级别。
shadowOffsetX 设置或返回阴影与形状的水平距离。
shadowOffsetY 设置或返回阴影与形状的垂直距离。
方法 描述
createLinearGradient() 创建线性渐变(用在画布内容上)。
createPattern() 在指定的方向上重复指定的元素。
createRadialGradient() 创建放射状/环形的渐变(用在画布内容上)。
addColorStop() 规定渐变对象中的颜色和停止位置。

线条样式

属性 描述
lineCap 设置或返回线条的结束端点样式。
lineJoin 设置或返回两条线相交时,所创建的拐角类型。
lineWidth 设置或返回当前的线条宽度。
miterLimit 设置或返回最大斜接长度。

矩形

方法 描述
rect() 创建矩形。
fillRect() 绘制"被填充"的矩形。
strokeRect() 绘制矩形(无填充)。
clearRect() 在给定的矩形内清除指定的像素。

路径

方法 描述
fill() 填充当前绘图(路径)。
stroke() 绘制已定义的路径。
beginPath() 起始一条路径,或重置当前路径。
moveTo() 把路径移动到画布中的指定点,不创建线条。
closePath() 创建从当前点回到起始点的路径。
lineTo() 添加一个新点,然后在画布中创建从该点到最后指定点的线条。
clip() 从原始画布剪切任意形状和尺寸的区域。
quadraticCurveTo() 创建二次贝塞尔曲线。
bezierCurveTo() 创建三次贝塞尔曲线。
arc() 创建弧/曲线(用于创建圆形或部分圆)。arc(x,y,r,开始角,结束角,方向(默认为false,是顺时针,true为逆时针))
arcTo() 创建两切线之间的弧/曲线。
isPointInPath() 如果指定的点位于当前路径中,则返回 true,否则返回 false。

转换

方法 描述
scale() 缩放当前绘图至更大或更小。
rotate() 旋转当前绘图。
translate() 重新映射画布上的 (0,0) 位置。
transform() 替换绘图的当前转换矩阵。
setTransform() 将当前转换重置为单位矩阵。然后运行 transform()。

文本

属性 描述
font 设置或返回文本内容的当前字体属性。
textAlign 设置或返回文本内容的当前对齐方式。
textBaseline 设置或返回在绘制文本时使用的当前文本基线。
方法 描述
fillText() 在画布上绘制"被填充的"文本。
strokeText() 在画布上绘制文本(无填充)。
measureText() 返回包含指定文本宽度的对象。

图像绘制

方法 描述
drawImage() 向画布上绘制图像、画布或视频。

像素操作

属性 描述
width 返回 ImageData 对象的宽度。
height 返回 ImageData 对象的高度。
data 返回一个对象,其包含指定的 ImageData 对象的图像数据。
方法 描述
createImageData() 创建新的、空白的 ImageData 对象。
getImageData() 返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据。
putImageData() 把图像数据(从指定的 ImageData 对象)放回画布上。

合成

属性 描述
globalAlpha 设置或返回绘图的当前 alpha 或透明值。
globalCompositeOperation 设置或返回新图像如何绘制到已有的图像上。

其他

方法 描述
save() 保存当前环境的状态。
restore() 返回之前保存过的路径状态和属性。
createEvent()
getContext()
toDataURL()

常用的属性方法详解

线的样式

1、宽度

使用画布中的lineWidth属性可以定义线的宽度,该属性的取值为数值(不带单位),以像素为计量。
基本语法格式:

context.lineWidth='10';

2、描边颜色

使用画布中的strokeStyle属性可以定义线的描边颜色,该属性的取值为十六进制颜色值或颜色英文。
基本语法格式:

context.strokeStyle='red';

3、端点形状

默认情况下,线的端点是方形的,通过画布中的lineCap属性可以改变端点的形状。
基本语法格式:

lineCap=’属性值’
属性值 显示效果
butt(默认值) 默认效果,无端点,显示直线方形边缘。
round 显示圆形端点。
square 显示方形端点。

线的路径

闭合路径就是将我们绘制的开放路径,进行封闭处理,多点的路径闭合后会形成特定的形状。在画布中,使用closePath()方法闭合路径。
基本语法格式:

ctx.closePath();

3、填充路径

通过填充路径的内容区域生成实心的图形。
基本语法格式:

ctx.fillStyle = '#ff0'
ctx.fill();

圆的绘制方法

在画布中,使用arc()方法可以绘制圆或弧线。
基本语法格式:

arc(x,y,r,开始角,结束角,方向)

x和y: x和y表示圆心在x轴和y轴的坐标位置。
r: 表示圆形或弧形的半径,用于确定图形的大小。
开始角:表示初始弧点位置。其中弧点使用数值和“Math.PI”(圆周率,可以理解为180度)表示。
结束角:结束的弧点位置,初始角的设置方式一致。
方向:分为顺时针和逆时针绘。(false和true,默认为true逆时针)

保存画布

使用画布的toblob()方法
.toBlob() 方法创造Blob对象,用以展示canvas上的图片;这个图片文件可以被缓存或保存到本地,由用户代理端自行决定。如不特别指明,图片的类型默认为 image/png,分辨率为96dpi。

URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。

//URL.createObjectURL() 使用// html代码
<input type="file" id="file">// js代码
document.querySelector('#file').onchange = function (e) {console.log(e.target.files[0])console.log(URL.createObjectURL(e.target.files[0]))
}
语法
canvas.toBlob(callback, type, encoderOptions);
参数
callback
回调函数------可获得一个单独的Blob对象参数。
type 可选------DOMString类型,指定图片格式,默认格式为image/png。
encoderOptions 可选-------Number类型,值在0与1之间,当请求图片格式为image/jpeg或者image/webp时用来指定图片展示质量。如果这个参数的值不在指定类型与范围之内,则使用默认值,其余参数将被忽略。
返回值
无。
异常
SecurityError
canvas“被污染”的情况下不能使用此方法使用时,可以在点击按钮时创建个a标签,添加a标签download下载,并添加保存的格式png,a.download = name + ".png",然后创建a.href="",给a标签添加下载的路径,并且执行a.click(),主动执行a标签的点击事件,最后执行a.remove(),移除a的点击事件即可实现点击按钮下载画布内容,下面为案例代码//获取input的值let name = ""let input = document.getElementById("srk")input.addEventListener("change", function (e) {name = this.value})//保存为图片let baocun = document.getElementById("baocun")baocun.addEventListener("click", function () {canvas.toBlob(function (blob) {let a = document.createElement("a")document.querySelector("body").appendChild(a)a.download = name + ".png"a.href = URL.createObjectURL(blob)a.click()a.remove()})})

以下是三个小案例,仅供参考

画布签名板(可下载保存)

<!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>/* #huabu {width: 400px;height: 200px;border: 1px solid black;} */</style>
</head><body><canvas id="huabu" width="400px" height="200px" style="border:1px solid #000000;"></canvas><div><input type="text" id="srk" placeholder="请输入图片名称"><button id="baocun">保存为图片</button><button id="qingchu" onclick="clearCanvas()">清除画布</button></div><script>//获取画布let canvas = document.getElementById("huabu")console.log(canvas.getBoundingClientRect());let canvasStyle = canvas.getBoundingClientRect()let ctx = canvas.getContext("2d")let isDrawing = falselet l = canvas.offsetLeftlet h = canvas.offsetTopcanvas.addEventListener('mousedown', function (e) {isDrawing = true// ctx.moveTo(e.pageX - canvas.offsetLeft, e.pageY - canvas.offsetTop);ctx.moveTo(e.pageX - canvasStyle.x, e.pageY - canvasStyle.y);})canvas.addEventListener('mousemove', function (e) {if (isDrawing) {//ctx.lineTo(e.pageX - canvas.offsetLeft, e.pageY - canvas.offsetTop);ctx.lineTo(e.pageX - canvasStyle.x, e.pageY - canvasStyle.y);ctx.strokeStyle = 'red';ctx.stroke();}})document.addEventListener('mouseup', function (e) {isDrawing = false})//获取input的值let name = ""let input = document.getElementById("srk")input.addEventListener("change", function (e) {name = this.value})//保存为图片let baocun = document.getElementById("baocun")baocun.addEventListener("click", function () {canvas.toBlob(function (blob) {let a = document.createElement("a")document.querySelector("body").appendChild(a)a.download = name + ".png"a.href = URL.createObjectURL(blob)a.click()a.remove()})})//清除画布let qingchu = document.getElementById("qingchu")qingchu.addEventListener("click", function () {canvas.width = canvas.widthcanvas.height = canvas.height})</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><style>span {position: absolute;}</style>
</head><body><canvas id="cas" width="1000" height="600"></canvas><span></span><script type="text/javascript">var canvas = document.getElementById('cas')var ctx = canvas.getContext('2d');//头部ctx.beginPath();ctx.arc(400, 110, 30, 0, 2 * Math.PI, true);ctx.closePath();ctx.strokeStyle = '#ff9900';ctx.lineWidth = '3';ctx.stroke();//脖子ctx.beginPath();ctx.moveTo(400, 140);ctx.lineTo(400, 160);ctx.lineWidth = 3;ctx.stroke();//身体ctx.beginPath();ctx.moveTo(400, 160);ctx.lineTo(400, 250);ctx.lineWidth = 35;ctx.stroke();//文件夹ctx.beginPath();ctx.moveTo(350, 200);ctx.lineTo(350, 240);ctx.lineTo(450, 240);ctx.lineTo(450, 200);ctx.closePath();ctx.fillStyle = '#cc3333';ctx.fill();ctx.lineWidth = 2;ctx.stroke();//胳膊ctx.beginPath();ctx.moveTo(400, 165);ctx.lineTo(450, 200);ctx.lineTo(400, 240);ctx.lineWidth = 8;ctx.stroke();//手掌ctx.beginPath();ctx.arc(400, 240, 8, 0, 2 * Math.PI, true);ctx.fillStyle = '#ff0';ctx.fill();//腿部ctx.beginPath();ctx.moveTo(400, 250);ctx.lineTo(380, 320);ctx.lineTo(370, 380);ctx.lineWidth = 9;ctx.stroke();ctx.beginPath();ctx.moveTo(400, 250);ctx.lineTo(420, 380);ctx.lineWidth = 9;ctx.stroke();//脚ctx.beginPath();ctx.arc(360, 380, 10, 0, 1 * Math.PI, true);ctx.closePath();ctx.fillStyle = '#ff0'ctx.fill();ctx.lineWidth = '2';ctx.stroke();ctx.beginPath();ctx.arc(410, 380, 10, 0, 1 * Math.PI, true);ctx.closePath();ctx.fillStyle = '#ff0'ctx.fill();ctx.lineWidth = '2';ctx.stroke();let span = document.querySelector("span")document.addEventListener("mousemove", function (e) {span.style.top = e.pageY - canvas.offsetTop + 5 + "px"span.style.left = e.pageX - canvas.offsetLeft + 15 + "px"span.innerHTML = `${e.pageX - canvas.offsetLeft},${e.pageY - canvas.offsetTop}`})</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><style>span {position: absolute;}</style>
</head><body><canvas id="cas" width="400" style="border: 1px solid;" height="400"></canvas><span></span><script type="text/javascript">var canvas = document.getElementById("cas")var ctx = canvas.getContext('2d');ctx.beginPath();ctx.arc(100, 100, 60, 0, 2 * Math.PI, true);ctx.fillStyle = '#ff0';ctx.fill();ctx.beginPath();ctx.strokeStyle = 'black';ctx.lineWidth = 5;ctx.arc(100, 110, 25, Math.PI / 6, 5 * Math.PI / 6, false);ctx.stroke();ctx.beginPath();ctx.strokeStyle = 'red';ctx.lineWidth = 5;ctx.arc(70, 80, 15, Math.PI / 400, Math.PI, true);ctx.stroke();ctx.beginPath();ctx.strokeStyle = '#fff';ctx.lineWidth = 5;ctx.arc(130, 80, 15, Math.PI / 400, Math.PI, true);ctx.stroke();let span = document.querySelector("span")document.addEventListener("mousemove", function (e) {span.style.top = e.pageY - canvas.offsetTop + 5 + "px"span.style.left = e.pageX - canvas.offsetLeft + 15 + "px"span.innerHTML = `${e.pageX - canvas.offsetLeft},${e.pageY - canvas.offsetTop}`})  </script>
</body></html>

html画布标签的使用相关推荐

  1. Web前端开发笔记——第二章 HTML语言 第十节 画布标签、音视频标签

    目录 一.画布标签 二.音视频标签 (一)音频标签 (二)视频标签 (三)资源标签 结语 一.画布标签 <canvas> </canvas> 画布标签用于图形.字符等的绘制,它 ...

  2. 【canvas 图形画布标签】(使用详解)

    canvas 图形画布标签 1. 如何定义一个 图形画布 ? 1.1 canvas 图形画布 标签的属性 有哪些 ? 1.2 canvas 图形画布的 基本用法 有哪些 ? 1.3 如何使用 canv ...

  3. html5使用画布标签显示wmf,在RES.web.Html5VersionController废弃后,如何做版本管理

    在之前的版本,可以通过重写Html5VersionController, 在游戏一次更新后,增加v版本号,来达到修改每次加载的png.mp3.json等文件的url不同,来解决缓存的问题. 这样的好处 ...

  4. js画布组件(canvas/canvas)

    一.Canvas是什么? Canvas就是一个画布,可以进行画任何的线.图形.填充等一系列的操作,而且操作的画图就是js,所以让js编程到了嗑药的地步.另外Canvas不仅仅提供简单的二维矢量绘图,也 ...

  5. HTML5增加的几个新的标签

    HTML5又2008年诞生,HTML5大致可以等同于=html+css3+javascriptapi.... so --->支持css3强大的选择器和动画以及javascript的新的函数 先来 ...

  6. 《JavaScript高效图形编程(修订版)》——6.7 画布绘制基础

    本节书摘来自异步社区<JavaScript高效图形编程(修订版)>一书中的第6章,第6.7节,作者:[美]Raffaele Cecco著,更多章节内容可以访问云栖社区"异步社区& ...

  7. python清空画布_关于python:如何清除Tkinter画布?

    当我使用以下方法绘制形状时: canvas.create_rectangle(10, 10, 50, 50, color="green") Tkinter是否跟踪其创建的事实? 在 ...

  8. Canvas画布、SVG图片

    Canvas 一.canvas 1.<canvas>标签:画布标签 (height,width,半透明),本身不具备绘图能力,可以通过脚本(通常指js)来实现 width:设置画布宽度,默 ...

  9. 教你如何利用canvas画布绘制哆啦A梦

    教你如何利用canvas画布绘制哆啦A梦 最近一直在练习使用canvas画布标签,今天教大家如何使用canvas画布绘制哆啦A梦.如图: HTML代码: <canvas id="my_ ...

最新文章

  1. linux字符设备文件的打开操作,Linux字符设备驱动模型之字符设备初始化
  2. 消息发送 C语言版和 Visual Basic Script版
  3. 安卓qpython怎么使用_如何使用QPython开发Android应用?
  4. LeetCode SQL 196. 删除重复的电子邮箱
  5. 函数作用域导致的问题
  6. 在浏览器中分析AV1码流
  7. 7-4 统计Java程序中关键词的出现次数 (25 分)
  8. FPGA相关术语(一)
  9. 解决弹出的窗口window.open会被浏览器阻止的问题
  10. GRE Tunnel实现企业网中的***
  11. MAC 用命令查看IP
  12. 记一次在京东购买笔记本电脑的经历
  13. CFS任务的负载均衡
  14. Word(二) Word2016 如何删除页眉的下划线
  15. 微信小程序开发入门需要学什么?
  16. 沁恒CH573开发板上手
  17. 用计算机的声音编辑工具录制一段语音信号,传媒2020年7月《影视录音基础》课程考试在线作业考核试题题目【标准答案】...
  18. (附源码)计算机毕业设计ssm高校线上教学系统
  19. 软件测试,别海投简历
  20. GitLab分支合并时,选择use ours是指分支而不是主分支

热门文章

  1. 计算机应用强化训练1,计算机应用基础知识强化训练题
  2. 优漫动游零基础是可以去学习平面设计的!! ​
  3. Mothur配合qiime生成otutable
  4. Krypton控件组简介与使用
  5. canvas实现涂鸦效果--基本涂鸦效果
  6. 力士乐伺服电机编码器调零_力士乐REXROTH电机 博世伺服电机调试方法
  7. 金属硬掩膜物理气相沉积系统
  8. 057_《Delphi住宿餐饮管理系统开发实例导航》
  9. 十二 焦距与视野角的关系
  10. SaaSBase:什么是Oracle Fusion ERP?