SkyWorld

Just do what you want
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

HTML5学习笔记(2)——canvas渐变

Posted on 2011-09-24 02:17  SkyWorld  阅读(8058)  评论(3编辑  收藏  举报

  HTML4中绘制一个渐变图形并不是一件很容易的事情,往往需要通过大量的JS代码来实现,或者我们会做一张渐变图片通过平铺的方式在实现渐变。前者需要写大量的JS代码,而后者会降低网页的加载速度,那么我们有没有一种更好地方式来实现网页渐变的效果呢?在HTML4中,我们似乎找不到更好的方法了。

  但是,在HTML5中的canvas属性却为我们提供了很好的解决方案,利用canvas在Javascript中一些接口,我们可以很轻易的做出我们想要的渐变效果。

  在HTML5中主要有两种渐变方式,一种是沿着直线的渐变方式,我们称之为线性渐变;另一种是从一个点或圆沿着一个圆的半径向四周渐变的方式,我们称之为径向渐变。

  下面分别来介绍这两种的渐变方式。

  1.线性渐变

  在HTML5中,有关于线性渐变的最主要的函数是createLinearGradient(x0,y0,x1,y1) ;

  createLinearGradient(x0,y0,x1,y1)    创建一个沿直线从(x0,y0)到(x1,y1)进行渐变

  我们可以利用createLinearGradient来创建一个线性渐变,我们来指定这个渐变的宽度为400像素,那么我们可以用如下的方式创建:

var a_canvas = document.getElementById("a");    //获取canvas元素节点
var context = a_canvas.getContext("2d"); //设置canvas元素节点
var my_gradient = createLinearGradient(0,0,400,0); //创建一个线性渐变

  由于点(0,0)到点(400,0)是从左到右的,所以我们创建的渐变也会沿水平从左到右。

  有了一个渐变对象之后,我们就需要定义渐变的颜色了,定义渐变的函数有addColor(per,color);

  addColor(per,color);   定义一个渐变颜色, per表示开始渐变位置占渐变区域大小的百分比,为0-1之间的任意值,color为颜色样式。

  那么接下来,我们定义两个渐变颜色,使得渐变区域从黄色到红色进行渐变,代码如下:

my_gradient.addColorStop(0,"#ff0");    //定义黄色渐变色
my_gradient.addColorStop(1,"#f00"); //定义红色渐变色

  定义完了以后,这些渐变信息都只是存在了内存当中,并没有在canvas中显示出来,要让渐变产生实际的效果,我们需要设置canvas内容的fillStyle为当前的渐变对象,并且绘制这个图形,比如一个矩形或者一条直线。所以,为了看到渐变效果,我们还需要以下代码:

context.fillStyle = my_gradient;     //设置fillStyle为当前的渐变对象
context.fillRect(0,0,400,300); //绘制渐变图形

  那么至此,一个线性渐变的图形便绘制出来了,在chrome中运行的结果如下:

  假如你想实现一个上下的线性渐变的效果,那么你应该在调用createLinearGradient(x0,y0,x1,y1) 创建渐变的时候保证点(x0,y0),点(x1,y1)连成的直线为竖直直线,也就是x0=x1。当然你也可以实现对角线渐变的效果,只要(x0,y0) (x1,y1)组成一条对角线就可以了。创建上下渐变和对角线渐变的代码如下:

var my_gradient = context.createLinearGradient(0,0,0,300);    // 创建上下渐变
var my_gradient = context.createLinearGradient(0,0,0,300); // 创建对角线渐变


  2.径向渐变

  在HTML5中,有关于线性渐变的最主要的函数是createRadiaGradient(x0,y0,r0,x1,y1,r1);

  createRadiaGradient(x0,y0,r0,x1,y1,r1)    创建一个沿两个圆之间的锥面绘制渐变。前三个参数代表一个圆心为(x0,y0)半径为r0的开始圆,后三个参数代表圆心为(x1,y1)半径为r1的结束圆。

  首先我们可以利用createLinearGradient来创建一个线性渐变,我们来指定这个渐变的宽度为400像素,那么我们可以用如下的方式创建:

var b_canvas = document.getElementById("b");     //获取canvas元素节点
context = b_canvas.getContext("2d"); //设置canvas元素节点
//
创建一个径向渐变,从圆心为(160,120)半径为20的圆周开始沿着半径向圆心为(160120)半径为200的圆周进行径向渐变
my_gradient= context.createRadialGradient(160,120,20, 160,120,200);

  创建完了之后,和线性渐变一样,我们同样需要定义渐变颜色,这一点和线性渐变毫无区别,比如,我们分别定义红色渐变色和蓝色渐变色:

my_gradient.addColorStop(0, "#f00");    //定义红色渐变色
my_gradient.addColorStop(1, "#00f"); //定义蓝色渐变色

  同样地,定义完了以后,这些渐变信息都只是存在了内存当中,并没有在canvas中显示出来,要让渐变产生实际的效果,我们需要设置canvas内容的fillStyle为当前的渐变对象,并且绘制这个图形,比如一个矩形,代码如下:

context.fillStyle = my_gradient;     //设置fillStyle为当前的渐变对象
context.fillRect(0,0,400,300); //绘制渐变图形

  至此,一个径向渐变的图形便绘制出来了,在chrome中运行的结果如下:

  到此为止,HTML5当中的两种基本的渐变方式就给大家介绍完了。

  demo演示地址:http://xiaowu.shnow.cn/html5/note2/index.html


  后话:国内关于html5的技术文档真的少的可怜,html5在中国的发展,离不开广大的技术爱好者的支持,另外给出一份我个人觉得不错的html5技术文档,这份文档来自what官方网站,全面系统的介绍了html5的标准 http://www.whatwg.org/specs/web-apps/current-work/multipage/