На этой странице:
Построим “резиновую” страницу с двумя колонками, заголовочной частью и подвалом.
|
|
Заголовочная часть
(блок
Основное содержание
(блок |
|
|
Все блоки, кроме |
Запишем 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, иначе (если проблема критична для вашей страницы) для многоколонной вёрстки можно использовать плавающие блоки (ссылка). |