本文中,我们将探索如何使用HTML5的Canvas API.Canvas API很酷,我们可以通过它来动态创建生成和展示图形,图表,图像以及动画。本文将使用渲染API(rendering API)的基本功能来创建一副可以放大放小并自适应浏览器环境的图。还会演示如何基于用户输入来动态创建图像,生成热点图。当然我也会提醒你在HTML5 Canvas 时需要注意的问题,并且分享解决这些问题的方法。

  一,HTML5概述

   1.1.历史

Canvas的概念最初是由苹果公司提出的,用在Mac OS X Webkit中创建控制板部件(dashboard widget)。在Canvas出现之前,开发人员要在浏览器中使用绘图API,只能使用Adobe的Flash和SVG(Scalable Vector Graphics,可伸缩矢量图形)插件,或者只有IE才支持的VML(Vector Markup Language,矢量标记语言),以及其他一些稀奇古怪的JavaScript技巧。

假如我们要在没有canvas元素的条件下绘制一条对角线——听起来视乎很简单,但是实际上如果没有一套二维绘图API的话,这会是一项相当复杂的工作。HTML5 Canvas能够提供这样的功能对浏览器端来说此功能非常有用,因此Canvas被纳入了HTML5规范。

                                                   SVG和Canvas对比                                                          

Canvas本质上是一个位图画布,其上绘制的图形是不可缩放的,不能像SVG图像那样可以被放大放小。此外,用Canvas绘制出来的对象不属于页面DOM结构或者任何命名空间——这一点被认为是一个缺陷。SVG图像却可以在不同分辨率下流畅地缩放,并且支持单击检测(能检测到鼠标单击了图像上的那个点)。

既然如此,为什么WHATWG的HTML5规范不使用SVG呢?尽管Canvas有明显的不足,但HTML Canvas API有两方面优势可以弥补:首先,不需要将所绘制图像中的每个图元当做对象存储,因此执行性能非常好;其次,在其他编程语言现有的优秀二绘图API的基础上实现Canvas API相对来说简单。毕竟,二鸟在林不如一鸟在手。

1.2. Canvas是什么?

在网页上使用Canvas元素时,它会创建一块矩形区域。默认情况下该矩形区域宽为300像素,高为150像素,但也可以自定义具体的大小或者设置Canvas的其他特性。

如下代码清单是最基本的canvas元素。和平时我们写的html元素一样定义,<canvas></canvas>

在页面中加入canvas元素后,我们可以通过JavaScript来自由的控制它。可以在其中添加图片,线条以及文字,也可以在里面绘图,甚至可以加入高级动画。

大多数主流操作系统和框架支持的二维绘制操作,HTML5 Canvas API都支持。如果你在近年来曾经有过二维图像编程经验,那么会对HTML5 Canva API感觉非常顺手,因为这个API就是参加既有系统设计的。如果没有这方面经验,则会发现与这么多年来一直使用的图片加CSS开发Web图形的方式比起来,Canvas的渲染系统有多么强大。
   使用canvas编程,首先要将获取其上下文(context)。接着在上下文中执行动作,最后将这些动作应用到上下文中。可以将canvas的这种编辑方式想象成为数据库事物:开发人员先发起一个事物,然后执行某些操作,最后提交事物。

 1.3.Canvas坐标

canvas中的坐标是从左上角开始的,X轴沿着水平方向(按像素)向右延伸,y轴沿着垂直方向向下延伸。左上角坐标为x=0,y=0的点称作远点。

1.4.什么情况下不用Canvas

尽管canvas元素功能非常强大,用处也很多,但在某些情况下,如果其他元素已经不够用了,就不应该再使用canvas元素,例如,用canvas元素在html页面中动态绘制所有不同的表头,就不如直接使用标题样式的标签(H1,H2等),它们所实现的效果是一样的。

 1.5.替代内容

访问页面的时候,如果浏览器不支持canvas元素,或者不支持html5 Canvas API中的某些特性,那么开发人员最好提供一份替代代码。例如,开发人员可以通过一张替代图片或者一些说明性文字告诉访问者,使用最新的浏览器可以获得更佳的浏览效果。如下代码实例:

<canvas>
Update your browser to enjoy canvas!
<canvas>

当然,除了上面代码中的文本外,同样还可以使用图片,不论是文本还是图片都会在浏览器不支持canvas元素的情况下显示出来。

canvas元素的可访问性怎么样 ? 

"提供替代图像或者替代文本引出了可访问性这个话题——很遗憾,这是对HTML5Canvas规范中明显的缺陷。例如,没有一种原生态方法能够自动为已插入到canvas中的图片生成于替换的文字说明。同样,也没有原生方法可以生成替代蚊子以匹配由canvas Text API动态生成的文字。

关于如何处理可替代且可访问Canvas内容,HTML5设计者的当前提议之一是使用前述的备用内容部分。不过,为了让Canvas的备用内容对屏幕阅读器和其他科访问性工具也有用处,它要能够支持键盘导航,即便是在浏览器支持Canvas且可正常显示的情况下 也是如此。尽管一些现代浏览器已经支持这项功能,但你不应该依赖于浏览器来支持用户的特殊需求。现阶段,我们推荐使用页面上独立部分来展现canvas的替代内容。还有一个额外因素,许多用户可能喜欢使用替代的控件或者期望一种更好的展示方式,以便他们可以快速理解和操作页面或者应用。

Canvas API的未来迭代中,可能会包含与canvas显示相关的可聚焦的子区域以及它们之间的交互控制。但是,如果你的图像显示需要显著的交互行为,那么可以考虑使用SVG代替canvas API。SVG也能用于绘制,而且它整合了浏览器的DOM。

 1.6.CSS和canvas

同大多数HTML元素一样,canvas元素也可以通过应用CSS的方式来增加边框,设置内边距,外边距等,而且一些CSS属性还可以被canvas内的元素继承。比如字体样式,在canvas内添加的文字,其样式默认同canvas元素本身是一样的。

此外,在canvas中为context设置属性同样要遵从CSS的语法。例如,对context应用颜色和字体样式,跟在任何html和css文档中使用的语法完全一样。

1.7.浏览器对HTML5 Canvas的支持情况

随着IE9的到来,所有浏览器厂商现在读提供了对HTML5 Canvas的支持,而且它已被大多数用户所掌握。这是Web开发史上的一个重要里程碑,它使得2D绘图在现代网络上蓬勃发展。

尽管旧版本IE占有的市场份额正在缩小,但在使用Canvas API之前,我们还是应该首先检测当前浏览器是否支持html5 canvas。接下来就会讲到如何编程检测浏览器支持情况。

 二  使用HTML5 Canvas API

 三  使用HTML5 Canvas 创建应用

HTML5 Canvas 概述的更多相关文章

  1. HTML5 程序设计 - 使用HTML5 Canvas API

    请你跟着本篇示例代码实现每个示例,30分钟后,你会高喊:“HTML5 Canvas?!在哥面前,那都不是事儿!” 呵呵.不要被滚动条吓到,很多都是代码和图片.我没有分开写,不过上面给大家提供了目录,方 ...

  2. HTML5中Canvas概述

    一.HTML5 Canvas历史 Canvas的概念最初是由苹果公司提出的,用于在Mac OS X WebKit中创建控制板部件(dashboard widget).在Canvas出现之前,开发人员若 ...

  3. HTML5 Canvas核心技术:图形、动画与游戏开发 PDF扫描版​

    HTML5 Canvas核心技术:图形.动画与游戏开发 内容简介: <HTML5 Canvas核心技术:图形.动画与游戏开发>中,畅销书作家David Geary(基瑞)先生以实用的范例程 ...

  4. 赠书:HTML5 Canvas 2d 编程必读的两本经典

    赠书:HTML5 Canvas 2d 编程必读的两本经典 这两年多一直在和HTML5 Canvas 打交道,也带领团队开发了世界首款基于HTML5 Canvas 的演示文档工具---AxeSlide( ...

  5. 如何开发一个简单的HTML5 Canvas 小游戏

    原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...

  6. html5 canvas常用api总结(一)

    1.监听浏览器加载事件. window.addEventListener("load",eventWindowLoaded,false); load事件在html页面加载结束时发生 ...

  7. HTML5 Canvas绘制转盘抽奖

    新项目:完整的Canvas转盘抽奖代码 https://github.com/givebest/GB-canvas-turntable 演示 http://blog.givebest.cn/GB-ca ...

  8. html5 canvas首屏自适应背景动画循环效果代码

    模板描述:html5 canvas首屏自适应背景动画循环效果代码 由于动态图太大,怕以后服务器受不了,所以现在都改为静态图了,大家点击演示地址一样的,希望大家喜欢,你们的支持就是小海的动力!! 欢迎大 ...

  9. 自己写的HTML5 Canvas + Javascript五子棋

    看到一些曾经只会灌水的网友,在学习了前端之后,已经能写出下载量几千几万的脚本.样式,帮助大众,成为受欢迎的人,感觉满羡慕的.我也想学会前端技术,变得受欢迎呀.于是心血来潮,开始学习前端知识,并写下了这 ...

随机推荐

  1. Unity问答——请教一下NGUI的图片转换问题

    这篇博客源自我在泰课在线的回答.链接:http://www.taikr.com/group/1/thread/92 问:请教一下NGUI的图片转换问题 1.NGUI能不能把导入的方形图片转成圆形的(因 ...

  2. js 外部文件加载处理

    概述 前端在日常工作中很大一部分时间是在思考页面的优化方案,让页面载入得更快.鉴于javascript是单线程的事件驱动语言,优化工作之一就是:控制图片.swf.iframe等大流量文件以及js和cs ...

  3. The Child and Sequence

    Codeforces Round #250 (Div. 1)D:http://codeforces.com/problemset/problem/438/D 题意:给你一个序列,然后有3种操作 1x ...

  4. ios入门之c语言篇——基本函数——3——判断日期是一年的第几天

    3.判断日期是一年的第几天 参数返回值解析: 参数: y:int,年份: m:int,月份 d:int,日期 返回值: sum:传入日期是当年的第几天: 函数解析: leapyear(y);判断y是不 ...

  5. redis数据过期策略【转】

    key的过期时间通常,Redis key被创建时不会自动关联过期时间,key将长久存在,除非通过DEL等命令显示的删除.EXPIRE命令簇可以为指定的key关联一个过期时间,代价是一点额外的内存开销. ...

  6. SendMessage和PostMessage区别以及WPARAM 和 LPARAM区别

    WPARAM 和 LPARAM wParam和lParam 这两个是Win16系统遗留下来的产物,在Win16API中WndProc有两个参数:一个是WORD类型的16位整型变量:另一个是LONG类型 ...

  7. (转载)教你在PHP中使用全局变量

    (转载)http://www.chinaz.com/program/2009/0123/64261.shtml 即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你 ...

  8. Rotation Lock Puzzle

    Problem Description Alice was felling into a cave. She found a strange door with a number square mat ...

  9. HDOJ 2056 Rectangles

    Problem Description Given two rectangles and the coordinates of two points on the diagonals of each ...

  10. lightoj 1013 dp

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1013 #include <cstdio> #include <cst ...