Infinity World
Web开发之路
rss
email
新浪微博
腾讯微博
  • Home
  • About

Pro HTML5 Programming-Note(2)

0 人发表意见
发布于 十一月 27 2011

Chapter 2, Canvas

Canvas是一个位图画布, 最早由Apple公司提出, 由于这种二维绘图API对浏览器来说非常有用, 所以后来被纳入到HTML5规范.

使用Canvas后可以避免对Flash和SVG插件的依赖, 也不用只有IE支持的VML, 并且使用Canvas不需要将所有图元当作对象储存, 因此性能上也是非常不错的.

目前主流的浏览器都已经支持Canvas,IE也在IE9版本中加入了对Canvas的支持,但是对现存浏览器也不用担心,使用浏览器检测就可以做到简单的fallback。

那么Canvas怎么用呢?首先在HTML中添加Canvas标签,通过js获取到Canvas对象及其上下文(context)。接着就是调用Canvas的API啦,个人感觉还是听强大的,当年虽然玩了一些MFC的绘图API,但是那种C++的偏底层的API确实用起来感觉很麻烦。

2维的绘图能干什么呢?画直线,画曲线、椭圆、矩形啥都能画,并且样式上是用标准的CSS的,还支持CSS3的样式(如渐变、透明度等效果),并且可以显示文本和贴图。所以Canvas能做到的事情非常多,这也是为什么现在移动终端做游戏的首选吧~(PC 端的情况也一样,Web Game有着跨平台的优势,并且开发成本也相对较低)。

Canvas的实质?还记得上面说的“使用Canvas不需要将所有图元当作对象储存”吗?使用Canvas时,我们实际要操作的是其上下文(context),通过document.querySelector('canvas').getContext("2d");获得。接着在上下文中执行动作,最后将这些动作应用到上下文中。有句话说的非常好:“可以将canvas的这种编辑方式想象为数据库事务:开发人员先发起一个事务,然后执行某些操作,最后提交事务”。比较具体一点的例子可以这样解释:需要画一个圆时,我会这样:

context.arc(centerX,centerY,radius,0,2*Math.PI,false);

当我使用context.fill()方法时,要画出的圆会直接显示在画布上,而看不到画出圆的轨迹。

那么如何做出动画效果呢?无非就是对canvas进行重绘(设置定时器),控制动画帧的速度,达到效果与性能的平衡,另外对于性能的优化,可以对最小区域进行局部重绘,具体内容本文不予深入讨论。

讲了这么多写个小Demo看看:

demo的效果如图所示,画了一个简单的五角星。涉及到了几个常用的API而已,为了通用性,我把它实现为绘制多角形的函数微笑

star

说下大概的框架代码:

// 保存上下文
context.save();
// 移动原点
context.translate(offsetX, offsetY);
// 以原点为起点,开始绘制
context.beginPath();
// do something
context.moveTo(posX, posY);
context.lineTo(desX, desY);
context.stroke();
// 恢复上下文
context.restore();

上述代码只是画了一条线段,如果要画一个封闭的图形,需要在画到最后一个点后使用closePath方法达到图形的闭合。为了获得更好的效果可以设置strokeStyle和fillStyle进行CSS样式设置,注意只有当对路径应用绘制(stroke)或填充(fill)时,才会显示出效果。

至于上面讲到的变换,即translate、scale等方法,可以做到平移、旋转和缩放。是否担心性能问题?Don't worry about it.就算不显式调用,渲染引擎还是会隐式调用的。而且经常通过平移坐标原点比起moveTo的方法会使得代码更具阅读性,至于你怎么选择,反正我是这么做了: )

最后值得需要注意的地方时关于绘制图片,建议使用:

var img = new Image();
img.src = "img.png";
img.onload = function(){
    //do somgthing..
}

保证图片加载后再绘制到canvas中,否则图片会显示不出来。

See also:

1. https://developer.mozilla.org/en/Canvas_tutorial


标签: HTML5 Canvas 
文章类别: HTML5 

Pro HTML5 Programming-Note(1)

0 人发表意见
发布于 九月 12 2011

最近开始看<HTML5高级程序设计>这本书,感觉不错推荐对HTML5感兴趣的童鞋看~这本书虽然不厚,只有200多页,但是内容比较丰富,所以想看几个章节就做一点记录,因此这里就当这本书的读书笔记吧。

入正题。Chapter 1是HTML5的概述,主要介绍HTML5的历史、一些新功能等。简单梳理一下吧,以下特性的demo都已在IE9、FF5、Chrome中测试通过:

新的DOCTYPE和字符集

以后HTML文件只要在文件头部这样写就可以了:

<!DOCTYPE html>
<meta charset="utf-8">
...

新元素和旧元素

主要就是<audio><video><canvas>等新元素的出现,向<font><big>这些行内设样式的标记元素HTML5已经移出,鼓励使用CSS完成这方面的工作。

语义化标记

<header><footer><section><article><aside><nav>,对搜索引擎更友好。

Selectors API

在获取DOM元素的时候,现在可以使用querySelector()和querySelectorAll()方法啦,使用和jQuery选择器的方法差不多,支持CSS的选择规则,并且支持伪类选择,还支持属性和层次的随意组合,看来可以告别以前对第三方库的依赖了~由于这些方法是浏览器原生支持,相信性能上也会比jQuery这类库更高效。但是与jQuery的使用一样,使用不同规则选取同一个元素的性能可能也有所差别,具体的性能分析有空再研究一下,不过可以肯定的是新的querySelector方法是比以前的getElementsByTagName之类的方法高效的,有兴趣可以参考这篇文章。

window.JSON

在以前把字符串序列化成DOM对象或是将DOM对象转换为字符串需要JavaScript的库(可以在http://json.org/获得),但是JavaScript的效率肯定木有浏览器原生支持的高啊。现在就开始可以使用浏览器原生window.JSON对象的方法啦,其实也就两个方法stringify()和parse()。这种本地化JSON对象的支持已经被纳入了ECMAScript5标准。为了方便测试,自己写了个小demo,放在JSFiddle(顺便说一下JSFiddle是个很好的online debug环境,一些小demo放在上面很合适)。

DOM Level 3

包括重要的addEventListener()和dispatchEvent()方法,要知道以前的IE是那样的倔强,但是IE9终于屈服了,对DOM Level 2和DOM Level 3的特性开始支持。几个简单的example在MDN上可以找到。

结语

ok,说了这么多,无非想说在这些新特性在规范化、标准化的同时,我们可以开始做一些实践性的尝试,并且把IE6/7/8消灭掉。虽然IE9或者明年的IE10可能还是存在许多令人头痛的问题,但是离Web标准化还是更近了一步。


标签: HTML5 
文章类别: HTML5 

推荐一款查看Chrome插件信息的插件

0 人发表意见
发布于 九月 11 2011
对于一个Chrome的用户而言,插件的安装是必不可少的,可以通过Chrome应用商店(WebStore)来安装方便自己平时浏览网页的扩展应用。

但是,有木有想过,你对这些应用到底了解多少呢?虽然每次在安装前会提示该插件会需要你的某些相关数据权限,但是一般用户不会想太多,或者想了一些也不知道会有什么问题,就继续安装了。其实也不是说WebStore上有多少危险的插件,但是对于好奇的你,会不会想知道这个会下载并安装到你的Chrome的xxx.crx中,到底打包了什么呢? (..更多内容)

标签: Chrome 
文章类别: 软件&插件 

关于这里的前前后后

0 人发表意见
发布于 九月 8 2011
搭建这个blog是我最费劲的一次,却也是最有收获的一次。也是由于上述原因,我想整理一下这段过程,也算给有兴趣的童鞋一点参考。

首先说一下几个关键的概念...

GAE..

Micolog

Domain..

More.. (..更多内容)

标签: GAE Python 
文章类别: GAE 

初识Backbone.js

0 人发表意见
发布于 九月 4 2011
起因

平时在写js的时候,经常是用jQuery将页面逻辑从头写到尾,链式操作就已经加大了后期维护的难度,到处散落的DOM数据与事件绑定也大大地复杂化了页面的逻辑,最后炮制了一份意大利面条式的代码

介于以前一个项目的现状,这次在做新项目的时候就更多的考虑了以后的规划,根据需要,MVC的架构是必须的,但是有无必要自己再实现一个呢?答案是开源的世界很丰富,这种想法早就已经被别人实现了,而且还实现的很漂亮。这个时候我接触到了Backbone.js,并且开始研究与使用。插一句,豆瓣说也用到了这个js库,至于豆瓣说的前端架构,会在以后的文章中分析。 (..更多内容)

标签: Backbone  JavaScript 
文章类别: JavaScript 


About Me

  • myself
  • 80后IT男
  • Web Front-end Developer
  • Work in Tencent IM Department

Popular Posts

  • 初识Backbone.js(394)
  • 关于这里的前前后后(235)
  • 推荐一款查看Chrome插件信息的插件(188)
  • Pro HTML5 Programming-Note(1)(143)
  • Pro HTML5 Programming-Note(2)(111)

Recent Posts

  • Pro HTML5 Programming-Note(2)
  • Pro HTML5 Programming-Note(1)
  • 推荐一款查看Chrome插件信息的插件
  • 关于这里的前前后后
  • 初识Backbone.js

Recent Comments

Categories

  • JavaScript(1)
  • HTML5(2)
  • GAE(1)
  • 软件&插件(1)

Archives

  • November 2011(1)
  • September 2011(4)

友情链接

  • elseif
  • 時計坂一刻館三号室

由 Google App Engine 提供支持 & Micolog | Designed by WebTreats
COPYRIGHT © 2011, biqing kwok. ALL RIGHTS RESERVED.