htmlbook.ru - Для тех, кто делает сайты
Статьи Книги Шаг за шагом Рецепты Форум Графика для Web
Главная страница > Статьи > Верстка с помощью слоев > Фиксированный дизайн. Параметр float

Фиксированный дизайн. Параметр float

Влад Мержевич

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

Рассмотрим, как располагать рядом по горизонтали два и более слоя. По умолчанию, использование тега <DIV> для создания слоя, автоматически делает и перенос строки после него, поэтому несколько идущих подряд слоев выстраиваются по вертикали. Нас же интересует, а как сделать то же самое, но по горизонтали, чтобы можно было создать две колонки. Для решения данной задачи есть два подхода: первый основан на использовании параметра float, второй — на позиционировании элементов.

Использование параметра float

Чтобы расположить два слоя рядом друг с другом по горизонтали, воспользуемся стилевым параметром float со значением left. Этот элемент говорит, что слой необходимо выровнять по левому краю и обтекать его по правой стороне. Таким образом, рядом лежащий второй слой будет пристыкован к первому справа.

Теоретически, параметр float достаточно задавать лишь для одного слоя из двух. Однако браузер Internet Explorer в этом случае между слоями добавляет небольшой промежуток, что не всегда желательно, а Firefox накладывает слои друг на друга. Чтобы все смотрелось именно так, как хочется, float следует указывать для всех слоев (пример 1).

Пример 1. Добавление параметра float

Валидный HTML
Валидный CSS
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Две колонки</title>
<style type="text/css">
#leftcol { /* Левая колонка*/
 width: 200px; /* Ширина слоя */
 float: left; /* Состыковка с соседним слоем */
 color: white; /* Цвет текста*/
 padding: 10px; /* Поля вокруг текста */
 background: #008000; /* Цвет фона левой колонки */
}

#rightcol { /* Правая колонка*/
 width: 550px; /* Ширина слоя */
 float: left; /* Состыковка с соседним слоем */
 padding: 10px; /* Поля вокруг содержимого */
 background: #e0e0e0; /* Цвет фона правой колонки */
}
</style>
</head>
<body>

 <div id="leftcol">...</div>
 <div id="rightcol">...</div>

</body>
</html>

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

Главной особенностью приведенного подхода является тот момент, что при уменьшении окна браузера до 750 пикселов и меньше, слои располагаются по вертикали друг под другом (рис. 1). Иными словами, макет «рассыпается» на отдельные блоки.

Рис. 1

Рис. 1. Вид макета при уменьшении размера окна браузера

Чтобы подобная ситуация не происходила, следует воспользоваться параметром margin.

Добавление параметра margin для создания двухколонного макета

Опять воспользуемся параметром float, чтобы расположить колонки рядом, но добавим его только для первого слоя. При этом в стиле второго слоя следует установить параметр margin-left, значение которого равно ширине левой колонки. Но здесь есть одна хитрость — ширину правой колонки задавать нельзя, потому что это приведет к переносу блоков в браузере Internet Explorer при уменьшении окна браузера. А именно этого мы стараемся избежать. Поэтому общую ширину макета установим с помощью еще одного слоя, назовем его container, а остальные слои будут располагаться внутри него (пример 2). В этом случае ширину правой колонки можно не задавать, поскольку она будет занимать все доступное пространство.

Пример 2. Двухколонный макет

Валидный HTML
Валидный CSS

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Две колонки</title>
<style type="text/css">
#container {
 width: 750px; /* Общая ширина колонок */
}

#leftcol { /* Левая колонка*/
 width: 200px; /* Ширина слоя */
 float: left; /* Состыковка с соседним слоем */
 color: white; /* Цвет текста*/
 background: #008000; /* Цвет фона левой колонки */
}

#rightcol { /* Правая колонка*/
 background: #e0e0e0; /* Цвет фона правой колонки */
 margin-left: 200px; /* Отступ слева */
}

p {
 padding: 10px; /* Поля вокруг текста */
 margin: 0; /* Убираем отступы */
}
</style>
</head>
<body>

<div id="container">
 <div id="leftcol"><p>...</p></div>
 <div id="rightcol"><p>...</p></div>
</div>

</body>
</html>

При таком способе верстки при уменьшении ширины окна браузера слои остаются на своих исходных местах, но появляется горизонтальная полоса прокрутки. Также наблюдаются небольшие различия в браузерах, связанные с полями и отступами вокруг текста, расположенного внутри колонок. Но эти отличия не существенны и легко корректируются за счет применения параметров padding и margin.

Если внизу после колонок предполагается разместить еще один слой, то для него следует использовать стилевой параметр clear. Дело в том, что браузеры по-разному располагают этот нижележащий слой, поэтому следует отменить действие обтекания, что clear как раз и делает (пример 3).

Пример 3. Применение параметра clear

Валидный HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Две колонки</title>
</head>
<body>

<div id="container">
 <div id="leftcol">...</div>
 <div id="rightcol">...</div>
</div>

<div style="clear: left">...</div>

</body>
</html>

Стиль для данного примера останется неизменным и только добавляется тег <DIV> с атрибутом clear: left. Значение этого параметра обычно совпадает со значением float.

Резюме

При верстке двухколонного макета очень часто применяется параметр float, который добавляется к каждому слою. Хотя этот атрибут предназначен для создания обтекания, за счет своей универсальности он уже давно взят на вооружение верстальщиков. Принцип его применения следующий. Вокруг слоя при добавлении float создается обтекание, но поскольку ширина каждого слоя жестко задана, то слои располагаются не друг под другом, а рядом по горизонтали. При этом и формируются колонки макета.

Такой способ создания многоколонного макета имеет и определенный недостаток, который проявляется в том, что при уменьшении окна браузера до определенной величины, колонки «перепрыгивают» одна под другую. Чтобы этого избежать дополнительно используют стилевой атрибут margin-left, добавляя его к правой колонке. В таком случае слои остаются на своих исходных местах, независимо от размеров окна браузера.

Статья опубликована: 30.03.2006 Последнее обновление: 01.05.2008

Прежде, чем писать комментарий к статье, примите во внимание следующие моменты.

  1. Не задавайте вопросы в комментариях, для этой цели предназначен форум, где вы получите нужную помощь.
  2. Удаляются любые комментарии, которые:
    • включают множество ошибок;
    • написаны безграмотно;
    • не имеют отношения к данной статье;
    • не содержат никакой полезной информации для посетителей.
  3. Для выделения отдельных слов используйте следующие команды: [b]жирный[/b], [i]курсив[/i], [color=цвет]цветной текст[/color], [tag]тег[/tag], [var]параметр[/var], [code]пример[/code].
  4. Потренироваться в написании комментариев вы можете в песочнице.

Комментарии к статье

coolreal

19.04.2006

Jтличная статья, как раз возился с отступом между слоями и никак не мог понять, от чего он. Оказывается, надо было просто указать еще раз float

Yuzer

30.06.2006

Могу лишь добавить что вместо margin-left равный ширине левого блока проще вставить в код правого float:right; иначе мне кажется не избежать не корректного отображения в разных браузерах

Chaklun

14.09.2006

а теперь обьясните мне, по поводу примера 2.
блоки не расспаются только потому, что они в контейнере? я убрал margin-left: 200px; с правой колонки и при изменении размера окна броузера блоки не рассыпались. тестировал на IE 6.0, Firefox 1.5

вернул margin-left: 200px; и убрал контейнер - в ИЕ блоки рассыпались

Птица

10.10.2006

У меня вот та же беда www.16line.ru - все сыплется sad

Jock

11.10.2006

Господа, а не подскажет ли кто как решить эту же проблема перемещения слоев для динамической ("резиновой") верстки? Т.к. описанный метод фиксирует ширину страницы посредством внешнего "удерживающего" контейнера.

Влад Мержевич

13.10.2006

Посмотри в этой статье, пример приведен.
htmlbook.ru/content/?id=107

KarpEn

27.11.2006

Не понимаю, к чему эти сложности. Почему бы просто не засунуть эти колонки в таблицу?

Влад Мержевич

28.11.2006

Никакой сложности, некоторые так и делают.

Олег

20.01.2007

Насчет сложности,
если нужно сгенерировать например в php набор элементов например в 3 столбца и в N строк, то данный метод очень даже удобен и легок по сравнению с таблицами.

moriarti

12.02.2007

А если мне нужно отцентрировать container? Добавление text-align:center; к родительскому элементу имеет эффект только в IE, в других браузерах, элементы упорно выравниваются по левому краю...

Влад Мержевич

13.02.2007

В других браузерах используй margin: 0 auto.

Виталий

13.02.2007

Jock: для реализации динамической по настоящему "резиновой" верстки, лучше использовать таблицы (СТАРЫЙ, НАД?ЖНЫЙ и ПРОВЕРЕННЫЙ метод, работающий во всех браузерах), меньше хлопот с отображением, особенно если нужно чтоб макет страницы пропорционально изменялся, вследствии изменения размера окна браузера (и блоки страницы не заскакивали друг за друга),
тем более, что слои и таблицы не взаимозаменяемы! Лично я, примененяю слои в создании древовидной структуры пунктов меню, и динамически перемещающихся объектов, в сочетании с JavaScript, но не более, конечно кому как удобней.
А сайт действительно хорош, много полезных нюансов описывается, отсутствующих в других источниках. Автор достоен уважения!smile

M.org

20.03.2007

Виталий, действительно, для реализации резинового дизайна ИМХО лучше применять таблицы, но и слойная верстка тоже имеет шанс - она очень компактна в первую очередь, у мееня страница сверстанного дизайна весит 1 кб + 18 кб графика и стили, их можно не считать - они кешируются. Т.е. даже у модемщиков страницы с контентом будут грузится за несколько секунд.

Юрий

23.03.2007

Следует обратить внимание на то, что в IE есть глюк с отображением двухколонного макета при использовании float. Его можно наблюдать, если в правом блоке количество строк будет больше чем в левом, тогда строки находящиеся на уровне левого будут сдвинуты на один символ в право. Этот глюк можно легко пронаблюдать и на примерах привед?нных выше достаточно лишь в правом блоке использовать несколько строк и первые две из них будут сдвинуты. Но если правому блоку задать ж?сткую ширину, то вс? становится на свои места.

<div id="container">
<div id="leftcol"><p>...</p></div>
<div id="rightcol"><p>abc<br>abc<br>abc<br>abc</p></div>
</div>

Так что при фиксированном размере блоков правому, нужно обязательно указывать ширину, либо выбрать другой способ позиционирования блока(не float).

Читатель (Мас)

10.04.2007

Знаете, помойму, использывание float привносит в в?рстку некую неопредел?нность, точнее хрупкость конструкции. Вот к примеру слово будет длинное, а конструкция вместо того чтобы изменить ширену -- разсыпиться, а из-за этого в тебя начнут лететь палки и камни со стороны заказчиков. Естественно, другое дело если делаеш себе, а им как объясниш, что это не твоя ошибка, а NEW-тЭхнолоджис? Так что в таких случиях советую использовать комбинацию из сло?в-таблиц. Кода, конечно плучается немного больше, но зато в итоге ты с гордостью сможеш назвать свой сайт самым пластичным и практичным) Вот в последнее время у меня такие и получаются) Прич?м существует ещ? ряд проблемм с наежжаением сло?в и разной мелкой гадости, а как вы знаете, что по мелочам судят о методе вцелом. Решайте сами)

dreamer

21.05.2007

млин.. ппц - тебе тут рассказывают как "жить без границ", а ты нам про "Век табличных динозавров" smile) вОТ скоро выйдут новые стандарты css3, и тебе с таблицами - только в музей))

oddhead

18.06.2007

Хм...
У меня безо всяких margin'ов и с указанием всех ширин почему-то прекрасно работает без рассыпания во всех браузерах.
Что я делаю не так? (:

snigga

22.06.2007

А как сделать такую же штуку, только с тремя колонками? Левая фиксированной ширины, средняя резиновая, правая фиксированная. Я вот долблюсь, не хочет он в упор правую показывать вровень с двумя другими, делает под всеми остальными. float: right установил.

Влад Мержевич

25.06.2007

Читай дальше, про три колонки рассказывается в последующих статьях.

step

26.06.2007

Чем float:none отличается от clear?

Влад Мержевич

27.06.2007

Почитайте о свойствах float и clear
http://htmlbook.ru/css/float.html
http://htmlbook.ru/css/clear.html

step

27.06.2007

Понял - float устанавливает обтекание следующего элемента, после того к которому применен, а clear - отменяет обтекание того же элемента к которому применен (прошу прощение за тавтологию).

Ufon

18.07.2007

В примере ?2 тег P описан так
p {
padding: 10px; /* Поля вокруг текста */
margin: 0em /* Убираем отступы */
}
что за единица измирения em

паровоз

21.07.2007

Как сделать 4 колонки и более

Влад Мержевич

24.07.2007

2 Ufon
em практически эквивалентен процентам в размерах шрифтов. В данном случае правильно писать просто margin: 0, без всяких единиц измерения.

Жук

09.08.2007

Согласен с oddhead, фиксирую ширину контейнера

Жук

09.08.2007

, для каждого div указываю float: left и при уменьшении окна браузера ничего не рассыпается. Ни в IE, ни в FF, ни в Opera. Без применения отступов. Может я тоже что-нибудь делаю не так? (:smile

Ivan

17.10.2007

Здравствуйте Влад. Спасибо Вам за то, что Вы делаете.
Отличный сайт. Только основы и приемы верстки на CSS описаны, почему-то, в разделе СТАТЬИ. Я , когда грыз гранит HTML&CSS, дойдя до верстки на CSS, вынужден был искать информацию на эту тему на других сайтах и книгах, т.к. не мог и подумать, что Вы запихнете вс? это в раздел СТАТЬИ. Неудобно.
А по поводу этого примера, посмотрите результат в 9-й Опере. Это и есть, наверное, "Также наблюдаются небольшие различия в браузерах, связанные с полями и отступами вокруг текста, расположенного внутри колонок." . Как решать эту проблему?

shopox

06.02.2008

Ivan, * {padding:0;margin:0;}

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

Имя
Комментарий

Сохранить имя (используется cookie)

Поиск по сайту

Верстка с помощью слоев
Разделы
Теги по теме

DIV
Элемент DIV является блочным элементом и предназначен для выделения фрагмента документа с целью изменения вида содержимого.

P
Определяет текстовый параграф. Тег P является блочным элементом, перед ним всегда добавляется пустая строка, параграфы текста идущие друг за другом разделяются между собой вертикальным промежутком.

CSS по теме

background
Параметр позволяет установить одновременно до пяти атрибутов стиля фона. Значения могут идти в любом порядке, браузер сам определит, какое из них соответствует нужному атрибуту.

clear
Параметр устанавливает, с какой стороны элемента запрещено его обтекание другими элементами. Если установлено обтекание элемента с помощью параметра float, свойство clear отменяет его действие для указанных сторон.

float
Определяет, по какой стороне будет выравниваться элемент, при этом остальные элементы будут обтекать его с других сторон.

margin-left
Устанавливает величину отступа от левого края элемента.

padding
Устанавливает значение полей вокруг содержимого элемента. Полем называется расстояние от внутреннего края рамки элемента до воображаемого прямоугольника, ограничивающего его содержимое.

width
Устанавливает ширину блочных или заменяемых элементов. Ширина не включает толщину границ вокруг элемента, значение отступов и полей.

Copyright 2002–2008 Влад Мержевич, по всем вопросам пишите по адресу: vlad@htmlbook.ru

О сайте | Планы на будущее | Использование сайта | Борьба с ошибками | Технологии | Поддержать проект