HTML5 Canvas 概述
本文中,我们将探索如何使用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 概述的更多相关文章
- HTML5 程序设计 - 使用HTML5 Canvas API
请你跟着本篇示例代码实现每个示例,30分钟后,你会高喊:“HTML5 Canvas?!在哥面前,那都不是事儿!” 呵呵.不要被滚动条吓到,很多都是代码和图片.我没有分开写,不过上面给大家提供了目录,方 ...
- HTML5中Canvas概述
一.HTML5 Canvas历史 Canvas的概念最初是由苹果公司提出的,用于在Mac OS X WebKit中创建控制板部件(dashboard widget).在Canvas出现之前,开发人员若 ...
- HTML5 Canvas核心技术:图形、动画与游戏开发 PDF扫描版
HTML5 Canvas核心技术:图形.动画与游戏开发 内容简介: <HTML5 Canvas核心技术:图形.动画与游戏开发>中,畅销书作家David Geary(基瑞)先生以实用的范例程 ...
- 赠书:HTML5 Canvas 2d 编程必读的两本经典
赠书:HTML5 Canvas 2d 编程必读的两本经典 这两年多一直在和HTML5 Canvas 打交道,也带领团队开发了世界首款基于HTML5 Canvas 的演示文档工具---AxeSlide( ...
- 如何开发一个简单的HTML5 Canvas 小游戏
原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...
- html5 canvas常用api总结(一)
1.监听浏览器加载事件. window.addEventListener("load",eventWindowLoaded,false); load事件在html页面加载结束时发生 ...
- HTML5 Canvas绘制转盘抽奖
新项目:完整的Canvas转盘抽奖代码 https://github.com/givebest/GB-canvas-turntable 演示 http://blog.givebest.cn/GB-ca ...
- html5 canvas首屏自适应背景动画循环效果代码
模板描述:html5 canvas首屏自适应背景动画循环效果代码 由于动态图太大,怕以后服务器受不了,所以现在都改为静态图了,大家点击演示地址一样的,希望大家喜欢,你们的支持就是小海的动力!! 欢迎大 ...
- 自己写的HTML5 Canvas + Javascript五子棋
看到一些曾经只会灌水的网友,在学习了前端之后,已经能写出下载量几千几万的脚本.样式,帮助大众,成为受欢迎的人,感觉满羡慕的.我也想学会前端技术,变得受欢迎呀.于是心血来潮,开始学习前端知识,并写下了这 ...
随机推荐
- insert 加的锁
?INSERT sets an exclusive lock on the inserted row. This lock is an index-record lock, not a next-ke ...
- Unity NGUI的多分辨率适配
参考链接:http://blog.csdn.net/mfc11/article/details/17681429,作者:CSDN mfc11 1.NGUI默认的适配方式: NGUI默认是适配方式是根据 ...
- 怎么添加项目到SVN上面
一.通过SVN客户端向服务器上面添加项目 1.在服务器上面创建一个文件夹,文件夹以项目名称命名. 2.在合适目录下右击后,点击SVN Checkout,将你在服务器上面创建的目录checkout下来 ...
- ZOJ 3675 Trim the Nails
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4918 DP+状态压缩. http://www.cnblogs.com/dgsr ...
- HDOJ(HDU) 2401 Baskets of Gold Coins(数列、)
Problem Description You are given N baskets of gold coins. The baskets are numbered from 1 to N. In ...
- C++中的类和对象(一)
一,类的概念及封装 1.什么是封装 第一层含义:封装是面向对象程序设计最基本的特性.把数据(属性)和函数(方法)合成一个整体,这在计算机世界中是用类和对象实现的.(把属性和方法进行封装) 第二层含义: ...
- 数位DP初步 bzoj1026 hdu2089 hdu3555
为了搞SCOI的几道题先做水数位.之前听过课,半懂不懂吧,现在清楚了些. 这类题一般满足区间减法,即只需要我们求出(1,n)即可,然后打表也是为了sovle(DataType)服务.先想好怎么计算,再 ...
- 全文检索luncence
检索技术基本原理: 最主要的两点是 1.如何创建索引 2.如何查询. 分析需求: 好几篇文档,从这些文档找关键词,一种方式是顺序一个个遍历,加入这些文档量很多,就花费太长时间了,第二种是建立索引, ...
- C#实现文件数据库
本文转载:http://www.cnblogs.com/gaochundong/archive/2013/04/24/csharp_file_database.html#commentform 本文为 ...
- Linq to sql并发与事务
本文转载:http://www.cnblogs.com/lovecherry/archive/2007/08/20/862365.html 检测并发 首先使用下面的SQL语句查询数据库的产品表: se ...