Canvas (HTML)

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
 Просмотр этого шаблона  HTML

Canvas (англ. canvas — «холст», рус. канва́с) — элемент HTML5, предназначенный для создания растрового двухмерного изображения при помощи скриптов, обычно на языке JavaScript[1]. Начало отсчёта блока находится слева сверху. От него и строится каждый элемент блока[2]. Размер пространства координат не обязательно отражает размер фактической отображаемой площади[2]. По умолчанию его ширина равна тремстам пикселям, а высота ста пятидесяти[2].

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

Используется в WebGL для аппаратного ускорения 3D графики[3].

Компанией Google была выпущена JavaScript библиотека explorercanvas, которая позволяла работать с Canvas в браузерах IE7 и IE8.

Canvas может усложнить задачу роботам по распознаванию Капчи. При использовании canvas с сервера загружается не картинка, а набор точек (или алгоритм прорисовки), по которым браузер прорисовывает картинку (капчу)[4].

История[править | править вики-текст]

Впервые элемент canvas был представлен компанией Apple в движке WebKit для Mac OS X с целью последующего его использования в приложениях Dashboard и Safari[1].

Ситуацию с отсутствием canvas в IE исправила компания Google, выпустившая собственное расширение, написанное на JavaScript, под названием ExplorerCanvas[5].

На сегодняшний день canvas чаще используется для построения графиков, простой анимации и игр в браузерах[6]. Группа WHATWG предлагает использовать canvas как стандарт для создания графики в новых поколениях веб-приложений[7].

Организация Mozilla Foundation ведёт проект под названием Canvas 3D[8], целью которого является добавить низкоуровневую поддержку графических ускорителей для отображения трёхмерных изображений через HTML-элемент canvas. Наряду с этим существуют библиотеки, реализующие работу с трёхмерными моделями, среди них three.

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

IE Firefox Safari Chrome Opera iOS Android
9.0+ 3.0+ 3.0+ 3.0+ 10.0+ 3.0+ 1.0+

Возможности[править | править вики-текст]

canvas позволяет разместить на холсте: картинку, видео, текст. Залить всё это сплошным цветом, либо обвести контуры или даже добавить градиент[9]. Добавление теней похожих на свойства css3 box-shadow и text-shadow. И, наконец, отрисовка фигур с помощью указания контрольных точек. Причём можно изменять как ширину линий, так и кисть рисовки линий, стиль соединений линий[10].

Особенности[править | править вики-текст]

  • Изменение высоты или ширины холста сотрет всё его содержимое и все настройки, проще говоря он создастся заново[11];
  • Начало отсчёта (точка 0,0) находится в левом верхнем углу[12]. Но её можно сдвигать[13];
  • 3D контекста нет, есть отдельные разработки, но они не стандартизованы[14];
  • Цвет текста можно указывать аналогично CSS, впрочем, как и размер шрифта.

Примеры или паттерны оптимизации[править | править вики-текст]

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

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

Браузеры могут оптимизировать анимации, идущие одновременно, уменьшив число reflow и repaint до одного, что в свою очередь приведёт к повышению точности анимации. Например анимации на JavaScript, синхронизированные с CSS transitions или SVG SMIL. Плюс ко всему если выполняется анимация в табе, который невидим, браузеры не будут продолжать перерисовку, что приведёт к меньшему использованию CPU, GPU, памяти и как следствие снизит расход батареи в мобильных устройствах[15]. Для этого используйте requestAnimationFrame.

Все текущие браузеры имеют фильтр размытия изображения при его увеличении. Его стоит использовать, если вы часто попиксельно обрабатываете картинку. Путём уменьшения картинки, например, в два раза и последующего аппаратного увеличения её с помощью фильтра[16].

Если игра позволяет отдельно обрабатывать фон и элементы игры, то имеет смысл сделать два холста друг над другом[17].

Для очистки канвы лучшим средством будет использование clearRect[17], однако, если очищать только необходимые участки, то скорость возрастет ещё больше.

Критика[править | править вики-текст]

  • Чрезмерно нагружает процессор и оперативную память;
  • Из-за ограничения сборщика мусора, нет возможности очистить память;
  • Необходимо самому обрабатывать события с объектами[18];
  • Плохая производительность при высоком разрешении[18];
  • Приходится отрисовывать отдельно каждый элемент[18].
  • Возможность создания на страницах специальныx «маячков», т.н. Canvas Fingerprinting, для отслеживания пользователей в сети.

Преимущества[править | править вики-текст]

  • В отличие от SVG гораздо удобнее иметь дело с большим числом элементов;
  • Имеет аппаратное ускорение[16][19];
  • Можно манипулировать каждым пикселем[18];
  • Можно применять фильтры обработки изображений[18];
  • Есть много библиотек[18].

Использование[править | править вики-текст]

Использование и операции с элементом возможны только через JavaScript.

<!doctype html>
<html lang="ru">
  <head>
    <title>canvas</title>
    <script src="example.js"></script>
  </head>
  <body>
    <canvas id="canvas">Этот элемент не поддерживается</canvas>
  </body>
</html>

Файл example.js

function onLoadHandler() {
  var canvas  = document.getElementById('canvas'),
      context = canvas.getContext('2d');
  /*
    Далее какие-либо действия над холстом
  */
}
window.onload = onLoadHandler;

Примеры[править | править вики-текст]

Библиотеки[править | править вики-текст]

  • libCanvas это лёгкий но тем не менее функциональный фреймворк canvas
  • Processing.js это порт языка визуализации Processing
  • EaselJS это библиотека с API похожим на Flash
  • PlotKit это библиотека для создания чартов и графики
  • Rekapi это API Canvas для создания анимации на кейфреймах
  • PhiloGL это фреймворк WebGL для визуализации данных, разработки игр и креативного кодирования.
  • JavaScript InfoVis Toolkit создает интерактивную 2D Canvas визуализацию данных для Web.
  • Frame-Engine это фреймворк для разработки приложений и игр.

См. также[править | править вики-текст]

Примечания[править | править вики-текст]

  1. 1 2 Руководство по Canvas (MDN).
  2. 1 2 3 4.12.4 The canvas element — HTML Standard.
  3. Canvas (MDN).
  4. Пример построения капчи по точкам
  5. explorercanvas. Проверено 7 февраля 2013. Архивировано из первоисточника 12 февраля 2013.
  6. Google продвигает HTML5 как игровую платформу. Проверено 7 февраля 2013. Архивировано из первоисточника 12 февраля 2013.
  7. Спецификация от WHATWG. Проверено 7 февраля 2013. Архивировано из первоисточника 12 февраля 2013.
  8. Mozilla Canvas 3D. Проверено 7 февраля 2013.
  9. Градиенты. Проверено 7 февраля 2013. Архивировано из первоисточника 12 февраля 2013.
  10. Поработаем с линиями. Проверено 8 февраля 2013. Архивировано из первоисточника 12 февраля 2013.
  11. Можно ли «перезагрузить» холст? // Спроси профессора Маркапа. Проверено 5 июля 2013. Архивировано из первоисточника 7 июля 2013.
  12. Координаты холста. Проверено 5 июля 2013. Архивировано из первоисточника 7 июля 2013.
  13. Canvas-трансформации доступным языком. Проверено 5 июля 2013. Архивировано из первоисточника 7 июля 2013.
  14. Спроси профессора Маркапа: В. Есть холст 3D?. Проверено 7 февраля 2013. Архивировано из первоисточника 12 февраля 2013.
  15. Продвинутые анимации с requestAnimationFrame. Проверено 8 февраля 2013. Архивировано из первоисточника 12 февраля 2013.
  16. 1 2 Как раскрыть мощь HTML5 Canvas для игр.
  17. 1 2 Improving HTML5 Canvas Performance — HTML5 Rocks.
  18. 1 2 3 4 5 6 What are the advantages/disadvantages of Canvas vs. DOM in JavaScript game development?. Проверено 3 ноября 2013.
  19. Canvas с аппаратным ускорением в Google Chrome.

Ссылки[править | править вики-текст]

Примеры работы
Для ознакомления