На этой странице:
Построим “резиновую” страницу с двумя колонками, заголовочной частью и подвалом.
|
Заголовочная часть
(блок
Основное содержание
(блок |
|
Все блоки, кроме |
Запишем HTML-код будущей страницы:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML lang="ru"> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=windows-1251"> <LINK rel="stylesheet" type="text/css" href="main.css"> <TITLE>Роботландия</TITLE> </HEAD> <BODY bgcolor="white" text="black"> <DIV class="header"><H1>Роботландия</H1></DIV> <HR class="none"> <DIV id="content">Содержание</DIV> <HR class="none"> <DIV id="sidebar">Боковая панель</DIV> <HR class="none"> <DIV id="footer">Подвал</DIV> </BODY> </HTML>
|
Так это выглядит без CSS. Горизонтальные линии введены для браузеров, которые CSS не поддерживают — они разделяют страницу на логические части.
Для класса |
В соответствие с макетом построим набор CSS-определений:
HTML {background:white;} BODY { position:relative; /* Будем позиционировать от BODY */ margin:10px; padding:0; font:small Georgia, serif; color:#2A3D34; border:1px solid #638F7B; } /* Заголовок */ .header { border-bottom:1px solid #638F7B; } .header H1 { color:#a68400; margin:0;padding:0; padding-left:180px; font:bold 70px Georgia,serif; letter-spacing:2px; line-height:110px; } /* Содержание */ #content { margin-right:35%; padding:10px; } /* Боковая панель*/ #sidebar { position:absolute; right:0; top:110px; width:35%; } /* Подвал */ #footer { padding:5px 10px; border-top:1px solid #638F7B; white-space:nowrap; font:0.7em Tahoma,sans-serif; color:white; background:#828377; } /* Для устранения элементов при включённом CSS */ .none {display:none;}
|
Так это выглядит в окне шириной 780 пикселов. |
|
А так — в более широких окнах. Страница, действительно, обладает “резиновым” характером. Для блока основного содержания задан внутренний отступ в 10 пикселов, а для боковой панели — нет. Вот чем объясняется разное положение текста в этих блоках. |
Нельзя задавать для |
Для |
Теперь всё в порядке. Правда, порядок установлен ценой дополнительного блока, который не имеет отношения к структуре, а введён для визуальных надобностей. Плохо. Увы, мы живём не в идеальном мире, и дополнительный блок появился из-за отсутствия нужных возможностей в текущей версии CSS. |
Поступим так. Вложим содержимое <DIV id="sidebar"> <DIV class="wrap"> Боковая панель </DIV> </DIV>
Внутренние отступы укажем для блока #sidebar .wrap { padding:10px; } |
Заголовок H1
был заранее погружен в блок
header
:
<DIV class="header"><H1>Роботландия</H1></DIV>
Причина — снова визуальная необходимость: желание
прикрепить к заголовочной части две фоновые картинки. Одну
картинку будем использовать как паркетную заливку в блоке
header
, другую — для показа логотипа в блоке
H1
:
.header { background:white url(pic/h1bg.gif); /* Паркетная заливка */ border-bottom:1px solid #638F7B; } .header H1 { background:url(pic/logo.png) no-repeat 10px 10px; /* Лого */ color:#a68400; margin:0;padding:0; padding-left:180px; font:bold 70px Georgia,serif; letter-spacing:2px; line-height:110px; zoom:1; }
Фоновая заливка:
Логотип:
В CSS планируется возможность закрепления нескольких фоновых картинок за одним блоком, но пока это не реализовано, приходится для двух фоновых картинок использовать два блока. |
Конечно, логотип можно выводить не фоном, а при помощи элемента
Обратите внимание на последнее правило в стилевом определении для
Свойство
По прямому назначению правило Практическая рекомендация: если во всех браузерах всё нормально, а в IE что-то не так, попробуйте применить к проблемному блоку одно из следующих “заклинаний”: * HTML .block { height:1%; } .block { width: 100%; } .block { position: relative; } .block { zoom: 1; } |
Наполним страницу реальным содержимым и опишем дополнительные оформительские стили.
|
/* Приближаем заголовок к своему абзацу */ H2, H3, H4, H5, H6 {margin-bottom:0.2em;} P {margin:0.2em 0 1em;} /* Размеры заголовков */ H2 {font-size:1.4em;} H3 {font-size:1.2em;} /* Выделение */ EM {font-weight:bold;} /* Рисованный маркер списка */ UL LI { list-style-image:url(pic/marker.gif); } |
Займёмся теперь фоновой полоской, создающей ложные колонки. В
резиновом макете ширина блока BODY
переменная, поэтому
подход, описанный в
примере 2, не походит.
Дуглас Бауман (ссылка) и Эрик Мейер (ссылка) доработали идею Дэна Седерхольма (ссылка) для пропорциональных колонок и предложили (в 2004 году) способ, описанный ниже.
|
Общая длина фоновой полоски делается настолько большой, например, 2000 пикселов, чтобы она смогла покрыть ширину окна на огромном мониторе.
Полоска делится разными цветами в таком же процентном отношении, что и наши
колонки ( |
Для вывода полоски используется стилевое правило для BODY
:
BODY
{
position:relative; /* Будем позиционировать от BODY */
margin:10px; padding:0; /* Отступы */
font:small Georgia, serif; /* Шрифт */
color: #2A3D34; /* Цвет текста */
border:1px solid #638F7B; /* Рамка */
background:white url(pic/fon.png) 65% top repeat-y;
}
Две вертикали, одна на элементе, другая на картинке, проведённые в
65% от левого края (соответственно, элемента и картинки), будут
совпадать при любой ширине BODY
.
Это как раз то поведение, которое нам нужно для создания ложных колонок.
Суть метода в особенностях вывода фоновой картинки, положение
которой задано в процентах. Подробности смотрите в описании свойства
background
(ссылка).
Ниже приводится краткое описание этого алгоритма.
Если стартовое положение картинки (место с которого она размножается по фону) задаётся в процентах, картинка размещается так, чтобы совпали две точки, одна из которых расположена на картинке, другая на элементе. Положение обеих точек (отдельно для картинки, отдельно для элемента) вычисляется в заданном процентном отношении.
Пусть, например, для элемента задано:
background: url(pic.png) 50% 50%
.
Стартовое положение определится таким образом, чтобы центр
элемента совместился с центром картинки:
|
Пример построен. Напомним ограничение используемой модели (в двух последних примерах): предполагается, что содержимое боковой панели короче блока с основным содержанием.
Если это не
так, боковая панель перекроет подвал и даже может вылезти вниз за пределы
В рамках используемой модели (с абсолютным позиционированием) решение проблемы возможно средствами JavaScript, иначе (если проблема критична для вашей страницы) для многоколонной вёрстки можно использовать плавающие блоки (ссылка). |