Visit Mozilla.org

Обучение canvas:Основы

Материал из MDC.


Содержание

[править] Элемент <canvas>

Давайте начнём обучение, взглянув на сам элемент <canvas>.

<canvas id="tutorial" width="150" height="150"></canvas>

Он очень похож на <img>, с той лишь разницей, что не содержит атрибутов src и alt. Элемент <canvas> имеет всего два атрибута - width и height. Оба они не обязательны, и могут быть заданы через свойства DOM. Если ширина и высота не определены, canvas будет создан шириной в 300 пикселей и 150 пикселей высотой. Размер элемента может быть произвольным и задаваться через CSS, но при прорисовке картинка масштабируется в соответствии с компоновкой.
Атрибут id не специфичен для элемента <canvas>, но является одним из атрибутов HTML по умолчанию, и может быть применён почти ко всем элементам HTML (также как class, например). Всегда определять id элемента - хорошая идея, т.к. это значительно упрощает идентификацию его в нашем скрипте.

Стиль элемента <canvas> может настраиваться также, как и нормального изображения (margin, border, background, и т.п.). Эти правила, однако, не влияют на само рисование в canvas. Позже в этой статье вы увидите как это происходит. Если никакие настройки стиля не заданы, canvas будет создан полностью прозрачным.

[править] Аварийное содержимое

В связи с тем, что элемент <canvas> относительно новый, и не реализован в некоторых браузерах (таких как Firefox 1.0 и Internet Explorer), нам необходимо предоставить некое аварийное содержимое элемента, если браузер этот элемент не поддерживает.

Это очень просто: мы всего-лишь предоставляем альтернативное содержимое внутри элемента canvas. Браузеры, не поддерживающие <canvas>, проигнорируют контейнер и обработают аварийное содержимое внутри него. Браузеры же, поддерживающие <canvas>, проигнорируют содержимое контейнера и нормально обработают canvas.

К примеру, мы можем выдать текстовое описание содержимого canvas, либо показать статичную картинку вместо динамически рисуемого содержимого. Это может выглядеть примерно так:

<canvas id="stockGraph" width="150" height="150">
  current stock price: $3.15 +0.15
</canvas>

<canvas id="clock" width="150" height="150">
  <img src="images/clock.png" width="150" height="150" alt=""/>
</canvas>

[править] Необходимость тэга </canvas>

В реализации Apple Safari элемент <canvas> исполнен почти как <img>: он не имеет закрывающего тэга. Однако, для широкого распространения <canvas> в сети, должна быть предоставлена возможность выдачи аварийного содержимого. Следовательно, имплементация Мозиллы требует закрывающий тег (</canvas>).

Если аварийное содержимое не необходимо, простой код <canvas id="foo" ...></canvas> будет полностью совместим и с Safari и с Mozilla. Safari попросту проигнорирует закрывающий тэг.

Если аварийное содержимое желательно, то для сокрытия его в Safari должны быть использованы некоторые CSS хитрости, отображающие только canvas. А также понадобятся новые CSS хитрости, скрывающие предыдущие хитрости от IE (чтобы отобразить аварийный контент).

[править] Контекст отрисовки

<canvas> создаёт поверхность для рисования, предоставляющую один или более контекст отрисовки, который используется для создания отображаемого контента и манипуляций с ним. Мы сфокусируемся на 2D (двухмерном) контексте отрисовки, который на данный момент является единственным определённым контекстом. В будущем другие контексты смогут поддерживать другие типы отрисовки: например, вполне вероятно, что будет добавлен 3D контекст, основанный на OpenGL ES.

<canvas> изначально пустой, и для того, чтобы что-либо отобразить, скрипту необходимо получить контекст отрисовки и рисовать уже на нём. Элемент canvas имеет DOM-метод, называемый getContext, и предназначенный для получения контекста отрисовки вместе с его функциями рисования. getContext() принимает один параметр - тип контекста.

var canvas = document.getElementById('tutorial');
var ctx = canvas.getContext('2d');

Первой строкой мы получаем DOM-узел нашего canvas, используя метод getElementById. А получить доступ к контексту рисования мы можем методом getContext.

[править] Проверка поддержки

Аварийное содержимое отображается браузерами, не поддерживающими <canvas>. Скрипты также могут проверять поддержку во время исполнения. Это легко делается проверкой наличия метода getContext. Наш предыдущий кусочек кода превращается примерно в следующее:

var canvas = document.getElementById('tutorial');
if (canvas.getContext){
  var ctx = canvas.getContext('2d');
  // drawing code here
} else {
  // canvas-unsupported code here
}

[править] Минимальный шаблон

Вот шаблон, который мы будем использовать как отправную точку для последующих примеров. Вы можете загрузить этот файл для работы в вашей системе.

<html>
  <head>
    <title>Canvas tutorial</title>
    <script type="text/javascript">
      function draw(){
        var canvas = document.getElementById('tutorial');
        if (canvas.getContext){
          var ctx = canvas.getContext('2d');
        }
      }
    </script>
    <style type="text/css">
      canvas { border: 1px solid black; }
    </style>
  </head>
  <body onload="draw();">
    <canvas id="tutorial" width="150" height="150"></canvas>
  </body>
</html>

Если вы взглянете на скрипт, то увидите, что я создал функцию draw, которая исполняется один раз, когда загрузка страницы завершена (с помощью атрибута onload в теге body). Эта функция могла бы быть вызвана и через setTimeout, setInterval, или через любой другой обработчик события, лишь бы в момент окончания загрузки.

[править] Простой пример

Для начала, вот простой пример, который рисует два пересекающихся прямоугольника, один из которых имеет альфа-прозрачность. Как это работает мы изучим более детально в последующих примерах.

Simple Example
Simple Example
<html>
 <head>
  <script type="application/x-javascript">
    function draw() {
      var canvas = document.getElementById("canvas");
      if (canvas.getContext) {
        var ctx = canvas.getContext("2d");

        ctx.fillStyle = "rgb(200,0,0)";
        ctx.fillRect (10, 10, 55, 50);

        ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
        ctx.fillRect (30, 30, 55, 50);
      }
    }
  </script>
 </head>
 <body onload="draw();">
   <canvas id="canvas" width="150" height="150"></canvas>
 </body>
</html>