`
wjlgryx
  • 浏览: 308673 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HTML 5 canvas —— 基本语法

阅读更多

本文翻译自 HTML 5 canvas - the basics
目录
• 简述
• canvas 基础
• 2D context API
• 基本线条
• 路径
• 插入图像
• 像素级操作
• 文字
• 阴影
• 颜色渐变
• 小节
简述
HTML 5 规范引进了很多新特性,其中最令人期待的之一就是 canvas 元素。HTML 5 canvas 提供了通过 JavaScript 绘制图形的方法,此方法使用简单但功能强大。每一个 canvas 元素都有一个"上下文( context )" (想象成绘图板上的一页),在其中可以绘制任意图形。浏览器支持多个 canvas 上下文,并通过不同的 API 提供图形绘制功能。
大部分的浏览器都支持 2D canvas 上下文——包括 Opera, Firefox, Konqueror 和 Safari。而且某些版本的 Opera 还支持 3D canvas ,Firefox 也可以通过插件形式支持 3D canvas :
• 下载支持 3D canvas, HTML video 和 File I/O 的 Opera

• 关于 Opera 3D canvas 上下文的文章
• 关于 Firefox 3D canvas
上下文的文章
本文介绍 2D canvas
基础以及如何使用基本 canvas 函数,如线条、形状、图像和文字等。为了理解此文章,你最好了解 JavaScript 基础知识。
可以点击此处批量下载本文实例代码
canvas 基础
创建 canvas 的方法很简单,只需要在 HTML 页面中添加 <canvas> 元素:
<canvas id="myCanvas" width="300" height="150">
Fallback content, in case the browser does not support Canvas.
</canvas>
为了能在 JavaScript 中引用元素,最好给元素设置 ID ;也需要给 canvas 设定高度和宽度。
创建好了画布后,让我们来准备画笔。要在画布中绘制图形需要使用 JavaScript 。首先通过getElementById 函数找到 canvas
元素,然后初始化上下文。之后可以使用上下文 API 绘制各种图形。下面的脚本在 canvas 中绘制一个矩形 (点击此处查看效果):
// Get a reference to the element.
var elem = document.getElementById('myCanvas');

// Always check for properties 和 methods, to make sure your code doesn't break
// in other browsers.
if (elem && elem.getContext) {
  // Get the 2d context.
  // Remember: you can only initialize one context per element.
  var context = elem.getContext('2d');
  if (context) {
    // You are done! Now you can draw your first rectangle.
    // You only need to provide the (x,y) coordinates, followed by the width and
    // height dimensions.
    context.fillRect(0, 0, 150, 100);
  }
}
可以把上面代码放置在文档 head 部分中,或者放在外部文件中。
2D context API
介绍了如何创建 canvas 后,让我们来看看 2D canvas API,看看能用这些函数做些什么。
基本线条
上面的例子中展示了绘制矩形是多么简单。
通过 fillStyle 和 strokeStyle 属性可以轻松的设置矩形的填充和线条。颜色值使用方法和 CSS 一样:十六进制数、rgb()、rgba() 和 hsla()( 若浏览器支持,如 Opera
10 和 Firefox 3)。
通过 fillRect 可以绘制带填充的矩形。使用 strokeRect 可以绘制只有边框没有填充的矩形。如果想清除部分 canvas 可以使用 clearRect。上述三个方法的参数相同:x, y, width, height。前两个参数设定 (x,y) 坐标,后两个参数设置矩形的高度和宽度。
可以使用 lineWidth 属性改变线条粗细。让我们看看使用了fillRect,
strokeRect clearRect 和其他的例子:
context.fillStyle   = '#00f'; // blue
context.strokeStyle = '#f00'; // red
context.lineWidth   = 4;

// Draw some rectangles.
context.fillRect  (0,   0, 150, 50);
context.strokeRect(0,  60, 150, 50);
context.clearRect (30, 25,  90, 60);
context.strokeRect(30, 25,  90, 60);
此例子效果图见图1.


图 1: fillRect, strokeRect 和
clearRect效果图
路径
通过 canvas 路径(path)可以绘制任意形状。可以先绘制轮廓,然后绘制边框和填充。创建自定义形状很简单,使用 beginPath()开始绘制,然后使用直线、曲线和其他图形绘制你的图形。绘制完毕后调用 fill 和stroke 即可添加填充或者设置边框。调用 closePath() 结束自定义图形绘制。
下面是一个绘制三角形的例子:
// Set the style properties.
context.fillStyle   = '#00f';
context.strokeStyle = '#f00';
context.lineWidth   = 4;

context.beginPath();
// Start from the top-left point.
context.moveTo(10, 10); // give the (x,y) coordinates
context.lineTo(100, 10);
context.lineTo(10, 100);
context.lineTo(10, 10);

// Done! Now fill the shape, 和 draw the stroke.
// Note: your shape will not be visible until you call any of the two methods.
context.fill();
context.stroke();
context.closePath();
其效果图见图2.


图 2: 三角形
另一个较负责的例子中使用了直线、曲线和圆弧。
插入图像
drawImage 方法允许在 canvas 中插入其他图像
( img 和 canvas 元素) 。在 Opera 中可以再 canvas 中绘制 SVG 图形。此方法比较复杂,可以有3个、5个或9个参数:
• 3个参数:最基本的 drawImage 使用方法。一个参数指定图像位置,另两个参数设置图像在 canvas中的位置。
• 5个参数:中级的 drawImage 使用方法,包括上面所述3个参数,加两个参数指明插入图像宽度和高度 (如果你想改变图像大小)。
• 9个参数:最复杂 drawImage 杂使用方法,包含上述5个参数外,另外4个参数设置源图像中的位置和高度宽度。这些参数允许你在显示图像前动态裁剪源图像。
下面是上述三个使用方法的例子:
// Three arguments: the element, destination (x,y) coordinates.
context.drawImage(img_elem, dx, dy);

// Five arguments: the element, destination (x,y) coordinates, and destination
// width and height (if you want to resize the source image).
context.drawImage(img_elem, dx, dy, dw, dh);

// Nine arguments: the element, source (x,y) coordinates, source width and
// height (for cropping), destination (x,y) coordinates, and destination width
// and height (resize).
context.drawImage(img_elem, sx, sy, sw, sh, dx, dy, dw, dh);
其效果见图3.


图 3: drawImage 效果图。
像素级操作
2D Context API 提供了三个方法用于像素级操作:createImageData, getImageData, 和
putImageData。
ImageData对象保存了图像像素值。每个对象有三个属性: width, height 和
data。data 属性类型为CanvasPixelArray,用于储存width*height*4个像素值。每一个像素有RGB值和透明度alpha值(其值为 0 至
255,包括alpha在内!)。像素的顺序从左至右,从上到下,按行存储。
为了更好的理解其原理,让我们来看一个例子——绘制红色矩形
// Create an ImageData object.
var imgd = context.createImageData(50,50);
var pix = imgd.data;

// Loop over each pixel 和 set a transparent red.
for (var i = 0; n = pix.length, i < n; i += 4) {
  pix[i  ] = 255; // red channel
  pix[i+3] = 127; // alpha channel
}

// Draw the ImageData object at the given (x,y) coordinates.
context.putImageData(imgd, 0,0);
注意: 不是所有浏览器都实现了 createImageData。在支持的浏览器中,需要通过 getImageData 方法获取ImageData 对象。请参考示例代码。
通过 ImageData 可以完成很多功能。如可以实现图像滤镜,或可以实现数学可视化 (如分形和其他特效)。下面特效实现了简单的颜色反转滤镜:
// Get the CanvasPixelArray from the given coordinates and dimensions.
var imgd = context.getImageData(x, y, width, height);
var pix = imgd.data;

// Loop over each pixel and invert the color.
for (var i = 0, n = pix.length; i < n; i += 4) {
  pix[i  ] = 255 - pix[i  ]; // red
  pix[i+1] = 255 - pix[i+1]; // green
  pix[i+2] = 255 - pix[i+2]; // blue
  // i+3 is alpha (the fourth element)
}

// Draw the ImageData at the given (x,y) coordinates.
context.putImageData(imgd, x, y);
图 4 显示了使用此滤镜后的 Opera
图像 (图 3是原图)。


图 4: 颜色反转滤镜
文字
虽然最近的 WebKit 版本和 Firefox 3.1 nightly build 才开始支持 Text API ,为了保证文章完整性我决定仍在这里介绍文字 API 。
context 对象可以设置以下 text 属性:
• font:文字字体,同 CSS
font-family 属性
• textAlign:文字水平对齐方式。可取属性值: start, end, left,
right, center。默认值:
start.
• textBaseline:文字竖直对齐方式。可取属性值:top, hanging, middle,
alphabetic, ideographic, bottom。默认值:alphabetic.
有两个方法可以绘制文字: fillText 和 strokeText。第一个绘制带 fillStyle 填充的文字,后者绘制只有strokeStyle 边框的文字。两者的参数相同:要绘制的文字和文字的位置(x,y) 坐标。还有一个可选选项——最大宽度。如果需要的话,浏览器会缩减文字以让它适应指定宽度。
文字对齐属性影响文字与设置的
(x,y) 坐标的相对位置。
下面是一个在 canvas 中绘制"hello world" 文字的例子
context.fillStyle    = '#00f';
context.font         = 'italic 30px sans-serif';
context.textBaseline = 'top';
context.fillText  ('Hello world!', 0, 0);
context.font         = 'bold 30px sans-serif';
context.strokeText('Hello world!', 0, 50);
图 5 是其效果图。


图 5: 文字效果
阴影
目前只有 Konqueror 和 Firefox 3.1 nightly build 支持 Shadows API 。API 的属性为:
• shadowColor:阴影颜色。其值和 CSS 颜色值一致。
• shadowBlur:设置阴影模糊程度。此值越大,阴影越模糊。其效果和 Photoshop 的高斯模糊滤镜相同。
• shadowOffsetX 和 shadowOffsetY:阴影的 x 和 y 偏移量,单位是像素。
下面是 canvas 阴影的例子:
context.shadowOffsetX = 5;
context.shadowOffsetY = 5;
context.shadowBlur    = 4;
context.shadowColor   = 'rgba(255, 0, 0, 0.5)';
context.fillStyle     = '#00f';
context.fillRect(20, 20, 150, 100);
其效果见图 6。


图 6: canvas 阴影效果——蓝色矩形,红色阴影
颜色渐变
除了 CSS 颜色, fillStyle 和 strokeStyle 属性可以设置为 CanvasGradient 对象。——通过CanvasGradient可以为线条和填充使用颜色渐变。
欲创建 CanvasGradient 对象,可以使用两个方法:createLinearGradient 和 createRadialGradient。前者创建线性颜色渐变,后者创建圆形颜色渐变。
创建颜色渐变对象后,可以使用对象的 addColorStop 方法添加颜色中间值。
下面的代码演示了颜色渐变使用方法:
// You need to provide the source 和 destination (x,y) coordinates
// for the gradient (from where it starts 和 where it ends).
var gradient1 = context.createLinearGradient(sx, sy, dx, dy);

// Now you can add colors in your gradient.
// The first argument tells the position for the color in your gradient. The
// accepted value range is from 0 (gradient start) to 1 (gradient end).
// The second argument tells the color you want, using the CSS color format.
gradient1.addColorStop(0,   '#f00'); // red
gradient1.addColorStop(0.5, '#ff0'); // yellow
gradient1.addColorStop(1,   '#00f'); // blue

// For the radial gradient you also need to provide source
// 和 destination circle radius.
// The (x,y) coordinates define the circle center points (start 和
// destination).
var gradient2 = context.createRadialGradient(sx, sy, sr, dx, dy, dr);

// Adding colors to a radial gradient is the same as adding colors to linear
// gradients.
我也准备了一个更复杂的例子,使用了线性颜色渐变、阴影和文字。其效果见图 7。


图 7: 使用线性颜色渐变的例子
canvas 演示
如果你想知道使用 Canvas可以做些什么,可以参看以下的工程:
• Opera Widget:
• SimAquarium
• Artist's
Sketchbook
• Spirograph
• 在线工程和演示
• Newton polynomial
• Canvascape - "3D Walker"
• Paint.Web - painting
demo, open-source
• Star-field
flight
• Interactive blob
小节
Canvas 是 HTML 5最让人期待的特性之一,目前已获得大部分 Web 浏览器支持。Canvas 可以帮助创建游戏、增强图形用户界面。2D context
API 提供大量图形绘制功能——我希望通过本文你了解了 canvas 使用,并且你有兴趣了解更多!
本文采用的授权是创作共用的“署名-非商业性使用-相同方式共享 2.5 通用许可”。
分享到:
评论

相关推荐

    HTML5 Canvas核心技术.pdf

    本书名为“HTML5 Canvas核心技术”,专门针对对HTML5 Canvas画图功能感兴趣的读者,特别是已经掌握基础的html、css和JavaScript知识的开发者。本书将深入浅出地介绍Canvas的核心技术,帮助读者快速上手并精通Canvas...

    从入门到精通HTML5——PDF——网盘链接

     1.3 HTML的基本结构 5  1.3.1 HTML文件的编写方法 5  1.3.2 文件开始标签&lt;html&gt; 7  1.3.3 文件头部标签&lt;head&gt; 7  1.3.4 文件标题标签&lt;title&gt; 7  1.3.5 文件主体标签&lt;body&gt; 7  1.3.6...

    网页模板——基于html5 canvas绘制炫酷爆炸圆点背景动画特效源码.zip

    这个"网页模板——基于html5 canvas绘制炫酷爆炸圆点背景动画特效源码"是一个利用HTML5 Canvas API实现的视觉效果,为网页提供了一个引人注目的背景动画。 首先,Canvas API是一个JavaScript接口,提供了基本的2D...

    HTML5示例——数百个示例及源代码

    通过实践这些HTML5示例,你不仅可以掌握HTML5的基本语法,还能了解到如何结合CSS3和JavaScript来构建功能丰富的现代网页。记得将理论与实践相结合,不断探索和尝试,你将能更好地驾驭HTML5这一强大的工具。

    HTML5 Canvas绘制灰太狼图片简笔画.rar

    首先,Canvas是HTML5中新增的一个标签,它的基本语法是`&lt;canvas id="myCanvas" width="500" height="500"&gt;&lt;/canvas&gt;`。`id`属性用于唯一标识Canvas元素,`width`和`height`定义了画布的尺寸。在实际应用中,Canvas...

    HTML5 Canvas雪花飘落特效.zip

    首先,我们需要了解HTML5 Canvas的基本概念。Canvas是一个基于矢量图形的画布,通过JavaScript来控制,可以实现动态图形、动画以及复杂的交互式设计。它提供了一系列API方法,如`fillRect()`、`strokeRect()`、`...

    HTML5学习文档汇总

    其次,“[HTML+5+从入门到精通]”可能是一本针对初学者的教程,从最基础的HTML5语法开始,逐步引导读者掌握HTML5的各种新功能。书中的章节可能包括创建结构化的网页、样式表CSS3的配合使用、表单控件的增强、Web ...

    什么是——HTML5

    HTML5引入了许多新功能和改进的语法,使得网页内容更加结构化和语义化。例如,新添加的`&lt;article&gt;`和`&lt;aside&gt;`元素用于区分文章内容和侧边栏信息,`&lt;audio&gt;`和`&lt;video&gt;`元素则使得内嵌多媒体成为可能,无需借助外部...

    HTML5经典游戏——曲线谜团

    在HTML5中,Canvas元素是实现动态图形的关键。"曲线谜团"很可能就是通过Canvas来绘制游戏场景,包括游戏的背景、玩家操作的元素以及谜题的路径等。Canvas提供了JavaScript API,允许开发者动态地绘制图形、处理动画...

    HTML网页练习——努比亚官网.rar

    总的来说,这个练习旨在帮助你掌握HTML5的基本语法和特性,理解CSS的布局原理,以及如何将两者结合应用于实际项目中。通过这个练习,你可以一步步建立起自己的网页开发技能,为未来深入学习JavaScript和其他前端技术...

    网页设计必备——html初级教程

    这个"网页设计必备——html初级教程"包含两个CHM文件:HTML入门与提高.CHM和HTML基础教程.chm,它们将帮助初学者理解并掌握HTML的基本概念和语法。 HTML入门与提高.CHM可能涵盖以下内容: 1. HTML简介:解释HTML的...

    HTML5网页设计课程标准

    本课程标准旨在培养学生具备 HTML5 网页设计和开发的能力,掌握 HTML5 的基本语法规则、常见新标签、CSS3 新属性、Canvas 绘图基础、HTML5 本地存储 storage 编程基础、HTML5 本地存储 sql 编程基础、HTML5 本地地图...

    h5小游戏——收获鱼儿

    HTML5的语法更加简洁明了,引入了许多新的标签,如`&lt;canvas&gt;`、`&lt;audio&gt;`和`&lt;video&gt;`等,这些都为游戏开发提供了便利。在“收获鱼儿”游戏中,`&lt;canvas&gt;`标签尤为重要,它是游戏画面的主要载体,通过JavaScript可以...

    html5基于canvas实现的打碎图片玻璃碎片特效源码.zip

    在本项目中,我们将深入探讨如何利用HTML5的Canvas API来实现一种独特的视觉效果——打碎图片的玻璃碎片特效。Canvas是HTML5中的一个核心特性,它允许我们在网页上进行动态的图形绘制,提供了丰富的绘图方法和事件...

    html5使用canvas绘制孙悟空猴哥来拜年特效源码.zip

    在给定的“html5使用canvas绘制孙悟空猴哥来拜年特效源码.zip”压缩包中,我们可以看到一个利用HTML5的Canvas API来实现的创意动画效果,将中国的经典文化形象——孙悟空与新年庆祝元素结合在一起。 Canvas是HTML5...

    HTML5学习笔记(总结提炼版)——001

    本学习笔记将聚焦于HTML5的基础知识,包括其新特性、元素和最佳实践。 一、HTML5的新特性 1. 语义化标签:HTML5引入了新的语义化标签,如、、、和等,这些标签有助于更好地组织内容,提高可读性和可访问性。 2. ...

    HTML5及CSS3web前端开发技术习题答案解析.pdf

    ### HTML5及CSS3 Web前端开发技术习题答案解析 #### 1. HTML5与HTML4的主要区别及其解决的问题 HTML5与HTML4相比,在Web前端开发领域解决了多个关键问题,主要包括: - **浏览器间的兼容性问题**:早期不同浏览器...

    HTML5+CSS3+JS入门教程 + 源代码 pdf

    1. HTML5的基础语法和新特性:学习如何创建结构化的文档,使用新标签,以及处理多媒体。 2. CSS3的基本选择器、布局模型和动画效果:掌握如何定义样式,实现响应式布局,以及创建动态效果。 3. JavaScript基础:了解...

    HTML5+CSS3 Web前端设计基础教程-PPT.rar

    这篇教程——"HTML5+CSS3 Web前端设计基础教程-PPT",显然是一个旨在帮助初学者和进阶者理解这两种语言基本概念和实践应用的资源。 HTML5(超文本标记语言第五版)是网页内容的结构化标准,它增强了对多媒体的支持...

    HTML语法表 HTML参考文档

    1. **HTML基本结构**:一个HTML文件通常由两部分组成——`&lt;!DOCTYPE html&gt;`声明和HTML标签。`&lt;!DOCTYPE html&gt;`声明告诉浏览器使用哪种HTML版本,而HTML标签则包含`&lt;html&gt;`、`&lt;head&gt;`和`&lt;body&gt;`等元素,分别定义整个...

Global site tag (gtag.js) - Google Analytics