
- •Как мы сюда попали?
- •Приступим
- •MIME-типы
- •Большое отступление о том, как появляются стандарты
- •Не отрывая карандаша
- •Все, что вы знаете об XHTML, — это ложь
- •Альтернативная точка зрения
- •WHAT? Что?!
- •И снова о W3C
- •Послесловие
- •Для дальнейшего изучения
- •Тестирование функций HTML5 в браузере
- •Приступим
- •Способы тестирования браузера
- •Modernizr: библиотека для тестирования HTML5-функций
- •Холст
- •Рисование текста
- •Видео
- •Форматы видео
- •Локальное хранилище
- •Фоновые вычисления
- •Офлайновые веб-приложения
- •Геолокация
- •Типы полей ввода
- •Подсказывающий текст
- •Автофокусировка в формах
- •Микроданные
- •Для дальнейшего изучения
- •Что все это значит?
- •Приступим
- •Определение типа документа
- •Корневой элемент
- •Элемент HEAD
- •Кодировка символов
- •Ссылочные отношения
- •Новые семантические элементы HTML5
- •Большое отступление о том, как браузеры обрабатывают незнакомые элементы
- •Верхние колонтитулы
- •Рубрикация
- •Дата и время
- •Навигация
- •Нижние колонтитулы
- •Для дальнейшего изучения
- •С чистого листа (холста)
- •Приступим
- •Простые фигуры
- •Координатная сетка холста
- •Контуры
- •Текст
- •Градиенты
- •Изображения
- •Живой пример
- •Для дальнейшего изучения
- •Видео в Сети
- •Приступим
- •Видеоконтейнеры
- •Видеокодеки
- •Theora
- •Аудиокодеки
- •MPEG-1 Audio Layer 3
- •Advanced Audio Coding
- •Vorbis
- •Что работает в Интернете?
- •Проблемы лицензирования видео H.264
- •Кодирование Ogg-видео с помощью Firefogg
- •Пакетное кодирование Ogg-видео с помощью ffmpeg2theora
- •Кодирование H.264-видео с помощью HandBrake
- •Пакетное кодирование H.264-видео с помощью HandBrake
- •Кодирование WebM-видео с помощью программы ffmpeg
- •…И наконец разметка
- •Живой пример
- •Для дальнейшего изучения
- •Вот мы вас и нашли!
- •Приступим
- •API геолокации
- •Покажите мне код
- •Обработка ошибок
- •Требую выбора!
- •На помощь спешит geo.js
- •Живой пример
- •Для дальнейшего изучения
- •Локальное хранилище: прошлое, настоящее, будущее
- •Приступим
- •Краткая история прототипов локального хранилища до HTML5
- •HTML5-хранилище: вводный курс
- •Использование HTML5-хранилища
- •Следим за состоянием HTML5-хранилища
- •Ограничения в современных браузерах
- •HTML5-хранилище в действии
- •Альтернативы: хранилище без ключей и значений
- •Для дальнейшего изучения
- •На волю, в офлайн!
- •Приступим
- •Манифест кэша
- •Раздел NETWORK
- •Раздел FALLBACK
- •Поток событий
- •«Убей меня поскорее!», или Отладка как одно из изящных искусств
- •Строим офлайновое приложение
- •Для дальнейшего изучения
- •Веб-формы как форма безумия
- •Приступим
- •Подсказывающий текст
- •Поля с автофокусировкой
- •Адреса электронной почты
- •Веб-адреса
- •Числа как счетчики
- •Числа как ползунки
- •Выборщики даты
- •Формы поиска
- •Выборщики цвета
- •И еще об одной вещи
- •Для дальнейшего изучения
- •Микроданные и другие красивые слова
- •Приступим
- •Что такое микроданные?
- •Структура микроданных
- •Разметка данных о человеке
- •Разметка данных об организации
- •Разметка данных о событии
- •Разметка клиентских отзывов
- •Для дальнейшего изучения
- •Приложение. Универсальный почти алфавитный определитель всего на свете
- •Элементы
- •Для дальнейшего изучения

Координатная сетка холста |
69 |
Координатная сетка холста
Холст — это двухмерная сетка, на которой координата (0, 0) присвоена левому верхнему углу. Значения абсцисс (x)растут слева направо, значения ординат (y)— сверху вниз.
Координатная диаграмма на рис. 4.2 изображена с помощью тега <canvas>. В ее состав входят:
множество полупрозрачных вертикальных линий;множество полупрозрачных горизонтальных линий;две черные горизонтальные линии;
две маленькие черные диагональные линии, формирующие стрелку;две черные вертикальные линии;еще две маленькие черные диагональные линии — тоже стрелка;буква x;
буква y;
текст (0, 0) возле верхнего левого угла;текст (500, 375) возле нижнего правого угла;
точки в левом верхнем и правом нижнем углах.
Рис. 4.2. Диаграмма координат холста
Рассмотрим, как изобразить такую составную фигуру.
Сначала нужно задать собственно тег <canvas>. В нем будут определены ширина и высота прямоугольника, а также атрибут id:
<canvas id="c" width="500" height="375"></canvas>
70 |
Глава 4.. С чистого листа (холста) |
Затем надо найти в DOM тег <canvas> и получить доступ к его контексту рисования:
var c_canvas = document.getElementById("c"); var context = c_canvas.getContext("2d");
Только после этого следует приступить к рисованию линий.
Контуры
В табл. 4.3 перечислены браузеры, в которых поддерживаются контуры.
Таблица 4.3. Браузеры с поддержкой контуров
IE* |
Firefox |
Safari |
Chrome |
Opera |
iPhone |
Android |
7..0+ |
3..0+ |
3..0+ |
3..0+ |
10..0+ |
1..0+ |
1..0+ |
*В Internet Explorer поддержку обеспечивает сторонняя библиотека ExplorerCanvas.
Вспомните, как выполняются чертежи тушью. В такой работе спешка вредна: чтобы не сделать ошибку, не чертят сразу набело, а сначала проводят прямые и кривые линии карандашом. Только когда набросок доведен до приемлемого вида, карандашные линии прочерчиваются тушью.
Для каждого холста определен контур. Формирование контура подобно карандашному эскизу: рисовать можно что угодно, но частью конечного продукта наш «эскиз» не станет до тех пор, пока мы не прорисуем его условными «чернилами».
Рисовать прямые линии «карандашом» позволяют следующие два метода:moveTo(x, y) передвигает «карандаш» в заданную начальную точку;
lineTo(x, y) проводит линию до заданной конечной точки.
При вызовах moveTo() и lineTo() от раза к разу контур все увеличивается. Эти методыпосути«карандашные»,хотявообщеихможноназыватькакугодно.На холсте ничего не появится, если не вызвать один из «чернильных» методов.
Сформируем сначала координатную сетку:
for (var x = 0.5; x < 500; x += 10) { context.moveTo(x, 0); context.lineTo(x, 375);
}
for (var y = 0.5; y < 375; y += 10) { context.moveTo(0, y); context.lineTo(500, y);
}
До сих пор вызывались только «карандашные» методы и на самом холсте ничего не появилось. Чтобы закрепить эскиз, требуются «чернила»:
context.strokeStyle = "#eee"; context.stroke();
Метод stroke() — один из «чернильных» методов. Он принимает тот сложный контур, который программист определил с помощью moveTo() и lineTo(), и прори-

Контуры |
71 |
совывает этот контур на холсте. Цвет линий определяет свойство strokeStyle. Результат показан на рис. 4.3.
Рис. 4.3. Прямоугольная сетка на холсте
Разметка в вопросах и ответах
Вопрос: Почему начальным значением для x и y выбра- |
сти линию единичной толщины по такому стыку, то она |
но 0,5, а не 0? |
захватит края прилегающих квадратов и окажется |
Ответ: Представьте себе каждый отдельный пиксел как |
толщиной два пиксела. Чтобы добиться толщины |
ровно 1 пиксел, надо сдвинуть координату на 0,5 |
|
большой квадрат. Целочисленная координатная сетка |
в направлении, перпендикулярном направлению |
(0, 1, 2...) проходит по стыкам квадратов. Если прове- |
линии. |
|
|
Теперь изобразим горизонтальную стрелку. Все прямые и кривые участки одного контура изображаются одним и тем же цветом (или градиентом, о чем уже совсем скоро пойдет речь). Но для стрелки нужен другой цвет: черный, а не светло-серый. Поэтому начнем новый контур:
context.beginPath(); context.moveTo(0, 40); context.lineTo(240, 40); context.moveTo(260, 40); context.lineTo(500, 40); context.moveTo(495, 35); context.lineTo(500, 40); context.lineTo(495, 45);
Аналогично создается вертикальная стрелка. Поскольку она того же цвета, что и горизонтальная, начинать новый контур нет необходимости. Две стрелки будут частями единого контура:

72 |
Глава 4.. С чистого листа (холста) |
context.moveTo(60, 0); context.lineTo(60, 153); context.moveTo(60, 173); context.lineTo(60, 375); context.moveTo(65, 370); context.lineTo(60, 375); context.lineTo(55, 370);
Как я сказал, стрелки будут черного цвета, но свойство strokeStyle пока еще определяет светло-серый цвет (при создании нового контура значения fillStyle и strokeStyle не возвращаются к начальным). Это не составляет проблемы, потому что до сих пор вызывались только «карандашные» методы. Прежде чем прорисовывать контур по-настоящему, «чернилами», зададим в свойстве strokeStyle значение черного цвета, иначе стрелки окажутся почти невидимыми:
context.strokeStyle = "#000"; context.stroke();
Результат можно видеть на рис. 4.4.
Рис. 4.4. Координатные оси (без ярлыков) на холсте
Текст
На холсте можно рисовать не только линии, но и текст (табл. 4.4). В отличие от окружающего текста веб-страницы, текст на холсте не подчиняется «блочной» модели, то есть к нему неприменимы известные технологии CSS-форматирования: плавающая разметка, поля, отступы и перенос по словам (это и к лучшему, как вы могли бы подумать). Можно установить некоторые атрибуты шрифта, после чего выбирается точка на холсте и прорисовывается текст.

Текст |
|
|
|
|
|
73 |
|
Таблица 4.4. Браузеры, в которых поддерживается текст на холсте |
|
||||
|
|
|
|
|
|
|
IE* |
Firefox** |
Safari |
Chrome |
Opera |
iPhone |
Android |
7..0+ |
3..0+ |
3..0+ |
3..0+ |
10..0+ |
1..0+ |
1..0+ |
*В Internet Explorer поддержку обеспечивает сторонняя библиотека ExplorerCanvas.
**В Mozilla Firefox 3.0 для обеспечения поддержки нужен пакет совместимости.
Вконтексте рисования (см. раздел «Простые фигуры» этой главы) доступны следующие атрибуты шрифта:
font — все, что позволяет определить одноименное CSS-правило: стиль, вариант, начертание, размер, интерлиньяж и семейство шрифтов;
textAlign — задает выравнивание текста, подобно CSS-правилу text-align, но не точно так же; возможные значения этого свойства: start, end, left, right, center;
textBaseline — определяет положение текста относительно начальной точки;
возможные значения этого свойства: top, hanging, middle, alphabetic, ideographic, bottom.
Свойство textBaseline непростое, потому что непрост и сам текст (английский текст, как и русский, достаточно прост, но на холст можно вывести любой символ Unicode, а там простота заканчивается). Спецификация HTML5 так описывает различные базовые линии текста1:
Верх и низ em-квадрата — это приблизительные верхняя и нижняя границы символов шрифта.. Строго посередине между ними проводится средняя линия.. К «висячей» базовой линии прикрепляются такие символы, как ; к «алфавитной» базовой линии — такие символы, как
, , f и
; к «идеографической» базовой линии — такие символы, как
и
.. По вине символов, далеко выходящих за границы em-квадратов (рис. 4..5), верхний и нижний края ограничива ющего блока могут находиться далеко от базовых линий..
Рис. 4.5. Базовые линии текста
Для таких простых алфавитов, как английский и русский, можно ограничиться значениями top, middle и bottom свойства textBaseline.
1http://bit.ly/aHCdDO. — Примеч. авт.

74 |
Глава 4.. С чистого листа (холста) |
Итак, нарисуем какой-нибудь текст. Текст на холсте наследует размер шрифта и стиль, применяемые к самому тегу <canvas>, но эти значения можно переопределить в контексте рисования с помощью свойства font:
context.font = "bold 12px sans-serif"; context.fillText("x", 248, 43); context.fillText("y", 58, 165);
Прорисовка текста выполняется методом fillText():
context.font = "bold 12px sans-serif"; context.fillText(“x”, 248, 43); context.fillText("y", 58, 165);
Разметка в вопросах и ответах
Вопрос: Можно ли при рисовании текста использо- |
исходя из таблицы стилей. Если присвоить context.font |
вать относительный размер шрифта? |
относительное значение, например 1.5em или 150%, |
Ответ: Да. Для тега <canvas>, как и для любого другого |
то браузер умножит эту величину на размер шрифта, |
вычисленный им для тега <canvas>. |
|
HTML-тега на странице, размер шрифта вычисляется |
|
|
|
Пусть, например, мы хотим, чтобы текст в левом верхнем углу располагался под линией y = 5. Из обычной программистской лености не станем мерить высоту текста,чтобырассчитатьординатубазовойлинии,а вместоэтогоприсвоим textBaseline значение top и передадим методу-обработчику координаты левого верхнего угла рамки, ограничивающей текст:
context.textBaseline = "top"; context.fillText("( 0 , 0 )", 8, 5);
Теперь рассмотрим текст в правом нижнем углу. Пусть, например, нам угодно, чтобы правый нижний угол области, занятой этим текстом, имел координаты (492, 370), то есть располагался всего в нескольких пикселах от правого нижнего угла холста. Опять же мы не будем измерять ширину и высоту текста. Достаточно установить textAlign равным right и textBaseline равным bottom, а затем вызвать fillText(), передав ему координаты правого нижнего угла рамки, ограничивающей текст:
context.textAlign = "right"; context.textBaseline = "bottom"; context.fillText("( 500 , 375 )", 492, 370);
Результат этих манипуляций показан на рис. 4.6.
Как же мы забыли о точках по углам? Рисование кругов будет рассмотрено чуть позже, а пока что мы схитрим и изобразим точки в виде прямоугольников (см. раздел «Простые фигуры» этой главы):
context.fillRect(0, 0, 3, 3); context.fillRect(497, 372, 3, 3);