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五子棋
看到一些曾经只会灌水的网友,在学习了前端之后,已经能写出下载量几千几万的脚本.样式,帮助大众,成为受欢迎的人,感觉满羡慕的.我也想学会前端技术,变得受欢迎呀.于是心血来潮,开始学习前端知识,并写下了这 ...
随机推荐
- 关于C#的委托
作者 陈嘉栋(慕容小匹夫) 阅读目录 0x00 前言 0x01 从观察者模式说起 0x02 向Unity3D中的SendMessage和BroadcastMessage说拜拜 0x03 认识回调函数 ...
- Spring 配置自动扫描spring bean配置
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...
- Node.js包(JXcore)
Node.js的代码是开放的,并准备好被复制像任何其他Javascript代码.但现在它不可能的了.JXcore 这是一个开源项目,引入了包装和源文件和其他资源加密成JX包一个独特的功能. 考虑大型项 ...
- Json传递后台数据的问题
在后台我有两个类: public Class Person { private String name; private Address address;//一个自定义的类 //getter和sett ...
- oracle审计
Orcale审计机制研究 1. 设置审计 1.1. 查看审计状态 SQL>conn /as sysdba; 已连接 SQL>show parameters audit_trail; ...
- Entropy (huffman) 优先队列)
http://acm.hdu.edu.cn/showproblem.php?pid=1053 Huffman问题利用STL中的priority_queue解决: #include<stdio.h ...
- awk合并文件一例
群里的朋友求助: $ cat file1a 1 2 3b 2 3 4c 3 4 5 $ cat file2d 你b 好c 吗 合并两个文件,需要实现: a 1 2 3b 2 3 4 好c 3 4 5 ...
- excel时会弹出向程序发送命令时出现问题的提示框
出现此问题需要做两个操作来解决: 1.在开始所有程序中找到Microsoft Excel 2007的运行程序,右键选择属性,在兼容性标签将“以管理员身份运行此程序”的勾去掉. 2.在打开的Excel程 ...
- String拼接也有用加号更好的时候
做String拼接时用StringBuilder(或StringBuffer)好还是直接用+号性能好?一般来说是前者,不过也有用加号略好的时候.首先我一直认为用+号有很好的可读性,而且当String拼 ...
- 在VC中集成cURL
libcurl 库的代码是完全开源的,但是我们一般不会在项目中直接引入它的源代码,而是通过动态链接库隐式链接的方式引入 libcrul 库.也就是说,我们需要在自己的项目中引入 libcrul 相关的 ...