с классом lion. Впрочем, этот класс можно также установить напрямую тегу
. Окончательный код нашего подвала представлен в примере 8.3. Пример 8.3. Код подвала Положение льва укажем с помощью позиционирования. Для этого родительскому элементу footer следует указать свойство position как relative, а элементу lion как absolute. В таком случае свойства left и top управляют координатами относительно родителя, т.е. footer. Однако здесь есть одна сложность, footer занимает всю ширину страницы, а льва надо установить относительно макета в 760px. Значение для left указать нельзя, потому что мы не знаем, чему в пикселах равно расстояние от левого края браузера до левого края макета. Воспользуемся следующим трюком: для left установим 50%, что выровняет край рисунка по центральной оси, а относительно этого положения будем сдвигать рисунок свойством margin-left с отрицательным (влево) или положительным (вправо) значением.
.footer { position: relative; /* Относительное позиционирование */ } .lion { position: absolute; /* Абсолютное позиционирование */ left: 50%; /* По центру */ margin-left: -347px; /* Сдвигаем влево */ top: 3px; /* От верхнего края */ } Значения margin-left и top подбираются опытным путём, чтобы добиться наилучшего результата. Добавление рисунка вносит путаницу с фоновыми рисунками, и они начинают накладываться друг на друга, так что пора восстановить их исконное место. Для начала сдвинем рисунок с травой вниз на 53 пиксела. Это число получилось вычитанием из высоты рисунка льва (80px) высоты рисунка травы (27px). И подымем наш подвал целиком вверх на 77–80 пикселов. Во-первых, поднять надо, потому что из-за рисунка льва подвал опускается вниз, во-вторых, получим наложение подвала на границу макета, как показано на рис. 8.10. К сожалению, все эти действия не имеют никакого смысла, потому что из-за эффекта схлопывающихся отступов положение элементов считается совсем иначе. Отменить этот эффект можно разными способами, к примеру, с помощью полей, границ, абсолютного позиционирования, но в конкретном случае они не подходят. Здесь поля и границы окажутся лишними. Так что вспомним ещё один метод и добавим свойство overflow со значением auto. Вообще-то это свойство при необходимости добавляет полосы прокрутки, если контент не помещается в заданные размеры. Но сейчас overflow нам нужно только для одного — отменить схлопывающиеся отступы. background: url(images/grass.png) 50% 53px no-repeat; /* Фоновый рисунок травы */ margin-top: -77px; /* Поднимаем вверх */ overflow: auto; /* Отменяем схлопывающиеся отступы */ position: relative; /* Относительное позиционирование */ } Текст в подвале и зелёный фон также поднимается вверх, поэтому для слоя footer-bg надо установить отступ сверху на высоту рисунка льва. .footer-bg { margin-top: 80px; } Окончательно для контента основной части добавляем поле снизу равное высоте рисунка, чтобы текст не закрывался подвалом. .content-white { padding: 20px 40px 80px; /* Поля */ } Стиль для подвала приведён в примере 8.4. Пример 8.4. Стиль подвала .footer { background: url(images/grass.png) 50% 53px no-repeat; /* Фоновый рисунок травы */ margin-top: -77px; /* Поднимаем вверх */ overflow: auto; /* Отменяем схлопывающиеся отступы */ position: relative; /* Относительное позиционирование */ } .lion { position: absolute; /* Абсолютное позиционирование */ left: 50%; /* По центру */ margin-left: -347px; /* Сдвигаем влево */ top: 3px; /* От верхнего края */ } .footer-bg { background: #e2ed9c; /* Цвет фона подвала */ margin-top: 80px; /* Сдвигаем вниз */ } .copyright {
width: 740px; /* Ширина макета без полей */ padding: 0 10px 10px; /* Поля */ margin: auto; /* Выравнивание по центру */ color: #526118; /* Цвет текста */
} .copyright p { margin: 0 0 5px 170px; /* Отступы текста */ }
Осталось решить последний вопрос, делать подвал висящим или нет (см. рис. 8.11). Вся реализация, показанная выше, направлена на висящий подвал, изменить поведение можно всего-навсего перенеся background из footer-bg в BODY. Хотя это действие установит зелёный цвет фона для всей страницы целиком, заметно это будет только там, где видно пространство под подвалом. Для остальных разделов вроде шапки, основной части задан свой собственный цвет фона, поэтому включение фона для селектора BODY на них не повлияет. BODY { background: #e2ed9c; /* Цвет фона подвала */ }
Главная страница Главной называется веб-страница, с которой обычно начинается просмотр сайта. Она открывается при наборе адреса сайта и в каком-то смысле является его «лицом». Именно с главной страницы начинается знакомство посетителей с сайтом, поэтому надо сразу передать тематику сайта и быстрый доступ к содержанию. На главной странице нашего учебного сайта представлено три блока — краткое описание сайта, предупреждение и ссылки на страницы с описанием методов. Во всех блоках используется текст, поэтому в первую очередь нужно задать его стилевое оформление. Гарнитуру шрифта, его размер и межстрочное расстояние (интерлиньяж) можно задать через универсальное свойство font. BODY { font: 0.9em/1.2 Arial, Helvetica, }
sans-serif;
Первое значение 0.9em означает размер шрифта, второе после слэше интерлиньяж, а после пробела следует набор шрифтов, которые следует использовать на странице. Если первый идущий шрифт Arial не будет найден в операционной системе, браузер начнёт искать шрифт Helvetica. Если и он не обнаружится, будет выбран любой другой рубленый шрифт, или как их ещё называют, без засечек.
Блок с предупреждением В этом блоке используется два изображения: одно для головы, второе для заголовка текста (рис. 8.12).
Рис. 8.12. Блок с предупреждением Само расположение элементов можно выполнить разными методами, к примеру, установить рисунок с головой как фоновый без повторения и сдвинуть текст вправо, либо сделать обтекание через float. Рассмотрим эти методы подробнее.
Метод 1. Использование обтекания Для начала нам требуется создать код, к которому в дальнейшем приложить стили. Плавающие элементы всегда располагаем в начале, поэтому рисунок с головой вставляем первым, затем уже следует заголовок и текст (пример 8.5). Пример 8.5. Блок с предупреждением
Все перечисленные на сайте методы ловли льва являются теоретическими и базируются на вычислительных методах. Авторы не гарантируют вашей безопасности при их использовании и снимают с себя всякую ответственность за результат. Помните, лев это хищник и опасное животное!
В стилях для изображения головы ставится свойство float со значением left, а тексту заголовка и абзаца смещение левого края через margin-left. Для отмены обтекания к слою warning добавляется overflow со значением hidden.
.warning { overflow: hidden; /* Отменяем обтекание */ margin: 30px 0; /* Отступ сверху и снизу */ } .voodoohead { float: left; /* Обтекание справа */ } .warning H2, .warning P { margin: 0 0 0 70px; /* Отступы */ }
Метод 2. Фоновая картинка Код останется практически неизменным по сравнению с примером 8.5, только изображение головы следует убрать, поскольку оно добавляется через свойство background. .warning { overflow: hidden; /* Отменяем обтекание */ margin: 30px 0; /* Отступ сверху и снизу */ background: url(images/head.png) no-repeat; min-height: 92px; /* Минимальная высота */ } .warning H2, .warning P { margin: 0 0 0 70px; /* Отступы */ } Также следует добавить свойство min-height, чтобы при уменьшении высоты блока фоновая картинка не обрезалась. Значение равно высоте изображения head.png.
Блок со ссылками Этот блок предназначен для быстрого перехода к определенной статье сайта, содержит заголовки статей со ссылками и описание. Заголовки вставим через тег
со ссылкой внутри, описание через
. Тег
скорее всего нам в дальнейшем ещё понадобится, поэтому надо отличать стиль в этом блоке от в другом месте. Это можно сделать, добавив класс title к каждому тегу и определив его стиль или вставив дополнительный блок link и воспользоваться контекстными ссылками. Это решение оптимальное, поэтому реализуем именно его. Для упрощения расчетов некоторые реальные величины заменяются их приближенным аналогом, которые хотя и влияют на точность результата, находятся в пределах допустимой погрешности вычисления.
Самый простой метод поиска льва основанный на переборе.
В стилях устанавливаем цвет ссылок через свойство color, цвет ссылок при наведении на них курсора мыши с помощью псевдокласса :hover и параметры тега . A { color: #1b75bc; /* Цвет ссылок */ } A:hover { color: #d6562b; /* Цвет ссылок при наведении */ } .link H2 { font-weight: normal; /* Нормальное начертание */ margin-bottom: 0; /* Отступ снизу */ }
Внутренняя страница Внутренними будем называть все веб-страницы сайта кроме главной. Все они основаны на двухколоночном фиксированном макете, где в правой колонке располагается навигация (ссылки по сайту) и блок с интересной информацией, а в левой текст статьи.
Двухколоночный макет Это самый простой из существующих макетов после одноколоночного, неудивительно, что для его построения существует несколько способов. Воспользуемся сочетанием свойств float и margin-right, которые уже неоднократно упоминались в книге. Для правой колонки необходимо установить float со значением right, а для левой margin-right со значением равным ширине правой колонке и расстоянию между колонками. В коде при этом плавающий элемент идёт первым, поэтому вначале следует правая колонка.
Левая колонка
В стиле для слоя sidebar указываем его ширину (width) и включаем выравнивание по правому краю с помощью float. Для слоя content только указываем margin-right. .sidebar { /* Правая колонка */ width: 200px; /* Ширина правой колонки */ float: right; /* Обтекание */ } .content { /* Левая колонка */ margin-right: 240px; /* Отступ справа */ }
Навигация на сайте Традиционно для создания различных меню применяется список, иными словами, комбинация тегов и - . Это связано с тем, что маркированный список сам по себе напоминает меню, к тому же легко модифицируется с помощью стилей. Навигация на нашем учебном сайте сделана в виде вертикального меню, поэтому логично будет воспользоваться списком. Только его придётся изменить под наши нужды — убрать маркеры и выделить текущий пункт меню градиентным фоном и рисованным маркером (рис. 8.13).
Рис. 8.13. Вид меню на сайте Код меню на всех страницах сайта практически одинаков (пример 8.6), только меняется текущий пункт. Пример 8.6. Код меню Здесь класс current предназначен для выделения текущего пункта меню фоновым рисунком.
Дополнительный тег <span> нужен для установки рисунка маркера. Можно было пойти другим путём и включить маркер через свойство list style-image, но браузеры такой маркер по-разному позиционируют, поэтому воспользуемся универсальным решением и вставим маркер как фоновый рисунок. Для начала необходимо подготовить изображения. Нам понадобится градиентный рисунок размером 192х25 пикселов (рис. 8.14). Почему размер этого рисунка равен не 200 пикселов, как ширина колонки? Мы опять воспользуемся той хитростью, что у нас цвет у градиента справа совпадает с цветом фона и плавно переходит к нему. Подобное ухищрение уже применялось у нас для создания градиента основной части страницы и позволило уменьшить размер изображения.
Рис. 8.14. Градиент для меню В качестве маркера для текущего пункта меню ставится небольшое изображение на прозрачном фоне (рис. 8.15).
Рис. 8.15. Маркер пункта меню Стиль для создания меню показан в примере 8.7. Пример 8.7. Меню ul.menu { list-style: none; /* Убираем маркеры */ margin: 40px 0; /* Отступ сверху и снизу */ padding: 0; /* Поля */ } ul.menu li { padding: 5px; /* Поля */ font-size: 0.8em; /* Размер шрифта */ font-weight: bold; /* Жирное начертание */ } ul.menu a, ul.menu span { padding: 5px; /* Поля */ } ul.menu li span { padding-left: 25px; /* Поле слева */ background: url(images/bullet.png) no-repeat 5px center; /* Маркер */ } ul.menu li.current { background: #f9f2e2 url(images/menu-gradient.png) repeat-y; /* Градиент */ } Маркер выводится фоном, поэтому текст накладывается на него сверху. Для правильного отображения текст приходится сдвигать вправо свойством padding-left. В параметрах свойства background рисунок устанавливается по центру вертикали и смещается вправо от края на пять пикселов.
Блок «Интересная информация» Блок представляет собой цветной прямоугольник, внутри которого выводится заголовок и текст. Под блоком отображается небольшая тень (рис. 8.16).
Рис. 8.16. Вид блока Такую тень можно вывести в виде обычного изображения или фоновой картинки. Мы стараемся
сделать код более эффективным, поэтому, чем меньше тегов используется, тем лучше. По возможности оформление необходимо переносить в стили, так что тень будем выводить стилевым свойством background. В блоке кроме тени используется фоновый цвет, нужно учесть этот момент и сделать рисунок тени на белом фоне (рис. 8.17), чтобы при наложении он перекрывал фон.
Рис. 8.17. Изображение тени Код для блока получается достаточно простым и содержит только заголовок и текст. Средний самец льва имеет длину около трех метров и весит от 180 до 230 килограмм.
Львы питаются не только убитыми животными, они также не брезгуют падалью.
Заголовок блока в виде рисунка помещён внутрь тега , что позволяет при отключении изображений вывести альтернативный текст увеличенного размера. Сам стиль показан ниже. .interest { background: #f2efe6 url(images/shadow.png) no-repeat 0 100%; /* Параметры фона */ padding: 10px; /* Поля */ font-size: 0.9em; /* Размер шрифта */ } .interest h3 { margin: 0 0 -10px; /* Отступы в заголовке */ } Фоновый рисунок прижимается к нижнему краю блока, поэтому в параметрах background указываем left bottom или 0 100%, как в примере.
Заключение Мы сверстали две страницы сайта — главную и внутреннюю, но это в действительности не означает, что на сайте их столько же. Это всего лишь шаблоны, которые задают типовой вид документов. Далее шаблон используется для CMS (content management system, система управления контентом), чтобы автоматизировать процесс создания новых страниц на сайте. Тема CMS выходит за рамки этой книги, поэтому сайт сделан по старинке — с помощью набора HTML-файлов. Окончательно его можно посмотреть по адресу http://liondesert.narod.ru. Сайт расположен на бесплатном хостинге Narod.ru, у которого есть две особенности, о которых следует знать: 1. для страниц используется кодировка Windows-1251; 2. на страницы автоматически добавляется рекламный баннер, который «портит» наш код, в итоге он перестаёт быть валидным. Все примеры в книге даются в кодировке UTF-8 как наиболее прогрессивной и универсальной, но в подобных условиях от прогресса приходится отказываться, приспосабливаясь под имеющиеся условия. Поэтому примеры перед публикацией на сайте пришлось слегка изменить. Главная страница сайта в браузере выглядит следующим образом (рис. 8.18).
Рис. 8.18. Готовый сайт Если вы хотите использовать для сайта CMS, кодировку UTF-8 и выводить только свои желаемые баннеры или не показывать их вообще, следует обратить внимание на платный хостинг, предоставляющий эти возможности. В частности, сайт http://lionindesert.ru являющийся копией сайта на Народе, расположен на платном хостинге. Его основное отличие в том, что он свёрстан на HTML5, о котором пойдёт речь в следующей главе.
Глава IX
Использование HTML5
Использование HTML5 Примеры в этой книге преимущественно были сделаны на XHTML, он хорошо подходит для обучения и вырабатывания правильной манеры вёрстки благодаря своим формальным правилам и более жёсткому, по сравнению с HTML синтаксису. Однако за десять лет, прошедших со дня выпуска, XHTML морально устарел и уже не соответствует современным условиям. В частности, нет штатных средств для проигрывания аудио и видеороликов, нет поддержки геолокации, возможности рисовать непосредственно в браузере, не хватает некоторых элементов форм и много другого. Конечно, часть этих проблем давно решается через сторонние плагины к браузеру, например, Adobe Flash воспроизводит видео, Google Gears реализует локальные базы данных и запуск скриптов в фоновом режиме. Язык программирования JavaScript позволяет реализовать недостающий функционал форм и различные эффекты на странице. Но все эти технологии имеют определённые ограничения — плагины нужно устанавливать дополнительно, при этом они могут не работать, как Flash на iPhone и iPad, далеко не всё умеет и JavaScript. Популярность мобильных устройств, развитие каналов связи переместило акцент веб-технологий на мультимедиа, т.е. воспроизведение потокового аудио и видео, а также соответствующих файлов. Ничего этого в XHTML нет. W3 Consortium, разработчик спецификаций HTML и XHTML, начал работать над XHTML 2.0, в котором указанные недостатки предыдущей версии бы обходились. В результате этот проект оказался замороженным и не завершён. Обеспокоенные медленным ходом работ разработчики браузеров Safari, Firefox и Opera основали свою собственную организацию WHATWG (Web Hypertext Application Technology Working Group, Рабочая группа по разработке гипертекстовых приложений Интернета), которая подхватила упавшее знамя. Идеи W3C, современные потребности пользователей и мнение вебразработчиков воплотилось в новом языке разметки названном HTML5. Следует понимать, что, несмотря на схожесть названий, HTML5 не является преемником HTML4 или XHTML. Скорее речь идёт о новом языке Web Applications 1.0, который в маркетинговых целях назван знакомой аббревиатурой и построен на базе HTML. Официально стандарт HTML5 ещё не завершён, но современные браузеры уже умеют частично с ним работать. Итак, что же интересного нам даёт HTML5? Вот некоторые его возможности. Поддержка геолокации — определение местоположения пользователя на карте и использование этой информации для вычисления маршрута его движения, вывода близлежащих магазинов, кинотеатров, кафе и других данных. Воспроизведение видеороликов. Воспроизведение аудиофайлов. Локальное хранилище — позволяет сайтам сохранять информацию на локальном компьютере и обращаться к ней позже. Фоновые вычисления — стандартный способ запуска JavaScript в браузере в фоновом режиме. Оффлайновые приложения — страницы, которые могут работать при отключении Интернета. Рисование — внутри тега