Формат VML – это ответ Microsoft на появление SVG. Подобно SVG, VML также является грамматикой языка XML, предназначенной для описания графических изображений. VML во многом напоминает SVG. Несмотря на то, что возможности формата VML не столь широки, как SVG, он предлагает полный набор примити_ вов рисования и имеет встроенную поддержку в IE начиная с версии 5.5. Компа_ ния Microsoft (и некоторые ее партнеры) передали формат VML консорциуму W3С для рассмотрения в качестве стандарта, но их усилия пока ни к чему не при_ вели. Лучшее из существующих описание VML, представленное компанией Mi_ crosoft, доступно на веб_сайте W3C по адресу http://www.w3.org/TR/NOTE' VML. Обратите внимание: несмотря на то, что этот документ размещен на сайтеW3C, формат VML еще не стандартизован, а его реализация является собствен_ ностью компании Microsoft.
Хотя VML – это очень мощная технология, ей так и не удалось завоевать попу_ лярность. Из_за не слишком широкого распространения1 она не подвергалась тщательному документированию. Веб_сайты Microsoft обычно указывают на спецификации, переданные консорциуму W3C, как на авторитетный источник сведений. К сожалению, т. к. этот документ – лишь проект, он никогда не под_ вергался тщательному изучению с целью стандартизации и потому в отдельных местах страдает неполнотой, в других – неточностями. При работе с VML вам, скорее всего, придется идти путем проб и ошибок, экспериментируя с реализаци_ ей в IE в процессе создания требуемых изображений. Это предупреждение можно считать незначительным, если рассматривать VML как мощный механизм созда_ ния векторной графики на стороне клиента, тем более учитывая, что данный ме_ ханизм встроен в веб_броузер, который по_прежнему доминирует на рынке.
VML – это диалект XML, отличающийся от HTML, но IE не обладает полноцен_ ной поддержкой XHTML_документов, а его реализация модели DOM не поддер_ живает функции, различающие пространства имен, такие как document.crea_ teElementNS(). Работа с тегами в пространстве имен VML в IE обеспечивается с помощью HTML_атрибутов «поведения» (еще одно расширение, характерное для IE). Все HTML_файлы, содержащие VML_документы, в первую очередь должны объявить пространство имен, например так:
<html xmlns:v="urn:schemas_microsoft_com:vml">
Это же пространство имен может быть объявлено иначе, специфичным только для IE (нестандартным) способом:
1 Насколько мне известно, Google Maps (http://local.google.com) – единственный высокопрофессиональный сайт, в котором используется технология VML.
570 Глава 22. Работа с графикой на стороне клиента
После того как все необходимые объявления сделаны, можно свободно переме_ шивать VML_ и HTML_код, как в следующем фрагменте, который создает нечто похожее на SVG_изображение, представленное на рис. 22.4:
Это красный квадрат:<v:rect style="width:10px;height:10px;" fillcolor="red"/> Это голубой круг:<v:oval style="width:10px;height:10px;" fillcolor="blue"/> </body>
</html>
Однако вернемся к теме этой главы, в которой основной упор делается на исполь_ зовании JavaScript_сценариев для динамического создания графических изобра_ жений на стороне клиента. В примере 22.10 демонстрируется, как построить круговую диаграмму средствами VML. Пример очень напоминает код построе_ ния круговой диаграммы средствами SVG, в нем просто SVG_примитивы рисова_ ния заменены VML_примитивами. Для простоты в этом примере объединены функции makeVMLCanvas(), pieChart() и программный код, который вызывает эти функции для вывода диаграммы. Результат работы это сценария здесь не пока_ зан, поскольку он ничем не отличается от диаграммы, полученной средствами SVG и представленной на рис. 22.5.
Пример 22.10. Рисование круговой диаграммы средствами JavaScript и VML
<!__
HTML_документ, использующий VML, должен объявить это пространство имен __>
Следующая остановка в нашем путешествии по технологиям создания вектор_ ной графики на стороне клиента – тег <canvas>. Этот нестандартный HTML_тег специально предназначен для создания векторной графики на стороне клиента. Сам он не имеет визуального представления, но предоставляет JavaScript_сцена_ риям интерфейс для создания рисунков внутри тега <canvas>. Впервые тег <can_ vas> был введен компанией Apple в веб_броузере Safari 1.3. (Причина такого ра_ дикального расширения HTML кроется в том, что HTML_средства визуализации Safari использовались также в компоненте Dashboard (инструментальная па_ нель) рабочего стола Mac OS X, и компании Apple требовался механизм управле_ ния графикой в Dashboard.)
Броузеры Firefox 1.5 и Opera 9 последовали за Safari – оба также поддерживают тег <canvas>. Существует даже возможность использовать тег <canvas> в IE совме_ стно со свободно распространяемым JavaScript_кодом (изначально разработан_
22.5. Создание графики с помощью тега <canvas>
ным в Google), который обеспечивает работу тега <canvas> поверх VML (http://ex' canvas.sourceforge.net). Неофициальный консорциум производителей веб_бро_узеров продолжает прикладывать усилия по стандартизации тега <canvas>, предва_ рительные спецификации можно найти по адресу http://www.whatwg.org/specs/ web'apps/current'work.
Существенное отличие между тегом <canvas> и технологиями SVG и VML заклю_ чается в том, что тег <canvas> предоставляет прикладной интерфейс Canvas на базе JavaScript, предназначенный для создания изображений, в то время как SVG и VML описывают изображение в виде XML_документов. Функционально эти два подхода эквивалентны: любой из них может моделироваться с использованием другого. Однако внешне они совершенно отличаются, и каждый из них имеет свои сильные и слабые стороны. Например, из SVG_рисунков легко можно уда_ лять элементы. Чтобы удалить элемент из аналогичного рисунка, созданного в теге <canvas>, обычно требуется полностью ликвидировать рисунок, а затем соз_ дать его заново. Поскольку прикладной интерфейс Canvas основан на синтаксисе JavaScript, а рисунки, созданные с его помощью, получаются более компактны_ ми (чем SVG_ и VML_рисунки), я решил описать его в этой книге. Подробные све_ дения вы найдете в соответствующих разделах четвертой части книги.
Большая часть прикладного интерфейса Canvas определена не в элементе <can_ vas>, а в объекте «контекста рисования», получить который можно методом get_ Context() элемента, играющего роль «холста».1 Этот сценарий рисует маленький красный квадрат и голубой круг, что является типичным для рисования в теге
<canvas>.
<head>
<script>
window.onload = function() { // Создает рисунок после загрузки документа
var canvas = document.getElementById("square"); //
Получить элемент холста
var context = canvas.getContext("2d");
//
Получить 2D_контекст
context.fillStyle = "#f00";
//
Цвет заливки _ красный
context.fillRect(0,0,10,10);
//
Залить квадрат
canvas = document.getElementById("circle");
//
Новый элемент холста
context = canvas.getContext("2d");
//
Получить его контекст
context.fillStyle = "#00f";
//
Цвет заливки _ голубой
context.beginPath();
//
Начать рисование
// Добавить в рисунок полную окружность с радиусом
5 и с центром в точке (5,5)
context.arc(5, 5, 5, 0, 2*Math.PI, true);
context.fill( );
//
Залить фигуру
}
</script>
</head>
<body>
Это красный квадрат: <canvas id="square" width=10 height=10></canvas>.
1 Этот метод требует единственный аргумент – строку "2d" – и возвращает контекст рисования, который реализует прикладной интерфейс для создания двухмерных изображений. В будущем если тег <canvas> будет расширен для создания трехмерных изображений, этот метод, по всей видимости, будет получать в виде аргумента строку "3d".
574 Глава 22. Работа с графикой на стороне клиента
Это голубой круг: <canvas id="circle" width=10 height=10></canvas>. </body>
В предыдущих разделах вы видели, что при использовании SVG и VML сложные фигуры описываются как «путь» пера, состоящий из линий и кривых, которые могут быть нарисованы или залиты цветом. В прикладном интерфейсе Canvas также используется нотация пути перемещения пера, только путь описывается не как строка символов и чисел, а как последовательность вызовов методов, та_ ких как beginPath() и arc() в данном примере. После того как описание пути за_ вершается, вызывается другой метод, такой как fill(), который обрабатывет этот путь. Порядок обработки определяется различными свойствами объекта контекста рисунка, такими как fillStyle.
Одна из причин, объясняющих такую компактность прикладного интерфейса Canvas, заключается в том, что он никак не поддерживает работу с текстом. Что_ бы вставить текст в графическое изображение тега <canvas>, вам придется вруч_ ную вставлять текст в рисунок в виде растрового изображения либо наклады_ вать текст в формате HTML поверх тега <canvas>, используя возможности пози_ ционирования CSS.
В примере 22.11 демонстрируется, как нарисовать круговую диаграмму в теге <canvas>. Большая часть этого кода покажется знакомой по примерам использова_ ния SVG и VML. Новый программный код в этом примере – это методы приклад_ ного интерфейса Canvas, описание которых вы найдете в четвертой части книги.
Пример 22.11. Рисование круговой диаграммы в теге <canvas>
<html>
<head>
<script>
// Создает и возвращает новый тег <canvas> с заданным id и размерами.
// Обратите внимание: этот метод не добавляет тег <canvas> в документ function makeCanvas(id, width, height) {
var canvas = document.createElement("canvas"); canvas.id = id;