Библиотека Интернет Индустрии I2R.ru |
|||
|
Пример верстки CSSПродолжение. Предыдущие материалы:
17.01.06 Настало время после долгой нудной теории верстки CSS’ом наконец уже что-нибудь осмысленное сверстать. В этой статье я покажу от начала до конца один из вариантов верстки трехколоночной страницы. Пример опирается на предыдущие статьи “Учебника“, и если в этой статье будут какие-то неясности, ответы надо искать в них. И хотя пример может быть полезен и сам по себе, как просто готовый шаблон, главная его цель — показать в действии все механизмы CSS, о которых я писал раньше, дать их почувствовать, чтобы вы могли их свободно применять так, как это нужно вам. С места в карьер — вот то, что получится в результате: Сразу должен оговориться по поводу графического дизайна. Я совершенно не дизайнер, и тот “дизайн”, что на картинке, совершенно не претендует хоть на какую-то художественную ценность. Воспринимайте его как учебный макет. СодержимоеСоздание страницы начинается с определения структуры ее содержимого. Надо решить, из чего по-крупному страница состоит, и как оно между собой связано. Не мудрствуя лукаво я решил сымитировать содержимое некоторого простенького гипотетического корпоративного сайта (возможные сходства с реальными сайтами случайны!):
Теперь превратим все это в HTML. Вот живая страница с тестовым текстом, которая и будет дальше верстаться. Для удобства восприятия структуры вот ее код без текста:
Если сравнить этот код с тем списком содержимого страницы, что я привел чуть раньше, то можно увидеть, что он ее полностью повторяет. Все просто. Вот меня спрашивают, зачем там на странице “рингтоны”. Откуда я знаю? Все продают рингтоны, почему мы не должны!? ВалидацияПро валидацию я написал исключительно для полноты изложения, и напрямую с остальной статьей это не связано. Поэтому, если вам оно не очень интересно, можете смело эту часть пропустить и перейти сразу к главе “Верстка”, на понимание это не повлияет. Моя точка зрения на относительную бесполезность валидации, возможно, достаточно экстремальна для учебника, поэтому я решил, что эта страница должна таки быть валидной по стандарту HTML 4.01 Strict. Это можно проверить валидатором на W3C. Вместе с тем, как можно видеть, на этой валидной странице отсутствуют теги Пропустил я эти теги отчасти для того, чтобы продемонстрировать эту не очень широко известную особенность HTML, и отчасти потому что так код проще читается. ВерсткаПо ходу всей верстки я буду давать ссылки на страницы, которые показывают до чего мы дошли к данному моменту. Но для получения максимального удовольствия я рекомендую делать верстку непосредственно у себя на компьютере по ходу чтения. Скачайте HTML-файл, графику и создайте рядом пустой файл “style.css”. Или сразу скачайте весь архив всех шагов. ОрганизацияПервое, о чем стоит подумать — это организация CSS. Его можно написать множеством способов, среди которых самый плохой — это пихать все подряд в один файл в порядке “как придумалось”. Это очень быстро приводит к состоянию, когда, чтобы понять, как, скажем, убрать такой-то отступ, приходится прочесывать файл вперед и назад много раз. Поэтому стилевые правила надо как-то группировать. Первый способ, который приходит в голову — это группировка по блокам информации, когда вместе находятся все правила, определяющие вид какого-то блока (новостей, шапки, навигации): и расположение, и шрифты, и цвета и все прочее. Однако в этом случае трудно менять какую-то одну составляющую дизайна: цветовую схему или набор шрифтов, потому что они все разбросаны по файлу. Есть другой способ группировки — когда рядом находится то, что приходится часто одновременно менять:
… и получается, что правила для шапки могут находиться в разных местах файла. Это кажется изначально странным, но оказывается удобным, если делать дизайн не блок за блоком, а по слоям: сначала определить расположение, потом шрифты, потом цвета. Никакого единственно верного способа тут нет. Это во многом вопрос того, как именно вам удобно думать о дизайне страницы. Я предпочитаю второй способ, для чего сразу подготавливаю в CSS-файле такой скелет из комментариев:
РаскладкаДля начала давайте посмотрим еще раз на финальный дизайн. Первая его особенность — это то, что страница фиксированной ширины, и что она находится по центру. Мы используем механизм центрирования из статьи про поток, и для этого нам нужно сначала определиться, что центрировать и внутри чего. Поскольку у нас центрируется вся страница внутри окна, то мы будем центрировать
Установка ширины очевидна, а margin и padding могут вызвать вопросы. Дело в том, что для совместимости браузеры ставят для Следующая неочевидность — это где тут элемент Еще одна вещь. Очень, очень часто верстальщики игнорируют элемент Теперь займемся блоками с шапкой, основным содержимым и подвалом. Они каждый занимают всю ширину своего контейнера ( Разложим колонки. Для этого можно воспользовать либо абсолютным позиционированием, либо float’ами. Но позиционирование нам, очевидно, не подойдет, потому что высота сайта у нас не фиксирована, а зависит от содержимого. Поэтому — float’ы. Напомню, в статье про float’ы я описал два механизма их построения: в одном float’ятся все колонки, а в другом одна колонка остается статической. Смысл этого второго варианта проявляется при изменении ширины колонок, но у нас ширина всей страницы фиксирована. Зато второй вариант не дает менять колонки местами. А вот это нам как раз понадобится. В HTML блоки, которые мы хотим превратить в колонки идут в таком порядке:
… а разложить их надо так, чтобы первые две поменялись местами: “sections” слева, а “main” — в середине. Для начала всех их надо заfloat’ить и задать им ширину:
Теперь перестановка. Помимо позиционирования в CSS есть еще один способ двигать блоки — margin. Чтобы переставить местами “main” и “sections” мы добавим слева первой положительный margin, а второй — отрицательный. Главное — их посчитать. С “main” все просто: она прижата у левому краю, и ее достаточно сдвинуть на ширину “sections” — 20%. Сама же “sections” стоит справа “main”, а значит от левого края ее сейчас отделяет и ширина “main”, и отступ в 20%, который мы только что добавили. В итоге, ее надо двигать влево на 20% + 55% = 75%. Промежуточный итог:
Промежуточный, потому что у нас есть Internet Explorer, в котором есть баг, который у float’ов, прижатых к краю, удваивает границу, заданную от этого края. Поэтому наши
Тут вся соль — в добавленном Последний штрих, который нам нужен для колонок — это сделать так, чтобы элемент “meta” отодвигался под самую длинную колонку. Для этого у нас удачно есть элемент “content”, в котором все три колонки лежат. Сделаем, чтобы он их охватывал (все подробные объяснения — в статье про float’ы):
Настало время посмотреть на то, что получилось к этому моменту. Все уже начинает занимать нужные места. Следующий шаг — сдвинуть форму поиска. Она сейчас висит в левой колонке, а нам хочется видеть ее в заголовке справа вверху. Для таких радикальных перестановок подходит абсолютное позиционирование:
В установке Но это не все. Дело в том, что таким образом форма отнесется к верхнему правому краю окна, а не 700-пиксельного
Вот теперь форма будет располагаться в правом верхнем углу Но все равно не совсем там, где надо. У всей нашей раскладки есть еще одна большая проблема, и чтобы увидеть ее наглядно, стоит просто временно раскрасить основные блоки страницы фоновыми цветами:
И вот как оно выглядит. Тут надо отвлечься от кошмарного общего внешнего вида и обратить внимание на правый верхний угол формы поиска. Он отстоит на положенные 20 пикселов от края заголовка, но и сверху и снизу самого заголовка есть отступы, которые мы не планировали. И если посмотреть вниз, то и вокруг нижнего блока они тоже есть. Это проявления вываливания границ элементов
Одна маленькая деталь. В первом случае я просто обнулил margin у Теперь никаких белых полос быть не должно, и форма поиска должна висеть на нужной высоте. Она сама по себе еще огромная и вылезает вниз, но это уже не относится напрямую к раскладке и устранится потом при тонкой настройке. Что нам еще нужно от раскладки — так это один замечательный эффект, который придаст ей более завершенный вид. Если на странице мало текста (попробуйте просто уменьшить шрифт в браузере на пару размеров), то видно, что подвал начинается сразу после текста, и за ним до конца окна много пустого пространства. Это некрасиво. Хочется, чтобы короткая страница занимала всю высоту окна, а подвал всегда прижимался к нижней кромке страницы. Переведем это все с русского языка напрямую на CSS:
Но это, конечно, только начало. Во-первых, значение 100% для
У С
Следующая проблема — абсолютно позиционированный подвал. Он, конечно, замечательно будет висеть внизу, но он больше не находится после блока содержимого, а изымается из общего потока страницы и висит над ним. А это означает, что на длинных страницах текст будет беззастенчиво подлезать под подвал. Чтобы этого не происходило, мы добавим после колонок страницы гарантированное пустое пространство, над которым подвал и будет висеть. Сделать это, в общем-то, просто: поставить блоку с колонками (”content”) нижний padding. Вопрос в том — сколько. Сейчас точная высоты подвала неизвестна, она определяется текстом в нем. Однако мы вполне можем предполагать, что в блоке для всякой мелкой мета-информации не должно быть слишком много текста. Поэтому мы просто зарезервируем под нее достаточно места. Скажем, 40 пикселов. Все это выливается в такие правила:
42 пиксела снизу “content” — это 40 пикселов высоты подвала и по 1 пикселу его padding’а. Раскладка готова. Посмотрим на результат. ШрифтыДля меня одно из самых мешающих ощущений при подготовке раскладки это то, что из-за крупных и неказистых шрифтов она, даже когда готова, выглядит как команда биатлонистов в горбатом Запорожце (с лыжами и винтовками, разумеется). Поэтому следующее, что мы сделаем — настроим шрифты. Как правильно задавать шрифты — тема одной из самых горячих священных войн в CSS-сообществе, вдаваться сейчас в подробности я даже не попытаюсь :-). Лишь опишу способ, которым пользуюсь сам. Суть способа вкратце такова. Сначала странице (в лице элемента Итак, основной шрифт:
На этой записи стоит остановиться подробно. Свойство У
Значения можно пропускать, но не менять местами. Таким образом, наш “ Дальше идем по блокам страницы и меняем шрифты. Шапка, потом заголовок внутри главной области страницы:
Обращаю внимание, что при изменениях какой-то одной характеристики шрифта уже нельзя пользоваться свойством Установка Дальше зададим одинаковые шрифты для левой и правой колонок и их основных заголовков:
Тут стоит обратить внимание на размер шрифта в заголовках. Проценты размера шрифта всегда считаются от размера шрифта родителя. Поэтому 125% здесь берутся не от 10pt основного шрифта, а от шрифта блоков “news” и “sections”. Его даже нетрудно посчитать: 80% от 10pt — это 8pt. 125% от 8pt — это 10pt. Определим остальные шрифты, тут уже нет никаких загадок:
Удачно, что в форме поиска у нас мало элементов, поэтому их все (оба) можно однозначно определить просто по названию тега. Если туда добавится какой-нибудь Итак, со шрифтами закончили. Цвета и декорНам осталось расцветить страницу. Помимо собственно цветов в этот же этап я объединил еще и декор: графические украшательства, градиенты, рамки, а также отступы вокруг текста. Хоть цвета и декор — вещи разные, я рекомендую их делать одновременно, так просто удобней. Однако я все же буду разносить их в разные части CSS-файла для того, чтобы оставить на будущее возможность управлять цветами отдельно. Заголовок и подвалНачнем с заголовка и подвала, потому что они покрашены почти одинаково: белый цвет текста на синем фоне. Только у заголовка есть еще и градиент. Еще туда же приплетается форма поиска, потому что визуально она сидит в заголовке.
На примере заголовка расскажу про свойство “
Все параметры можно пропускать и можно даже менять их местами. Градиент нарисован на картинке размерами 10х50: Она располагается в левом верхнем углу (” Обратите внимание, что картинка градиента по высоте не закрывает весь блок заголовка. Для того, чтобы там не зияла пустота, в свойстве Формат цвета с тремя цифрами #45F — это сокращенная запись, эквивалентна значению #4455FF Теперь надо добавить в заголовок эксклюзивный дизайнерский фирменный логотип. Он тоже задается в виде фоновой картинки, но мы не можем ее привязать к блоку “title”, потому что там фоновая картинка уже есть (а задать их несколько в текущей версии CSS нельзя). Но у нас в заголовке есть еще один элемент — Очень удобно, что он полностью заполняет “title”, не оставляя вокруг себя свободного места. Так вышло как раз потому, что когда мы устраняли проваливание границ, то заменили все margin’ы вне Вот сама картинка логотипа: Код:
Пара пояснений. Картинка располагается точно в левом верхнем углу для того, чтобы ее градиентный фон визуально сливался с фоном блока “title”. Если бы их расположение не совпадало, совместить градиенты было бы проблемой. Отступ в 60 пикселов — это фактически место под картинку. Это очень распространенный способ навешивания оформительских картинок рядом с элементами: назначить картинку фоном и подвинуть содержимое padding’ом. Осталось привести в порядок форму поиска. Она должна быть слегка поменьше. Чтобы добиться этого эффекта мы уберем у абзацев внутри нее все отступы и уменьшим текстовое поле:
Все просто. Посмотрим, что получилось. Заголовок и форма выглядят слегка плохо в IE и, на этот раз, еще и Опере. Сначала разберемся с первым. Во-первых, не видно логотипа. Исправляется эта штука совершенно магическим методом:
Высота тут, конечно, ни при чем. Это просто одно из свойств IE, которое в данном случае не оказывает никакого прямого действия, зато “чинит” странное поведение блоков. Еще такими же “целительными” свойствами обладают Описать, как подбираются такие решения, почти нереально… Просто, если какой-то блок ведет себя не так, как вроде должен бы, стоит попробовать поназначать ему эти свойства. Во-вторых, кнопка “Искать” переносится на другую строку. Запретим переносы в абзацах:
Но теперь кнопка некрасиво прижимается к текстовому полю. Отодвинем:
В Опере проблема другого плана. Элемент Тема об ошибках в браузерах, надо ли их править, как и когда, слишком обширна, чтобы излагать ее здесь, я лучше вернусь к ней позже отдельной статьей. Осталась здесь последняя мелкая стилизация — уменьшить отступы между абзацами в подвале. Тут все совсем просто:
КолонкиПод колонками у нас есть сложный узор — градиент и пунктирные линии, поэтому проще всего использовать для их визуализации метод “faux columns”, на который я ссылался в статье про float’ы. Для этого делается фоновая картинка шириной 700 пикселов, на которой рисуются градиент и пунктиры по ширине колонок (140 пикселов левая колонка, 175 — правая). А затем задается фоном к
… (заодно тут же и цвета фона и текста). Совсем не похоже. Фон, который мы назначили центрированному 700-пиксельному Чтобы это поведение отменить, достаточно дать какой-нибудь фон элементу Для фона окна я обожаю фоновые узоры :-). Кроме того, в последнее время это, кажется модно.
Отсутствие всяких “ Вот теперь колонки должны выглядеть прилично. Левая колонкаДля начала, мне подумалось, что заголовок “Разделы” в левой колонке будет лишним (эдакий дизайнерский ход). Поэтому он просто убирается:
Следующий объект стилизации — меню. Оно задано списком
Разобравшись с отступами, расцветим сами элементы:
На что тут обратить внимание:
Тут нас традиционнно подводит IE, у которого вертикальное расстояние между элементами списка сильно больше, чем надо. Это похоже на какие-то лишние отступы, и чинится уже знакомым “holly hack’ом”:
Колонка новостейСтилизация заголовка в новостях очень напоминает главный заголовок. Сюда тоже кладется градиентный фоновая картинка, и здесь тоже надо убирать вываливание границ:
Дальше впишем даты новостей в начало абзацев и дадим им отступы друг от друга и от краев колонки:
Тут может возникнуть вопрос, почему отступ по краям внутри колонки задается ее внутренним элементам, а не самой колонке? Во-первых, потому что одному из элементов — главному заголовку новостей ( Это, можно сказать, правило: надо всеми силами избегать назначение декоративных отступов и рамок главным блокам раскладки. Иначе замучаетесь отлаживать. Посмотрим, как теперь выглядят новости. У нас остались две маленькие проблемы в этой колонке. Первая — вспомним, что IE удваивает отступ для float’ов, поэтому даты новостей слегка смещены дальше, чем надо. Быстро чиним:
Другая проблема в том, что дата первой новости прилипает к низу общего заголовка новостей. Вообще-то, так и должно было произойти, потому что ни у заголовка, ни у даты нет вертикальных margin’ов. У других дат такой проблемы нет, потому что перед каждой из них идет абзац ( Таким образом, проще всего это исправить, дав заголовку тоже отступ в 20 пикселов снизу. Тем более, что этот отступ там и по дизайну нужен. Исправим соответственно предыдущее правило для заголовка:
После всего проделанного, думаю, правила для ссылок “Подробнее…” со стрелочкам в объяснениях не нуждаются::
Небольшой хак для IE понадобился, потому что тот отчего-то отказался показывать стрелочки во второй ссылке. Главная колонкаВ главной колонке дел совсем немного. Стили заголовка и абзацев простые:
Ну и иллюстрацию слегка облагородить: сдвинуть влево и добавить рамочку фирменного синего цвета. Чтобы не делать единый стиль для любых картинок в тексте (у них ведь может быть разное назначение), я заранее назначил этой картинке отличительный признак — класс с названием “picture”. И в CSS мы будем стилизовать именно его:
ВсеНу вот, кажется, готово :-). Замечу, что это, конечно, учебный пример, а значит довольно простой. Некоторые вещи сделаны менее гибко, чем могли бы быть (например логотип можно было не завязывать на синий цвет шапки). Поэтому не стоит воспринимать это как выбитую в граните истину. В любом случае, в результате получилась страница с чистым HTML, который удобно править, и маленьким организованным стилевым файлом, который тоже удобно править. Чтобы показать гибкость всей этой системы, я в одной из следующих статей устрою тотальный редизайн страницы. Предыдущие материалы:
Эта статья - часть находящегося в процессе написания цикла под рабочим названием “Учебник”. Я рекомендую ознакомиться и с другими статьями, которые можно найти в категории “Учебник“, где они сейчас собраны в обратном хронологическом порядке. Статьи по теме: Автор: Иван Сагалаев |
|
2000-2008 г. Все авторские права соблюдены. |
|