HTML HTML и HTML5 Динамический HTML XHTML XHTML Mobile Profile[англ.] и CHTML Document Object Model Кодировки символов Мнемоники в HTML Редактор HTML Элементы HTML Семантическая вёрстка Карта изображений Цвета HTML Формы HTML Фреймы HTML HTML5 audio и HTML5 video Canvas Скрипты в HTML Unicode и HTML[англ.] Браузерный движок Quirks mode Каскадные таблицы стилей W3C и WHATWG Web Storage WebGL Сравнение языков разметки документов браузерных движков .mw-parser-output .hlist dl,.mw-parser-output .hlist.hlist ol,.mw-parser-output .hlist.hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li,.mw-parser-output .hlist .mw-empty-elt{display:none}.mw-parser-output .hlist dt:after{content:": "}.mw-parser-output .hlist dd:after,.mw-parser-output .hlist li:after{content:"\a0 · ";font-weight:bold}.mw-parser-output .hlist dd:last-child:after,.mw-parser-output .hlist dt:last-child:after,.mw-parser-output .hlist li:last-child:after{content:none}.mw-parser-output .hlist dd dd:first-child:before,.mw-parser-output .hlist dd dt:first-child:before,.mw-parser-output .hlist dd li:first-child:before,.mw-parser-output .hlist dt dd:first-child:before,.mw-parser-output .hlist dt dt:first-child:before,.mw-parser-output .hlist dt li:first-child:before,.mw-parser-output .hlist li dd:first-child:before,.mw-parser-output .hlist li dt:first-child:before,.mw-parser-output .hlist li li:first-child:before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child:after,.mw-parser-output .hlist dd dt:last-child:after,.mw-parser-output .hlist dd li:last-child:after,.mw-parser-output .hlist dt dd:last-child:after,.mw-parser-output .hlist dt dt:last-child:after,.mw-parser-output .hlist dt li:last-child:after,.mw-parser-output .hlist li dd:last-child:after,.mw-parser-output .hlist li dt:last-child:after,.mw-parser-output .hlist li li:last-child:after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li:before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child:before,.mw-parser-output .hlist dt ol>li:first-child:before,.mw-parser-output .hlist li ol>li:first-child:before{content:" ("counter(listitem)"\a0 "}.mw-parser-output .hlist-items-nowrap dd,.mw-parser-output .hlist-items-nowrap dt,.mw-parser-output .hlist-items-nowrap li{white-space:nowrap}.mw-parser-output .hlist-items-nowrap dl dl,.mw-parser-output .hlist-items-nowrap dl ol,.mw-parser-output .hlist-items-nowrap dl ul,.mw-parser-output .hlist-items-nowrap ol dl,.mw-parser-output .hlist-items-nowrap ol ol,.mw-parser-output .hlist-items-nowrap ol ul,.mw-parser-output .hlist-items-nowrap ul dl,.mw-parser-output .hlist-items-nowrap ul ol,.mw-parser-output .hlist-items-nowrap ul ul{white-space:normal}.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}.mw-parser-output .infobox .navbar{font-size:100%}.mw-parser-output .navbox .navbar{display:block;font-size:100%}пор

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

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

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

Компанией Google была выпущена JavaScript-библиотека explorercanvas Архивировано 11 февраля 2013 года., которая позволяла работать с 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 Архивная копия от 9 мая 2017 на Wayback Machine.

Поддержка

[править | править код]
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].

Особенности

[править | править код]

Примеры или паттерны оптимизации

[править | править код]

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

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

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

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

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

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

Критика

[править | править код]

Преимущества

[править | править код]

Использование

[править | править код]

Использование и операции с элементом возможны только через 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

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

Примеры

[править | править код]

Библиотеки

[править | править код]

См. также

[править | править код]

Примечания

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

Ссылки

[править | править код]
Примеры работы
Для ознакомления