Canvas (HTML)
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].
Особенности
- Изменение высоты или ширины холста сотрет всё его содержимое и все настройки, проще говоря он создастся заново[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].
- Возможность создания на страницах специальных «маячков», т. н. Canvas Fingerprinting, для отслеживания пользователей в сети.
Преимущества
- В отличие от SVG гораздо удобнее иметь дело с большим числом элементов;
- Имеет аппаратное ускорение[16][19];
- Можно манипулировать каждым пикселем[18];
- Можно применять фильтры обработки изображений[18];
- Есть много библиотек[18].
Использование
Использование и операции с элементом возможны только через JavaScript. Пример index.html :
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<title>Пример canvas</title>
</head>
<body>
<canvas id="canvas">Этот элемент не поддерживается</canvas>
</body>
<script>
window.onload = function() {
var canvas = document.getElementById('canvas'),
context = canvas.getContext('2d');
/*
Далее какие-либо действия над холстом
*/
};
</script>
</html>
Примеры
<html lang="ru">
<head>
<title>circle</title>
</head>
<body>
<canvas id="example">Обновите браузер</canvas>
<script>
var canvas = document.getElementById('example'),
context = canvas.getContext('2d');
function drawCircle(x, y, r) {
context.arc(x, y, r, 0, 2 * Math.PI, false);
}
context.beginPath();
drawCircle(150, 75, 50);
context.lineWidth = 15;
context.strokeStyle = '#0f0';
context.stroke();
</script>
</body>
</html>
<html>
<head>
<title>Дерево Пифагора</title>
<script type="text/javascript">
// функция рисует под углом angle линию из указанной точки длиной ln
function drawLine(x, y, ln, angle) {
context.moveTo(x, y);
context.lineTo(Math.round(x + ln * Math.cos(angle)), Math.round(y - ln * Math.sin(angle)));
}
// Функция рисует дерево
function drawTree(x, y, ln, minLn, angle) {
if (ln > minLn) {
ln = ln * 0.75;
drawLine(x, y, ln, angle);
x = Math.round(x + ln * Math.cos(angle));
y = Math.round(y - ln * Math.sin(angle));
drawTree(x, y, ln, minLn, angle + Math.PI / 4);
drawTree(x, y, ln, minLn, angle - Math.PI / 6);
// если поставить угол Math.PI/4 , то выйдет классическое дерево
}
}
// Инициализация переменных
function init() {
var canvas = document.getElementById("tree"),
x = 100 + (canvas.width / 2),
y = 170 + canvas.height, // положении ствола
ln = 120, // начальная длина линии
minLn = 5; // минимальная длина линии
canvas.width = 480; // Ширина холста
canvas.height = 320; // высота холста
context = canvas.getContext('2d');
context.fillStyle = '#ddf'; // цвет фона
context.strokeStyle = '#020'; //цвет линий
context.fillRect(0, 0, canvas.width, canvas.height);
context.lineWidth = 2; // ширина линий
context.beginPath();
drawTree(x, y, ln, minLn, Math.PI / 2);
context.stroke();
}
window.onload = init;
</script>
</head>
<body>
<canvas id="tree"></canvas>
</body>
</html>
Библиотеки
- libCanvas — лёгкий, но тем не менее функциональный фреймворк canvas
- Processing.js — порт языка визуализации Processing
- EaselJS — библиотека с API похожим на Flash
- PlotKit — библиотека для создания чартов и графики
- Rekapi — API Canvas для создания анимации на кейфреймах
- PhiloGL — фреймворк WebGL для визуализации данных, разработки игр и креативного кодирования.
- JavaScript InfoVis Toolkit — создаёт интерактивную 2D Canvas визуализацию данных для Web.
- Frame-Engine — фреймворк для разработки приложений и игр.
- Two.js — библиотека для рисования и анимации 2D-векторной графики с поддержкой SVG, Canvas и WebGL.
- Paper.js — мощный векторный графический скриптовый фреймворк, работающий поверх Canvas.
- PixiJS — высокопроизводительный 2D рендерер с WebGL и Canvas fallback, часто используется для игр и интерактивных приложений.
Библиотеки для работы с 3D
- Three.js — одна из самых популярных и мощных библиотек для создания 3D-графики и анимации на WebGL.
- Babylon.js — полнофункциональный 3D-движок с поддержкой физики, анимаций и расширенных возможностей.
- PlayCanvas — 3D движок и платформа для разработки игр с визуальным редактором.
См. также
Примечания
- ↑ 1 2 Руководство по Canvas (MDN). Дата обращения: 23 марта 2015. Архивировано 30 марта 2015 года.
- ↑ 1 2 3 4.12.4 The canvas element — HTML Standard. Архивировано 27 апреля 2009 года.
- ↑ Canvas (MDN). Дата обращения: 23 марта 2015. Архивировано 25 марта 2015 года.
- ↑ Пример построения капчи по точкам Архивировано 19 декабря 2013 года.
- ↑ explorercanvas. Дата обращения: 7 февраля 2013. Архивировано из оригинала 11 февраля 2013 года.
- ↑ Google продвигает HTML5 как игровую платформу. Дата обращения: 7 февраля 2013. Архивировано из оригинала 11 февраля 2013 года.
- ↑ Спецификация от WHATWG. Дата обращения: 7 февраля 2013. Архивировано из оригинала 11 февраля 2013 года.
- ↑ Mozilla Canvas 3D. Дата обращения: 7 февраля 2013. Архивировано 12 марта 2013 года.
- ↑ Градиенты. Дата обращения: 7 февраля 2013. Архивировано из оригинала 11 февраля 2013 года.
- ↑ Поработаем с линиями. Дата обращения: 8 февраля 2013. Архивировано из оригинала 11 февраля 2013 года.
- ↑ Можно ли «перезагрузить» холст? // Спроси профессора Маркапа. Дата обращения: 5 июля 2013. Архивировано из оригинала 7 июля 2013 года.
- ↑ Координаты холста. Дата обращения: 5 июля 2013. Архивировано из оригинала 7 июля 2013 года.
- ↑ Canvas-трансформации доступным языком. Дата обращения: 5 июля 2013. Архивировано из оригинала 7 июля 2013 года.
- ↑ Спроси профессора Маркапа: В. Есть холст 3D? Дата обращения: 7 февраля 2013. Архивировано из оригинала 11 февраля 2013 года.
- ↑ Продвинутые анимации с requestAnimationFrame. Дата обращения: 8 февраля 2013. Архивировано из оригинала 11 февраля 2013 года.
- ↑ 1 2 Как раскрыть мощь HTML5 Canvas для игр. Дата обращения: 3 ноября 2013. Архивировано 3 ноября 2013 года.
- ↑ 1 2 Improving HTML5 Canvas Performance — HTML5 Rocks. Дата обращения: 3 ноября 2013. Архивировано 4 ноября 2013 года.
- ↑ 1 2 3 4 5 6 What are the advantages/disadvantages of Canvas vs. DOM in JavaScript game development? Дата обращения: 3 ноября 2013. Архивировано 4 ноября 2013 года.
- ↑ Canvas с аппаратным ускорением в Google Chrome. Дата обращения: 3 ноября 2013. Архивировано 3 ноября 2013 года.
Ссылки
Примеры работы
- 3D Walker. Дата обращения: 14 октября 2013. Архивировано 27 сентября 2013 года.
- Racing 3D. Дата обращения: 14 октября 2013. Архивировано 14 февраля 2009 года.
- Интерактивная игра. Дата обращения: 14 октября 2013. Архивировано 5 октября 2013 года.
- Карта московского метро. Дата обращения: 14 февраля 2022. Архивировано 14 февраля 2022 года.
- Карта звёздного неба. Дата обращения: 2 ноября 2013. Архивировано из оригинала 5 августа 2014 года.
- Строительные калькуляторы с чертежами.
Для ознакомления
- <canvas> — справочник по HTML. Дата обращения: 30 августа 2023.
- HTML5 Canvas. Дата обращения: 31 октября 2013. Архивировано 31 октября 2013 года.
- MDN. Дата обращения: 31 октября 2013. Архивировано 6 ноября 2013 года.
- Living Standard. Дата обращения: 31 октября 2013. Архивировано 27 апреля 2009 года.
- Спецификация Canvas 2D Context, перевод на русский. Дата обращения: 28 мая 2016. Архивировано 17 июня 2016 года.
- Android canvas. Дата обращения: 31 октября 2013. Архивировано 2 ноября 2013 года.
- Оптимизация работы элемента canvas в HTML5. Дата обращения: 31 октября 2013. Архивировано 4 ноября 2013 года.
- diveintohtml5. Дата обращения: 31 октября 2013. Архивировано 29 октября 2013 года.
- Основы canvas. Дата обращения: 31 октября 2013. Архивировано 4 ноября 2013 года.
- HTML5 fundamentals, Part 4: The final touch. Дата обращения: 31 октября 2013. Архивировано 3 ноября 2013 года.
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.