- •Как мы сюда попали?
- •Приступим
- •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
- •Поток событий
- •«Убей меня поскорее!», или Отладка как одно из изящных искусств
- •Строим офлайновое приложение
- •Для дальнейшего изучения
- •Веб-формы как форма безумия
- •Приступим
- •Подсказывающий текст
- •Поля с автофокусировкой
- •Адреса электронной почты
- •Веб-адреса
- •Числа как счетчики
- •Числа как ползунки
- •Выборщики даты
- •Формы поиска
- •Выборщики цвета
- •И еще об одной вещи
- •Для дальнейшего изучения
- •Микроданные и другие красивые слова
- •Приступим
- •Что такое микроданные?
- •Структура микроданных
- •Разметка данных о человеке
- •Разметка данных об организации
- •Разметка данных о событии
- •Разметка клиентских отзывов
- •Для дальнейшего изучения
- •Приложение. Универсальный почти алфавитный определитель всего на свете
- •Элементы
- •Для дальнейшего изучения
54 |
Глава 3.. Что все это значит? |
Строки <!--[if lt IE 9]> и <![endif]--> открывают и закрывают условный комментарий соответственно. Internet Explorer видит в них утверждение: «Если текущий браузер — Internet Explorer вплоть до 8-й версии, то исполнить следующий код». Все остальные браузеры обращаются с условным комментарием, как и с лю- бымдругимHTML-комментарием.В результатеInternetExplorerвплотьдо8-й версии запускает сценарий, а любой другой браузер игнорирует его, что ускоряет загрузку страницы.
Сам по себе код на JavaScript, приведенный выше, довольно прямолинеен. В переменную e заносится массив строк вида "abbr", "article" и т. д. Цикл перебирает эти строки (названия HTML5-элементов) и командой document.createElement() создает соответствующие пустые элементы. Поскольку возвращаемые значения не присваиваются никакой переменной, элементы не попадают в DOM. Однако для Internet Explorer этого достаточно: когда далее на странице будут встречаться непустые элементы тех же типов, они будут правильно отображаться.
Обратите внимание: «далее на странице». Сценарий должен располагаться вначале документа и желательно внутри контейнера <head>, а не в его конце. Таким образом, Internet Explorer будет сначала исполнять сценарий и только потом разбирать теги и атрибуты. Если убрать сценарий далеко вниз, то будет уже поздно: Internet Explorer неверно интерпретирует разметку страницы и ошибочно построит DOM-иерархию. Повторный разбор кода страницы выполняться не будет.
«Облегченную» версию своего сценария Реми Шарп поместил в репозиторий
Google Code (http://code..google..com/p/html5shiv/). Сценарий распространяется под лицензией MIT с открытым исходным кодом, так что вы можете пользоваться им в любом своем проекте. Можно даже ссылаться непосредственно на версию, хра-
нимую Google:
<head>
<meta charset="utf-8" />
<title>Мой блог</title>
<!--[if lt IE 9]>
<script src=”http://html5shiv.googlecode.com/svn/trunk/html5.js”></script> <![endif]-->
</head>
Теперь мы готовы приступить к использованию новых семантических элемен-
тов HTML5.
Верхние колонтитулы
Вернемся к странице, с которой мы экспериментируем, и обратим внимание на верхний колонтитул1:
<div id="header">
<h1>Мой блог</h1>
1Основной английский текст веб-страниц дается здесь и далее в русском переводе. —
Примеч. перев.
Верхние колонтитулы |
55 |
<p class="tagline">Только сложные пути ведут к простым решениям.</p>
</div>
...
<div class="entry">
<h2>День в дороге</h2>
</div>
...
<div class="entry">
<h2>Я еду в Прагу!</h2>
</div>
Такая верстка вполне корректна. Если угодно, ее можно оставить как есть, потому что это валидный HTML5. Однако в HTML5, как мы знаем, есть особые семантические элементы для колонтитулов и разделов.
Первым делом избавимся от <div id="header">. Это популярная форма записи, но она ничего не значит. У тега <div> нет собственной семантики, как и у атрибута id (это, конечно, взгляд с точки зрения клиентских программ, которые не умеют судить о содержании информационного блока по значению атрибута id). Можно было бы назвать тот же контейнер <div id="preved"> — и ничего бы не изменилось.
В HTML5 для оформления верхних колонтитулов есть тег <header>. Спецификация приводит много примеров использования <header> в прикладных задачах верстки. Код нашей страницы после внесенной правки будет выглядеть так:
<header>
<h1>Мой блог</h1>
<p class="tagline">Только сложные пути ведут к простым решениям.</p>
...
</header>
Стало лучше, правда? Теперь из кода ясно, что перед нами верхний колонтитул. Поравзятьсязаподзаголовок-теглайн,которыйздесьсверстанобычным,нонестан- дартизованным (как это теперь стало возможно) способом. Оформить теглайн — непростая задача: он должен вести себя как подзаголовок, привязанный к основному заглавию, то есть подзаголовок без следующего за ним раздела.
Заголовочные теги, такие как <h1> и <h2>, определяют структуру страницы. Взятые в совокупности, они формируют краткое содержание документа, в соответствии с которым может быть организована навигация по странице. Программы экранного доступа, опираясь на краткое содержание, помогают слепым пользователям ориентироваться на страницах. Есть веб-сервис (http://gsnedders..html5..org/ outliner/) и браузерное расширение (http://chrispederick..com/work/web-developer/), ко-
торые умеют графически представлять краткое содержание страниц.
В HTML 4построить краткоесодержание страницыможно было только на основе тегов <h1>…<h6>. Схема страницы-образца выглядит таким образом:
Мой блог (h1)
|
+—День в дороге (h2)
|
+—Я еду в Прагу! (h2)
56 Глава 3.. Что все это значит?
Здесь все в порядке, но теглайну «Только сложные пути ведут к простым решениям» места не нашлось. Если бы мы поместили его в контейнер <h2>, в кратком содержании документа появился бы пустой узел:
Мой блог (h1)
|
+—Только сложные пути ведут к простым решениям. (h2)
|
+—День в дороге (h2)
|
+—Я еду в Прагу! (h2)
На самом же деле структура документа не такая. Теглайн не является заголовком одной из записей блога: это подзаголовок, обособленно помещенный на страницу. А если спрятать теглайн в <h2>, а заголовок каждой записи — в <h3>? Нет, так будет только хуже:
Мой блог (h1)
|
+—Только сложные пути ведут к простым решениям. (h2)
|
+—День в дороге (h3)
|
+—Я еду в Прагу! (h3)
Вкратком содержании документа по-прежнему есть пустой узел, который
ктому же присвоил дочерние узлы, по праву принадлежащие корню иерархии. В этом вся незадача: HTML 4 не позволяет оформить теглайн так, чтобы он, будучи одним из подзаголовков, тем не менее не попадал в краткое содержание страницы. Как бы мы ни старались перехитрить компьютер, слова «Только сложные пути ведут к простым решениям» неминуемо осядут в одном из узлов структуры. Вот почему семантически бессмысленную верстку вида <p class="tagline"> мы сочли меньшим злом.
Решение, которое предлагает HTML5, заключается в применении тега <hgroup>. Он функционирует в качестве обертки для двух или нескольких связанных заголовков. Называя их связанными, мы имеем в виду, что в кратком содержании документа они образуют единый узел. При следующем коде страницы:
<header>
<hgroup>
<h1>Мой блог</h1>
<h2>Только сложные пути ведут к простым решениям.</h2>
</hgroup>
...
</header>
...
<div class="entry">
<h2>День в дороге</h2>
</div>
...
<div class="entry">
Рубрикация |
57 |
<h2>Я еду в Прагу!</h2>
</div>
краткое содержание будет выглядеть таким образом:
Мой блог (h1 в составе hgroup)
|
+—День в дороге (h2)
|
+—Я еду в Прагу! (h2)
Чтобы убедиться, что вы правильно пользуетесь заголовками, тестируйте создаваемые вами страницы на сайте HTML5 Outliner.
Рубрикация
Разберемся, как можно преобразовать дальнейший код:
<div class="entry">
<p class="post-date">22 октября 2009 г.</p>
<h2>
<a href="#" rel="bookmark"
title="ссылка на эту запись"> День в дороге
</a>
</h2>
...
</div>
Это тоже валидный HTML5. Однако в HTML5 есть тег <article>, использование которого (в общем случае) при разбивке страницы на статьи или записи более оправданно:
<article>
<p class="post-date">22 октября 2009 г.</p>
<h2>
<a href="#" rel="bookmark"
title="ссылка на эту запись"> День в дороге
</a>
</h2>
...
</article>
Однако все не так просто, и понадобится внести еще одно изменение, которое я сначала покажу, а потом объясню:
<article>
<header>
<p class="post-date">22 октября 2009 г.</p>
58 |
Глава 3.. Что все это значит? |
<h1>
<a href="#" rel="bookmark"
title="ссылка на эту запись"> День в дороге
</a>
</h1>
</header>
...
</article>
Ясно?Тег<h2> былзаменентегом<h1> вобертке<header>.Какработаеттег<header>, вы уже видели. В данном случае его функция — заключать в себя все элементы верхнегоколонтитулазаписи(датупубликациии название).Но…какбытьстем,чтовдокументедолженбытьтолькоодинзаголовок<h1>?Непострадаетлиотнашейправки краткое содержание документа? Нет. Чтобы понять почему, вернемся на шаг назад.
ВHTML 4 краткое содержание строилось с опорой только на теги <h1>…<h6>. Если веб-мастер хотел видеть в смысловой схеме документа один корневой узел, он должен был ограничиться лишь одним заголовком <h1>. Но спецификация HTML5 задает новый алгоритм построения краткого содержания с учетом современных семантических тегов. Согласно этому алгоритму, тег <article> создает новый раздел, то есть очередной дочерний узел корня краткого содержания. Между тем в HTML5 внутри каждого раздела может иметься свой собственный тег <h1>.
Итак, произошла большая и, как мы сейчас увидим, благотворная перемена. Действительно, многие веб-страницы сверстаны по образцам: часть содержимого берется из одного источника и вставляется куда-либо на страницу, другой фрагмент (из другого источника) помещается еще куда-то. Этот подход поощряют многие руководства по гипертекстовой разметке: «Вот кусок HTML-кода, скопируйте его и вставьте на страницу». Если копируется небольшая порция кода, то проблем обычно не возникает; но как быть с копированием и вставкой целых разделов? Тогда в руководствах писали, к примеру, так: «Вот кусок HTML-кода. Скопируйте его, вставьте в текстовый редактор и отредактируйте теги-заголовки, чтобы они согласовывались по вложенности с соответствующими заголовками страницы, на которую вы затем будете вставлять данный код».
ВHTML 4 не было обобщенного заголовочного элемента, а было шесть заголовков от <h1> до <h6>: числа в названиях тегов строго определяли порядок вложения. Контролировать такую иерархию, мягко говоря, неудобно, особенно на странице, которая не «написана» (в собственном смысле), а «собрана» из фрагментов. Эта проблема решена в HTML5 благодаря новым элементам, вводящим разделы, и новым правилам использования существующих тегов-заголовков. Если вы не боитесь применять семантические элементы верстки, советую писать так:
<article>
<header>
<h1>Моя запись в блоге</h1>
</header>
<p>Lorem ipsum… (и далее по тексту классического текста-"рыбы")</p>
</article>