Элемент холста является частью HTML5 и позволяет выполнять динамический рендеринг двумерных фигур и растровых изображений с возможностью использования сценариев . Это процедурная модель низкого уровня, которая обновляет растровое изображение . HTML5 Canvas также помогает в создании 2D-игр .
Хотя холст HTML5 предлагает собственный API для 2D-рисования , он также поддерживает API WebGL , позволяющий осуществлять 3D-рендеринг с помощью OpenGL ES .
Первоначально Canvas был представлен Apple для использования в их собственном компоненте Mac OS X WebKit в 2004 году [1] для использования в таких приложениях, как виджеты Dashboard и браузер Safari . Позже, в 2005 году, он был принят в версии 1.8 браузеров Gecko [2] и Opera в 2006 году [3] и стандартизирован Рабочей группой по технологиям веб-гипертекстовых приложений (WHATWG) по новым предлагаемым спецификациям для веб-технологий следующего поколения. [ нужна цитата ]
A canvas
состоит из рисуемой области, определенной в HTML- коде с атрибутами высоты и ширины . Код JavaScript может получить доступ к этой области через полный набор функций рисования, аналогичных функциям других распространенных 2D API , что позволяет создавать динамически генерируемую графику. Некоторые ожидаемые варианты использования холста включают построение графиков, анимацию , игры и композицию изображений.
Взаимодействие с холстом включает получение контекста рендеринга холста, который определяет, следует ли использовать контекст рендеринга Canvas API, WebGL или WebGL2 .
Следующий код создает элемент Canvas на странице HTML:
< canvas id = «пример» ширина = «200» высота = «200» >Этот текст отображается, если ваш браузер не поддерживает HTML5 Canvas.</ холст >
Используя JavaScript , вы можете рисовать на холсте:
вар пример = документ . getElementById ( «пример» ); вар контекст = пример . getContext ( '2d' ); контекст . fillStyle = 'красный' ; контекст . fillRect ( 30 , 30 , 50 , 50 );
Этот код рисует красный прямоугольник на экране.
API Canvas также предоставляет save()
и restore()
для сохранения и восстановления всех атрибутов контекста холста.
На самом деле холст имеет два размера: размер самого элемента и размер поверхности рисования элемента. Установка атрибутов ширины и высоты элемента устанавливает оба этих размера; Атрибуты CSS влияют только на размер элемента, а не на поверхность рисования.
По умолчанию размер элемента холста и размер его поверхности рисования составляют 300 пикселей в ширину и 150 пикселей в высоту. В листинге, показанном в примере, где для установки размера элемента холста используется CSS , размер элемента составляет 600 пикселей в ширину и 300 пикселей в высоту, но размер поверхности рисования остается неизменным со значением по умолчанию 300 пикселей × 150. пикселей. Когда размер элемента холста не соответствует размеру его поверхности рисования, браузер масштабирует поверхность рисования в соответствии с размером элемента (что может привести к неожиданным и нежелательным эффектам).
Пример установки разных значений размера элемента и размера поверхности рисования:
<!DOCTYPE html> < html > < head > < title > Размер элемента Canvas: 600 x 300, Размер поверхности для рисования на холсте: 300 x 150 </ title > < style > body { background : #dddddd ; } # холст { маржа : 20 пикселей ; отступ : 20 пикселей ; фон : #ffffff ; граница : тонкая вставка #aaaaaa ; ширина : 600 пикселей ; высота : 300 пикселей ; } </ style > </ head > < body > < Canvas id = "canvas" > Холст не поддерживается </ холст > </ тело > </ html >
SVG — это альтернативный подход к рисованию фигур в браузерах. [4] В отличие от холста, который основан на растре , SVG основан на векторе , поэтому каждая нарисованная фигура запоминается как объект в графе сцены или объектной модели документа , который впоследствии преобразуется в растровое изображение . Это означает, что если атрибуты объекта SVG изменяются, браузер может автоматически повторно отобразить сцену.
С другой стороны, объекты Canvas рисуются в немедленном режиме . В приведенном выше примере холста операция рисования прямоугольника изменяет холст, и его представление в виде прямоугольника забывается системой. Если бы положение прямоугольника нужно было изменить, пришлось бы перерисовать холст, включая все объекты, которые могли быть покрыты прямоугольником. В эквивалентном случае SVG можно просто изменить атрибуты положения прямоугольника, и браузер определит, как его перерисовать. Существуют дополнительные библиотеки JavaScript , которые абстрагируют модель холста, чтобы иметь возможности сцены, подобные SVG, внутри элемента холста. Также можно использовать несколько слоев холста, а это означает, что при необходимости изменений необходимо воссоздавать только определенные слои.
Изображения SVG представлены в формате XML , а сложные сцены можно создавать и поддерживать с помощью инструментов редактирования XML.
Граф сцены SVG позволяет связывать обработчики событий с объектами, поэтому прямоугольник может реагировать на onClick
событие. Чтобы получить ту же функциональность с холстом, необходимо вручную сопоставить координаты щелчка мыши с координатами нарисованного прямоугольника, чтобы определить, был ли по нему щелкнут.
Концептуально Canvas — это API более низкого уровня, на основе которого могут быть построены интерфейсы более высокого уровня (например, поддержка SVG). Существуют библиотеки JavaScript, которые предоставляют частичную реализацию SVG с использованием холста для браузеров, которые не предоставляют SVG, но поддерживают холст, например браузеры в Android 2.x. Однако обычно это не так — это независимые стандарты. Ситуация осложняется тем, что для холста существуют библиотеки графов сцен, а у SVG есть некоторая функциональность по манипуляции с растровыми изображениями.
На момент своего появления элемент Canvas был встречен неоднозначной реакцией сообщества веб-стандартистов. Были аргументы против решения Apple создать новый проприетарный элемент вместо поддержки стандарта SVG . Есть и другие опасения по поводу синтаксиса, например отсутствие пространства имен . [5]
14 марта 2007 г. разработчик WebKit Дэйв Хаятт переслал электронное письмо от старшего патентного юриста Apple Хелен Плотка Уоркман [6] , в котором говорилось, что Apple оставляет за собой все права интеллектуальной собственности в отношении рабочего проекта веб-приложений WHATWG 1.0 от 24 марта 2005 г. Раздел 10.1, озаглавленный «Графика: растровое полотно», [7] , но оставил дверь открытой для лицензирования патентов, если спецификация будет передана в орган по стандартизации с официальной патентной политикой . Это вызвало бурную дискуссию среди веб-разработчиков и вызвало вопросы относительно отсутствия у WHATWG политики в отношении патентов по сравнению с явным предпочтением безвозмездных лицензий со стороны Консорциума Всемирной паутины (W3C). Позже Apple раскрыла данные о патентах в соответствии с условиями бесплатного патентного лицензирования W3C. [8] Раскрытие информации означает, что Apple обязана предоставлять бесплатную лицензию на патент всякий раз, когда элемент Canvas становится частью будущей рекомендации W3C, созданной рабочей группой HTML. [9]
Снятие отпечатков пальцев на холсте — это один из многих методов снятия отпечатков пальцев в браузере для отслеживания онлайн-пользователей, которые позволяют веб-сайтам идентифицировать и отслеживать посетителей с помощью элемента холста HTML5 . Этот метод получил широкое освещение в СМИ в 2014 году, [10] [11] [12] [13] после того, как исследователи из Принстонского университета и университета Левена описали его в своей статье «Сеть никогда не забывает ». [14] Проблемы конфиденциальности, связанные со снятием отпечатков пальцев на холсте, связаны с тем фактом, что даже удаление файлов cookie и очистка кэша не позволят пользователям избежать онлайн-отслеживания.
Элемент поддерживается текущими версиями Mozilla Firefox , Google Chrome , Internet Explorer , Safari , Konqueror , Opera [15] и Microsoft Edge . [16]