第一章 基础知识

第一节 canvas元素

    HTML代码很直白,没有什么有趣的地方。与大多数基于Canvas的应用程序一样,其中真正有趣的地方在于JavaScript代码。图1-2中所示应用程序的JavaScript代码,列在了程序清单1-2之中。

    程序清单1-2 example.js

    var canvas = document.getElementById('canvas'),

    context = canvas.getContext('2d');

    context.font = '38pt Arial';

    context.fillStyle = 'cornflowerblue';

    context.strokeStyle = 'blue';

    context.fillText('Hello Canvas',canvas.width/2 - 150,

                                    canvas.height/2 + 15);

    context.strokeText('Hello Canvas',canvas.width/2 - 150,

                                  canvas.height/2 + 15);

    程序清单1-2中的JavaScript代码采用了一个诀窍,在开发基于Canvas的应用程序时也可以这样做:

    (1)使用document.getElementById()方法来获取指向canvas的引用。

    (2)在canvas对象上调用getContext('2d')方法,获取绘图环境变量(注意,“2d”中的“d”必须小写)。

    (3)使用绘图环境对象在canvas元素上进行绘制。

    在获取了canvas的绘图环境对象之后,这段JavaScript代码设置了环境对象的font、fillStyle、strokeStyle等属性,然后对文本进行了填充及描边操作,于是就产生了图1-2中所示效果。fillText()方法使用fillStyle属性来填充文本中的字符,strokeText()方法则使用strokeStyle属性来描绘字符的轮廓线。fillStyle与strokeStyle属性可以是CSS格式的颜色、渐变色或是图案。在1.2.1小节之中,我们会简单地讨论一下这些属性,然后在第2章中会深入地讲解以上的属性与方法。

    fillText()与strokeText() 都需要3个参数:要绘制的文本内容,以及在canvas中显示文本的横、纵坐标。程序清单1-2中的JavaScript代码,使用了常量来将文本近似地对齐在canvas的中心点。这么做可以在canvas中实现文本居中,但却不是一个良好的通用方案。在第3章中,我们将会看到有一种更好的办法可以用于居中文本。

    警告:在设置canvas的宽度与高度时,不能使用px后缀

    虽说支持Canvas的浏览器普遍都允许在设定canvas元素的width与height属性时使用px后缀,但是,这么做从技术上来说是不被Canvas规范所接受的。根据规范书,这些属性的取值,只能是非负整数。

    提示:默认的canvas元素大小是300×150个屏幕像素

    在默认情况下,浏览器所创建的canvas元素是300像素宽、150像素高。可以通过指定width与height属性值而修改canvas元素的大小。

    还可以通过CSS属性来改变canvas元素的大小,不过,在下一小节中将会讲到,通过那种方式来修改canvas元素的宽度与高度,可能会产生意外的后果。

    1.1.1 canvas元素的大小与绘图表面的大小

    前一小节中的那段应用程序代码是通过设置canvas元素的width与height属性,来改变元素大小的。也可以像程序清单1-3那样,通过CSS来设置canvas元素的大小。不过,使用CSS设置canvas元素的效果,与通过width、height属性值来设定,并不一样。

    程序清单1-3 使用不同的值来设置元素大小与绘图表面大小

<!DOCTYPE html>

   <head>

     <title>Canvas element size: 600 x 300,

            Canvas drawing surface size: 300 x 150</title>

      <style>

         body {

            background: #dddddd;

         }

         #canvas {

            margin: 20px;

            padding: 20px;

            background: #ffffff;

            border: thin inset #aaaaaa;

            width: 600px;

            height: 300px;

         }

      </style>

   </head>

  <body>

    <canvas id='canvas'>

      Canvas not supported

    </canvas>

    <script src='example.js'></script>

  </body>

</html>