Общие вопросы

Статьи, материалы, руководства, учебники о web-разработке и web-дизайну.

Пример реализации саморастягивающихся контейнеров

sprawling-containerБыло бы очень неплохо, если б ширина всех контейнеров, кроме одного (а именно основного содержимого), была задана жестко, а оставшийся один контейнер сам подгонял свою ширину под размер окна Web-обозревателя. Но как это сделать?

Создадим новую страницу и сохраним ее под именем default.htm (или под любым другим именем). Поместим на страницу наш первый контейнер, который будет содержать заголовок сайта, введем в него текст заголовка и отформатируем его.

<div class="header">
<h1>Сайт студента Васильева В. В.</h1>
</div>

Создадим для него стилевой класс под именем header, поместим его во внешнюю таблицу стилей styles.css (или разместим классы в документе .htm) и зададим для него такие параметры:

.header { 
width: 100%; /* поскольку мы делаем Web-дизайн, который будет подстраиваться под ширину окна Web-обозревателя */
float: left;
}

Привяжем готовый стилевой класс к заголовку сайта. После этого создадим второй контейнер, который станет разделителем.

<div class="spacer"> &nbsp; </div>

Стилевой класс, который мы к нему привяжем, будет называться spacer, и будет содержать всего один параметр:

.spacer { 
clear: both;
}

Теперь создаем очередной контейнер и помещаем в него набор гиперссылок.

<div class="nav"> 
<p><a href="#">&nbsp;Главная</a></p>
<p><a href="#">Увлечения</a></p>
<p><a href="#">Статьи</a></p>
<p><a href="#">Юмор</a></p>
<p><a href="#">Обо ине</a></p>
</div>

Стилевой класс этого контейнера — nav:

.nav { 
width: 80px;
float: left;
padding: 5px;
border: thin solid #000;
}

Здесь мы сразу включили в стиль рамки и отступы, чтобы потом не делать никаких исправлений.

На очереди — контейнер с основным содержимым.

<div class="main"> 
<h3>Здравствуйте! Здравствуйте! Здравствуйте!</h3>
<p>Будем знакомиться. Я - студент Васильев Василий Васильевич, для друзей - просто Василий. Я учусь в институте, а в свободное время занимаюсь Web-дизайном.</p><hr />
<p>На моём сайте вы можете найти следующее:</p>
<ul>
<li>список моих увлечений;</li>
<li>статьи, найденные мной в Интернете;</li>
<li>студенческий юмор;</li>
<li>сведения обо мне.</li>
</ul>
</div>

Его стилевой класс main будет иметь несколько другие параметры:

.main { 
width: 100%; /* это обязательно! */
float: right; /* мы заставляем этот контейнер сдвинуться к правому — противоположному краю страницы */
margin-left: -104px;
padding: 5px;
}

Последний параметр задаёт отступы в 5 пикселей, оставим его в покое и обратим внимание на первые три параметра.

Итак, первым же делом мы задаем ширину контейнера, который собираемся сделать саморастягивающимся, в 100%. Понятно, что этот контейнер будет растягиваться на всю ширину окна Web-обозревателя. Также понятно, что он будет сдвинут к правому краю окна (см. второй параметр).

Третьим параметром мы задаем отступ слева в -104 пикселя. Во-первых, откуда взялась величина 104? Это просто сумма ширины контейнера набора гиперссылок (80 пикселей), четырех отступов (5 пикселей * 4 стороны = 20 пикселей) и двух значений толщины рамки (2 пикселя * 2 стороны = 4 пикселя). Но, во-вторых, почему минус?

Дело в том, что Web-обозреватель, встретив отрицательное значение отступа, посчитает его свободным пространством и постарается «впихнуть» туда предыдущий контейнер (или следующий, если отрицательный отступ задан справа). Причем это срабатывает только тогда, когда отступ задан с помощью параметра margin (расстояние между воображаемой границей элемента страницы и соседним элементом).

Давайте посмотрим, что у нас получилось. Сохраним страницу и таблицу стилей и вызовем окно Web-обозревателя.

Если мы изменим размеры окна Web-обозревателя, созданный нами саморастягивающийся контейнер тоже изменит свою ширину. А ширина контейнера с набором гиперссылок останется неизменной. А ведь это то, что нам нужно!

JHighslide

Одна только беда — эти контейнеры накладываются друг на друга. Надо как-то их "развести". Проще всего сделать это, поместив контейнер с основным содержимым в другой контейнер и задав для него значение Margin: Left равным 104, т.е. таким же, только положительным. Ищем код, определяющий основное содержимое, и вставляем код, создающий новый контейнер. Вот что мы должны получить после этого (вставленный нами код выделен полужирным шрифтом):

<div class="main"> 
<div class="main1">
<h3>Здравствуйте! Здравствуйте! Здравствуйте!</h3>

<li>сведения обо мне.</li>
</ul>
</div>
</div>

Видно, что мы привязали к новому контейнеру стилевой класс main1, который пока не существует. Создадим его и зададим для него единственный параметр.

.main1 { 
margin-left: 104px;
}

Вот теперь все в порядке.

JHighslide

Следующим нашим шагом будет создание контейнера с колонкой новостей. И здесь мы столкнемся с новой проблемой. Дело в том, что, в одной линии плавающих контейнеров, содержащей саморастягивающийся контейнер, может нормально существовать только один контейнер с жестко заданной шириной. То есть, если мы создали в одной линии один саморастягивающийся контейнер и один контейнер с жестко заданной шириной (неважно — в пикселях или процентах), то третий контейнер с заданной шириной мы добавить в эту линию не сможем. В одной линии плавающих контейнеров, содержащей саморастягивающийся контейнер, мы можем создать сколько угодно контейнеров с заданной шириной — стандарты HTML и CSS это допускают. Проблема в другом: Web-обозреватели будут обрабатывать эту конструкцию как им заблагорассудится.

Что же нам делать? Выход довольно прост: мы поместим только что созданные контейнеры набора гиперссылок (с жестко заданной шириной) и основного содержимого (саморастягивающийся) в другой контейнер, который тоже сделаем саморастягивающимся. А уже к этому-то контейнеру мы приделаем, справа контейнер с колонкой новостей, для которого зададим ширину жестко.

Находим код, определяющий набор гиперссылок и основное содержимое, и вставляем теги <div>, создающие новый контейнер. Результат наших правок показан ниже (добавленный код выделен полужирным шрифтом):

<div class="wrapper"> 
<div class="wrapper1">

<div class="nav">
<p><a href="#">Главная</a></p>

<div class="main">
<div class="main1">
<h3>Здравствуйте! Здравствуйте! Здравствуйте!</h3>

<li>сведения обо мне.</li>
</ul>
</div>
</div>
</div>
</div>

Мы поместили контейнеры с набором гиперссылок и основным содержимым не в один контейнер, а последовательно в два. Эта конструкция нужна нам для того, чтобы потом устранить наложение основного содержимого на колонку новостей (об этом мы говорили выше). К этим контейнерам мы привязали стилевые классы wrapper и wrapper1. Стилевой класс wrapper будет иметь параметры:

.wrapper { 
width: 100%; /* поскольку он саморастягивающийся */
float: left; /* он должен находиться левее колонки новостей */
margin-right: -114px;
}

Все это нам уже знакомо по контейнеру с основным содержимым. Только теперь мы прижимаем его не к правому краю окна Web-обозревателя, а к левому и соответственно оставляем свободное место для нового контейнера.

Ширина его будет составлять 100%,  поскольку он саморастягивающийся. Float – слева, потому что он должен находиться левее колонки новостей. Отступ справа -114 пикселей — это сумма ширины контейнера колонки новостей (100 пикселей), двух отступов, заданных в третьем контейнере (5 пикселей * 2 стороны = 10 пикселей) и двух значений толщины рамки, заданных у него же (2 пикселя * 2 стороны = 4 пикселя).

Что касается стилевого класса wrapper1, все уже, наверное, догадались, каков будет его единственный параметр:

.wrapper1 { 
margin-right: 114px;
}

Не отвлекаясь от просмотра получившегося — нечего пока там смотреть, — приступаем к созданию третьего контейнера — с колонкой новостей.

<div class="news"> 
<p><strong>Новости</strong><br />
<em>29.08.2005</em></p>
<p>Сегодня я начал делать этот сайт!</p>
<p><a href="#">Архив &gt;&gt;</a></p>
</div>

Привязываем к нему стилевой класс news, чьи параметры будут такими:

.news { 
width: 100px;
float: right;
border: thin solid #000;
padding: 5px;
}

Вот теперь можно вызвать Web-обозреватель и полюбоваться на наше творение.

JHighslide

Осталось создать еще один разделитель и последний контейнер, содержащий сведения об авторских правах. С разделителем проблем у нас не будет — он создается так же, как первый.

<div class="spacer">&nbsp;</div> 
<div class="copyright">&copy; Васильев В. В.<br />
Цитирование опубликованных на сайте материалов без разрешения автора не допускается.
</div>

А вот стилевой класс copyright, привязанный к контейнеру сведений об авторских правах, будет иметь такие параметры:

.copyright { 
float: left;
width: 100%;
}

Вот и все. Можно снова вызвать Web-обозреватель, изменить размер его окна и посмотреть, что из этого получится.

JHighslide

Мы сделали Web-дизайн, основанный на контейнерах, который подстраивается под размеры окна Web-обозревателя. Это значит, что мы вполне можем обойтись без громоздких и запутанных таблиц.

Добавить комментарий


Защитный код
Обновить

GeneticsPro
close

Рассылка 'D-G-S'.ru

Подпишитесь на рассылку новостей сайта 'D-G-S'.ru!

  • Новые расширения Joomla! от сторонних разработчиков.
  • Новые расширения Joomla! от D-G-S.
  • Статьи и новости о CMS Joomla!
  • Статьи о web-разработке и многое другое…
Будьте всегда в курсе событий мира Joomla!
Мы на Facebook
Мы на Twitter
Страница в Google+
Мы ВКонтакте
Наш канал YouTube
FAQ
Инструментарий