HTML5 Canvas: первое знакомство

HTML5 Canvas: первое знакомство

Сегодня я хотел бы начать рассмотрение HTML5 canvas — встроенной возможности современных браузеров для работы с растровой графикой.

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

В этой статье я расскажу, что такое canvas, как он работает, и покажу как рисовать простые фигуры, менять цвета и стирать нарисованное. 

Поддержка браузерами

Все современных браузеры, включаю Internet Explorer 9, поддерживают canvas:

  • Internet Explorer 9.0+;
  • Safari 3.0+;
  • Firefox 3.0+;
  • Chrome 3.0+;
  • Opera 10.0+;
  • iOS 1.0+;
  • Android 1.0+.

Стоит заметить, что основную функциональность canvas можно использовать и в IE 8 и младше с помощью плагина Explorer Canvas.

Архитектура canvas

С одной стороны, canvas это всего лишь HTML5 тег с указанными размерами и каким-то id (для обращения к элементу в дальнейшем):

<canvas id="canvas" width="500" height="500">
Здесь можно указать сообщение для тех,
у кого не поддерживается canvas
</canvas>

После этого вы получите место (прозрачный холст) указанных размеров на странице, в котором в дальнейшем можно будет что-то рисовать. Обратите внимание, что указывать размеры canvas необходимо через аттрибуты тега width и height. Если вы укажите размеры через CSS, то пропорции элементов внутри canvas будут искажены.

С другой стороны, указанный тег — только часть технологии. Все операции происходят в так называемом двумерном контексте (2D Rendering Context), который содержится в каждом теге <canvas>. По сути, двумерный контекст — это прямоугольная система координат:

Двумерный контекст (2D rendering context) в HTML5 context

Единица измерения — один пиксел. Для работы с двумерным контекстом, и, соответсвенно, выполнения операций по рисованию, необходим JavaScript.

Начало работы

Для начала нам необходимо подключить плагин Explorer Canvas для IE < 9. Затем, когда загрузился DOM, необходимо определить двумерный контекст:

<body onload="startCanvas();">
<canvas id="canvas" width="500" height="500"></canvas>

<!-- Подключаем excanvas.js для IE < 9 -->
<!--[if lt IE 9]><script src="excanvas.js"></script><![endif]-->
<script>
var G_vmlCanvasManager;

function startCanvas() {
var canvas = document.getElementById('canvas');

// Проверяем для IE
if (G_vmlCanvasManager != undefined)
G_vmlCanvasManager.initElement(canvas);

// Проверяем понимает ли браузер canvas
if (canvas.getContext) {
var ctx = canvas.getContext('2d'); // Получаем 2D контекст

// Ниже выполняем рисование
}
}
</script>
</body>

Ну вот, теперь можно и рисовать!

Рисование с помощью canvas

Настройки цвета и размера

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

По умолчания canvas рисует и заливает черным цветом. За цвет и стиль обводки отвечает strokeStyle, а за заливку — fillStyle. Давайте укажем, что мы хотим красный цвет (#FF0000) и толщину в 3 пиксела для обводки и зеленый цвет (#00FF00) для заливки:

ctx.strokeStyle = '#FF0000'; // Цвет обводки
ctx.lineWidth = 3; // Ширина линии
ctx.fillStyle = '#00FF00'; // Цвет заливки
Прямоугольники

В canvas есть два вида прямоугольников — залитые и незалитые (обводка). Залитый прямоугольник рисуется с помощью метода fillRect(x, y, width, height):

ctx.fillRect(10, 10, 200, 100);

А незалитый — strokeRect(x, y, width, height):

ctx.strokeRect(220, 120, 100, 50);
Линии

В canvas можно рисовать не только прямые линии, но и изогнутые, окружности и так далее. Замкнутые линии можно заливать цветом.

В отличии от рисования прямоугольников, рисование линий это не одна команда, а их последовательность. Так, сначала надо объявить начало новой линии с помощью beginPath(), а в конце сказать от том, что рисование линии заканчивается с помощью closePath().

У каждого отрезка линии есть начало и конец. Давайте нарисуем ломаную, состоящую из двух отрезков:

ctx.beginPath();
ctx.moveTo(10, 10); // Начало линии
ctx.lineTo(100, 100); // Узел линии
ctx.lineTo(150, 100); // Конец линии
ctx.closePath();

Теперь перейдем к полигонам.

Полигоны

Полигон — замкнутый набор отрезков. Попробуем нарисовать и залить цветом прямоугольный треугольник (с помощью команды fill()):

ctx.beginPath();  
ctx.moveTo(50, 50);
ctx.lineTo(50, 250);
ctx.lineTo(250, 250);
ctx.closePath();
ctx.fill();
Окружности

Окружности рисуются с помощью команды arc(ox, oy, radius, startAngle, endAngle, antiClockWise), где ox и oy — координаты центра, radius — радиус окружности, startAngle и endAngle — начальный и конечный углы (в радианах) для отрисовки окружности, а antiClockWise — направление движения при отрисовке (true для против часовой стрелке, false — против). Нетрудно сделать вывод, что с помощью arc() можно рисовать как круги и окружности, так и дуги и части окружности.

Давайте сделаем сначала окружность радиуса 100 пикселов:

cxt.beginPath();  
ctx.arc(250, 250, 100, 0, Math.PI * 2, false);
ctx.closePath();

А потом круг радиусом 120 пикселов:

cxt.beginPath();  
ctx.arc(250, 250, 120, 0, Math.PI * 2, false);
ctx.closePath();
ctx.fill(); // Заливка окружности
Очистка canvas

Очистить весь холст или его часть можно с помощью команды clearRect(x, y, width, height), указав нужные размеры и положение очищаемой области:

ctx.clearRect(10, 10, 200, 200); // Очистка области указанного размера и положения
ctx.clearRect(0, 0, canvas.width, canvas.height); // Очиста всего холста

 

На этом на сегодня все. Если есть вопросы — пишите в комментариях к статье. Так же мне было бы интересно узнать, где вы уже применяли или собираетесь применить canvas в своих проектах? Есть ссылки — в комментарии!

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

Комментарии — 18

rihh
Вспомнился Basic :)
AS3
И это все ?????????????????????
Не смешите....
у canvas много фич, к примеру: прозрачность, z-index двух canvas, толщина, вид конца или изгиба линии, тень, градиент, манипуляции с IMG .... и это еще не весь список...
P.S. Статья похожа на галимый копипас
#
AS3
intero
а где пример или результат?
Grin
AS3, это вступительная статья для тех, кто не знает, что такое canvas. Про это написано в заголовке и вступлении.

Я знаю, что у canvas много фич, но нет смысла начинать знакомство с чем-то с конца.

Да, статья похожа на статью с Nettuts, но только частью рассматриваемых методов и элементов. В моей статье более корректный и кроссбраузерный код (подключение excanvas и проверка на понимание 2D context).
SurRealistik
Ничё так то ,что Canvas не для растровой, а для векторной графики, да?
#
SurRealistik
Grin
SurRealistik, canvas это как раз растровая графика (bitmap), а векторная это SVG.
KELiON
а есть ли возмжность в canvas добавлять изображения?
#
KELiON
Grin
KELiON, конечно есть, но я расскажу об этом в следующей статье.
Денис
Здравствуйте.
Извиняюсь за дикий офтоп, а где раздел FAQ?
Я тут на днях подумал что хочу сделать шторку как на ютюбе.
Как её реализовать не подскажите? :)
#
Денис
Вано
(true для против часовой стрелке, false — против)
#
Вано
Дмитрий
Отличная статья!
Буквально висит задача, сделать обратные закругленные углы (огрызки). Знаю что можно картинку засунуть в canvas и очистить с помощью 4 овалов, расположив их по углам. Но все испытания потерпели крах. Может подскажете как решить проблему?
Александр
Я уже закончил его и во всю применяю и перешел к WebGL.
Во всяком случае сейчас больший интерес представляет тот момент, что современные браузеры наносят крупный удар по таким пакетам как jQuery и им подобным - вставляя множество их сервисов во внутренние скрипты . К примеру знаменитый query-селектор уже исполняет не только все выборки из серии jQuery? но и так же поддерживает теги с нэйм-спайсом, что делать скрптмайкеры пока не могут, А их знаменитая анимация - уже стала стандартом CSS3 -
Александр
и еще один момент я бы добавил
лучше бы если указывается не только FireFox, но и все другие продукты от Mozilla, а их там много и все они тоже поддерживают тэг canvas. Поэтому корректнее было бы писать что это Gecko 1.9+.
Артем
Все пытаюсь начать изучение 5-й версии а тут ваша статья. Спасибо!
Andrey
Шикарная статья!
MICTEP
Статья отличная! Все понятно написано, спасибо!

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
counter strike mt2 silkroad pvp metin2 metin2 pvp knight pvp gm olarak başlayan pvpler pvp silkroad pvp serverler counter strike serverler msn show cam show görüntülü sohbet oyunlar suskunlar gazete oku