HTML5 Canvas 起步(1) - 基本概念


Posted in HTML / CSS onMay 12, 2009

什么是Canvas

<canvas> 是一个新的 HTML 元素,这个元素在 HTML5 中被定义。这个元素通常可以被用来在 HTML 页面中通过 JavaScript 进行绘制图形、合成图像等等操作,也可以用来做一些动画。当然,目前 HTML5 规范还在草稿阶段,正式发布也许要等到2010年,不过现在已经有不少浏览器已经支持了部分 HTML5 规范。目前支持 canvas 元素的浏览器有 Firefox 3+、Safari 4、Chrome 2.0+ 等,因此,在运行本页中的例子时,请确保你使用的是上述浏览器之一。

尽管在 Mozilla 已经有不少关于 Canvas 的教程,我还是决定把自己的学习过程记录下来。如果觉得我写的不够明白,那么你可以在参考资料中找到 Mozilla 网站上 Canvas 教程的链接。

另外,可以在这里找到一些有趣的 Canvas 示例。

开始使用 Canvas

使用 Canvas 很简单,与使用其他 HTML 元素一样,只需要在页面中添加一个 <canvas> 标签即可:

复制代码
代码如下:

<canvas id="screen" width="400" height="400"></canvas>

当然,这样只是简单的创建了一个 Canvas 对象而已,并没有对它进行任何操作,这个时候的 canvas 元素看上去与 div 元素是没什么区别的,在页面上什么都看不出来:)
另外,canvas 元素的大小可以通过 width 与 height 属性来指定,这与 img 元素有点相似。
Canvas 的核心:Context
前面说到可以通过 JavaScript 来操作 Canvas 对象来进行绘制图形、合成图像等操作,这些操作并不是通过 Canvas 对象本身来进行的,而是通过 Canvas 对象的一个方法 getContext 获取 Canvas 操作上下文来进行。也就是说,在后面我们使用 Canvas 对象的过程中,都是与 Canvas 对象的 Context 打交道,而 Canvas 对象本身可以用来获取 Canvas 对象的大小等信息。
要获取 Canvas 对象的 Context 很简单,直接调用 canvas 元素的 getContext 方法即可,在调用的时候需要传递一个 Context 类型参数,目前可以用的并且是唯一可以用的类型值就是 2d:

提示:您可以先修改部分代码再运行

Firefox 3.0.x 的尴尬

Firefox 3.0.x 虽然支持了 canvas 元素,但是并没有完全按照规范来实现,规范中的 fillText、measureText 两个方法在 Firefox 3.0.x 中被几个 Firefox 特有的方法代替,因此在 Firefox 3.0.x 中使用 Canvas 时需要先 fix 这个几个方法在不同浏览器中的差别。

下面这代码取自 Mozilla Bespin 项目,它修正了 Firefox 3.0.x 中 Canvas 的 Context 对象与 HTML5 规范不一致的地方:


提示:您可以先修改部分代码再运行

注意:到 Opera 9.5 为止,Opera 还不支持 HTML5 规范中 Canvas 对象的 fillText 以及其相关方法和属性。

Hello, Canvas!

在对 Canvas 进行了一些初步了解后,开始来写我们的第一个 Canvas 程序,闻名的 HelloWorld 的又一个分支“Hello, Canvas”:


提示:您可以先修改部分代码再运行

运行示例,Canvas 对象所在区域显示出“Hello, World!”,这正是代码中 ctx.fillText("Hello, World!", 20, 20); 的作用。

fillText 以及相关属性

fillText 方法用来在 Canvas 中显示文字,它可以接受四个参数,其中最后一个是可选的:

void fillText(in DOMString text, in float x, in float y, [Optional] in float maxWidth);

其中 maxWidth 表示显示文字时最大的宽度,可以防止文字溢出,不过我在测试中发现在 Firefox 与 Chomre 中指定了 maxWidth 时也没有任何效果。

在使用 fillText 方法之前,可以通过设置 Context 的 font 属性来调整显示文字的字体,在上面的示例中我使用了“20pt Arial”来作为显示文字的字体,你可以自己设置不同的值来看具体的效果。

结束

暂时就到这里了,我会一边看规范一边写这个系列:)

参考资料

1. HTML5的Canvas,脚本语言的新舞台, hred

2. The Canvas Element, WHATWG

3. Canvas Tutorial 中文, Mozilla

4. Canvas Tutorial 英文, Mozilla

5. canvas support in Opera, Opera

HTML / CSS 相关文章推荐
IE滤镜与CSS3效果(详细整理分享)
Jan 25 HTML / CSS
一款利用html5和css3实现的3D滚动特效的教程
Jan 04 HTML / CSS
使用CSS3制作饼状旋转载入效果的实例
Jun 23 HTML / CSS
CSS3区域模块region相关编写示例
Aug 28 HTML / CSS
CSS3实现曲线阴影和翘边阴影
May 03 HTML / CSS
利用css3画个同心圆示例代码
Jul 03 HTML / CSS
css3 pointer-events 介绍详解
Sep 18 HTML / CSS
10分钟入门CSS3 Animation
Dec 25 HTML / CSS
简单html5代码获取地理位置
Mar 31 HTML / CSS
浅谈html5增强的页面元素
Jun 14 HTML / CSS
移动端Html5页面生成图片解决方案
Aug 07 HTML / CSS
如何解决flex文本溢出问题小结
Jul 15 HTML / CSS
W3C公布最新的HTML5标准草案
Oct 17 #HTML / CSS
HTML5中的新元素介绍
Oct 17 #HTML / CSS
自定义html标记替换html5新增元素
Oct 17 #HTML / CSS
HTML5的结构和语义(1):前言
Oct 17 #HTML / CSS
HTML5的结构和语义(3):语义性的块级元素
Oct 17 #HTML / CSS
HTML5的结构和语义(2):结构
Oct 17 #HTML / CSS
HTML5的结构和语义(4):语义性的内联元素
Oct 17 #HTML / CSS
You might like
php curl基本操作详解
2013/07/23 PHP
php使用curl抓取qq空间的访客信息示例
2014/02/28 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
php实现mysql事务处理的方法
2014/12/25 PHP
php删除文本文件中重复行的方法
2015/04/28 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
JQuery的一些小应用收集
2010/03/27 Javascript
JavaScript prototype属性使用说明
2010/05/13 Javascript
jQuery插件制作之参数用法实例分析
2015/06/01 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
浅谈js中的in-for循环
2016/06/28 Javascript
Javascript从数组中随机取出不同元素的两种方法
2016/09/22 Javascript
jQuery Tree Multiselect使用详解
2017/05/02 jQuery
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
python 排列组合之itertools
2013/03/20 Python
python模拟登录并且保持cookie的方法详解
2017/04/04 Python
Python中垃圾回收和del语句详解
2018/11/15 Python
python 多个参数不为空校验方法
2019/02/14 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
如何设置PyCharm中的Python代码模版(推荐)
2020/11/20 Python
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
美国在线印刷公司:PsPrint
2017/10/12 全球购物
玉兰油美国官网:OLAY美国
2018/10/25 全球购物
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
狼和鹿教学反思
2014/02/05 职场文书
民生工程实施方案
2014/03/22 职场文书
学校标语大全
2014/06/19 职场文书
2014年服务员工作总结
2014/11/18 职场文书
新入职员工工作总结
2015/10/15 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
Python实战之实现康威生命游戏
2021/04/26 Python