平凡前端之路_02.HTML5的Canvas

什么是Canvas?

canvas 元素用于在网页上绘制图形。


canvas只是图形容器,是一个矩形区域,并没有绘制能力,有一个绘图 API 展现给客户端 JavaScript 以使脚本能够把想绘制的东西都绘制到一块画布上。
canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。

创建 Canvas 元素

向 HTML5 页面添加 canvas 元素。

规定元素的 id、宽度和高度:

<canvas id="myCanvas" width="200" height="100"></canvas>

通过 JavaScript 来绘制

canvas 元素本身是没有绘图能力的。所有的绘制工作必须在 JavaScript 内部完成:
JavaScript 使用 id 来寻找 canvas 元素:

var c=document.getElementById("myCanvas");

然后,创建 context 对象:

var cxt=c.getContext("2d"); 

canvas的座标

通过设置getContext(‘2d’)让canvas获得一个2d环境。


默认情况下canvas 的左上角座标 (0,0)为座标原点,沿x轴向右为正值,沿y轴向下为正值,canvas的转换会对座标系统进行变换。

canvas的颜色、样式和阴影

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

canvas的线条样式

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

canvas的路径

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

canvas的矩形

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

canvas的转换

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

canvas的文本

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

canvas的拓展

方法 描述
drawImage() 向画布上绘制图像、画布或视频
getContext() 获得用于在画布上绘图的对象
toDataURL() 导出在 canvas 元素上绘制的图像

toDataURL的拓展

画布允许drawImage()使用跨域 <img> 元素的图像,但是这会污染画布。
一旦画布被污染,就无法读取其数据。例如,不能再使用画布的 toBlob(), toDataURL() 或 getImageData() 方法。
浏览器为了保护你的隐私,避免未经许可拉取远程网站信息而导致的用户隐私泄露。

通过:

img.setAttribute('crossOrigin', 'anonymous')

可以绕过浏览器。

但是当你的网页上有该图片 <img>时,由于浏览器第一次已经把图片加载并缓存下来,在画布上第二次请求该图片时,不需要再从服务端请求,而直接从缓存里取。

第一次已经把图片加载时是没带img.setAttribute(‘crossOrigin’, ‘anonymous’),在画布上第二次请求该图片从缓存里取,拿到的是不带img.setAttribute(‘crossOrigin’, ‘anonymous’)的图片,此时不能再使用画布的 toBlob(), toDataURL() 或 getImageData() 方法。

解决办法是在画布上第二次请求该图片时,图片链接携带随机数(比如时间戳),这样该图片会去服务器加载,并通过img.setAttribute(‘crossOrigin’, ‘anonymous’)绕过浏览器了。

canvas与SVG

Canvas SVG
通过 JavaScript 来绘制 2D 图形 通过XML 描述 2D 图形
依赖分辨率 不依赖分辨率
不支持事件处理器 支持事件处理器
弱的文本渲染能力 复杂度高会减慢渲染速度
能够以 .png 或 .jpg 格式保存结果图像
最适合图像密集型的游戏,其中的许多对象会被频繁重绘 不适合游戏应用

HTML 知识题


题目 答案
HTML5 中的 <canvas> 元素用于? 绘制图形
在 HTML5 中,哪个属性用于规定输入字段是必填的? required
HTML5具有的存储类型? sessionStorage、localStorage、Cookies
在<video>中,使媒介文件循环播放的属性 loop
在 <html> 中,设置网页的背景图的属性是 background
在<table>中,设置表格的背景颜色的属性是? bgcolor
图像无法显示时的替代文本的属性是? alt
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章