HTML and CSS

HTML and CSS

{Лаборатория экстремальной web-верстки...}

Верстаем без float

Верстаем без float

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

Их по сути всего раз-два и обчелся - техника на основе float и абсолютное позиционирование.

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

Решений с использованием абсолютного позиционирования не так уж и много, писал и сам об этом.

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

Об одной из них и поговорим сегодня.

Как вы могли заметить, предпочтения автора при разработке web-страницы, лежат в области создания иллюзии одинаковой высоты колонок. С помощью техники float это уже не является неосуществимым.

Другое дело, абсолютное позиционирование.

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

Отвлекся :)

Итак, решаем проблему одинаковой высоты колонок при абсолютном позиционировании.

С чем будем работать. html-код и стили от макета справой колонкой навигации.

html

<div class="middle">
  <div class="content">Content</div>
  <div class="right">Right</div>
</div>

Как видите, нет ничего лишнего, только необходимый и достаточный минимум.

css

* {margin:0;padding:0;}
body {background:#fff;}
.middle {
  background-color:#eee;
  border-right:#cc9 200px solid;
  margin:0 auto;
  position:relative;
  width:400px;
}
.right {
  position:relative;
  right:-400px;
  top:0;
  width:200px;
  z-index:1;
}
.content {
  background-color:#eee;
  border-right:#cc9 200px solid;
  position:absolute;
  left:0;
  top:0;
  width:400px;
}

Стилей тоже совсем чуть-чуть.

Даже не очень внимательный взгляд обнаружит, присутствие border-а в некоторых местах. А в нем, собственно, все и дело. С его помощью мы и создаем иллюзию одинаковой высоты колонок.

Кстати это еще одна мечта, ладно пусть и не мечта, а желание, прихоть назовите это, как угодно, с самых, что ни на есть первых моих шагов на ниве верстки, сделать такую конструкцию.

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

Не претендую на лавры первооткрывателя, хотя, как знать, как знать :), решение задачи лежало на поверхности, но многие, в том числе и я, довольно часто проходим мимо самых очевидных вещей.

А очевидные вещи, порой требуют не тривиального подхода. Конечно, проще всего писать о гламурных прибамбасах, количество посетителей, комментариев будет если не зашкаливать, то может в известной степени сильно напрячь владельца того или иного ресурса.

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

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

Но, довольно лирики.

Переходим на страницу, где находятся линки на примеры.

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

Возможно, автор еще не раз вернется к этой теме, сериалы-то никто не отменял :)

В заключении, остается добавить, что проблема footer-а, пока остается не решенной.


RSS лента ВСЕГО блога с комментариями RSS лента ВСЕГО блога БЕЗ комментариев RSS лента этой КАТЕГОРИИ с комментариями RSS лента этой КАТЕГОРИИ и БЕЗ комментариев RSS лента ЭТОГО ПОСТА с комментариями к нему

09 января 2009, 14:22
№ 1Без темы
Я как-то использовал border для колонки, но разметка была с float.
На бордюрчик абсолютным позиционированием выдвигались даты постов.
Sam
09 января 2009, 14:29
№ 2По разному можно...
Тоже люблю гибридные структуры, но там проблемы совместимости, хаки и т.д. и т.п.
А тут получилось без них, сама разметка :)
gordi
09 января 2009, 22:32
№ 3Без темы
идея не нова, также используют отрицательный margin
40a
09 января 2009, 22:49
№ 4Не надо путать...
К № 3
Приведите примеры, где отрицательные поля используются в абсолютном позиционировании.
Не надо путать с техникой float :)
Речь идет о совершенно разных вещах.
Гибридные структуры не в счет, чистое абсолютное позиционирование :)
Нет, и правда хочу увидеть, ранее не приходилось :)
gordi
13 января 2009, 16:22
№ 5Три колонки
Долго думал, с чего бы при наведении на "Делаем колонку длиннее" слова "Right"/"Left" уползают вниз :D
А за приемчик с border спасибо, принял к сведению. Судя по всему, в трехколоночном все реализуется аналогично?
PS. Попробовал накидать три колонки (по бокам от контента):
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
<title>no_float_cr</title>
<style type="text/css">
* {margin:0;padding:0;}
body {background:#fff;}
.middle {
background-color:#eee;border-right:#cc9 200px solid;border-left:#cc9 200px solid;
margin:0 auto;position:relative;width:400px;
}
.right {position:relative;right:-400px;top:0;width:200px; z-index:1;background: yellow;}
.left {position:relative;left:-200px;top:0;width:200px;z -index:1;background: yellow;}
.content {
background-color:#eee;border-right:#cc9 200px solid;border-left:#cc9 200px solid;
position:absolute;left:-200px;top:0;width:400px;
}
.header {background-color:#ddd;margin:10px auto 0;width:800px;}
p {padding:10px;}
.expand a{color:#960;display:block;clear:both;text-decorat ion:underline;width:180px;}
.expand a:hover{color:green;height:300px;}
</style>
</head>
<body>
<div class="header"><p>Header</p></di v>
<div class="middle">
<div class="content">
<p class="expand"><a href="#">Делаем колонку длиннее</a></p>
<p>Center</p>
</div>
<div class="left">
<p class="expand"><a href="#">Делаем колонку длиннее</a></p>
<p>Right</p>
</div>
<div class="right">
<p class="expand"><a href="#">Делаем колонку длиннее</a></p>
<p>Right</p>
</div>
</div>
</body>
</html>
Почему-то правая колонка сместилась ниже. Есть мысли по этому поводу?
13 января 2009, 16:59
№ 6Мысли по поводу...
...изложены в "IE7 самый "крутой" браузер!? Занятный баг"

Блоки они и есть блоки :)
Всегда выстраиваются про вертикали.
В этом смысле абсолютное и относительное позиционирование исчерпывает себя только двух колоночными вариантами, к сожалению :(
gordi
13 января 2009, 18:05
№ 7Что-то получилось
Ну, добавление float несколько изменяет ситуацию...
Посмотрите такой вариант:
Link
Проверил в ФФ3 и ИЕ6 (правда для него пришлось небольшой хак сделать в .right). Других браузеров, к сожалению, под рукой нет. Конечно, лишний слой в итоге, но может я где-то неоптимально подошел?
13 января 2009, 18:18
№ 8Не плохо...
№ 7
Нормально работает в OPERA9.5, IE6(7), Chrome :)
Чуть размерчики подправить, будет все Ok :)
Спасибо за решение, хорошее добавление, жаль, конечно, что float появился, но что уж тут поделаешь :)
gordi
13 января 2009, 20:06
№ 9Да, без float а наверное уже никак
А что с размерами? Левую часть я уменьшил при тестировании, чтобы избавиться от возможных глюков из-за одинаковой ширины колонок. Собственно так я и вышел на необходимость применить дополнительный padding.
Или проблема еще в чем-то?
13 января 2009, 20:31
№ 10Проблема...
...не в padding, он мне кажется и не нужен вовсе.
А вот ширина левой колнки может и должна быть любой, также, как и правой.
И тут в IE6 засада :(
Правая колонка сваливается.
Не много портит погоду и дополнительный контейнер, нужен для OPERA и FF, может и для других, но для IE6(7) не нужен точно :)
Тестирую, может, что выйдет путнего :)
gordi
13 января 2009, 21:13
№ 11Приблизительно...
...так :)
Выложил пример по вашему линку к комменту № 7
Link
Проблема была в том, что для IE6 не хватало ширины контентной части блоков .miidle и .content увеличина на 3px
padding убит за не надобностью :)
Осталось сделать резиновой область контента, для двух колоночночных макетов у меня это получилось :)
gordi
13 января 2009, 21:35
№ 12ИМХО не очень....
корректное решение :)
Насчет +3 пикселя у ИЕ я тоже доковырялся, но придумал немного другое решение. Сейчас его тестирую. Заодно вроде как решилась проблема с лишним блоком в конце middle'а...
PS. Но все равно остается ограничение, что сумма размеров колонок не должна быть больше ширины средней части :(
13 января 2009, 21:56
№ 13Мой пример рыба..
Для более полного теста нет сейчас времени :(
"Но все равно остается ограничение..."
На вскидку, что мешает увеличить ширину border-а?
А ширину области контента оставить без изменений.
Или на оборот, или все вместе, а правую клонку сделать уже левой или с ними поизвести обратный финт :)
Покажете свой новый пример, посмотрим :)
gordi
13 января 2009, 22:15
№ 14Без темы
Могу ошибаться, но увеличение размеров бордеров вроде как не повлияет на вместимость колонок :) увеличить одну из колонок или уменьшить middle (по крайней мере у меня при уменьшении ширины middle'а на сотню пикселей в ИЕ правый блок вывалился).
Пример вроде оформил - Link
Вместо доп.блока задействовал .middle :after, а "косяк" ИЕ подредактировал отрицательным margin'ом.
ЗЫ. Наверное лучше на ты (по крайней мере мне нет тридцати ;))
13 января 2009, 22:40
№ 15Ширина колонок
"Могу ошибаться..."
Иван, я не даром при корректировании твоей страницы из комментв № 7, прописал в колонках текст. Он наглядно свидетельсвует о том, что ширина колонок должна соотвествовать ширине border-а.
Также меняя ширину области контента для блоков .miidle и .content в плюс, добавив туже величину для блока .right параметр right:XXXpx;
Ничего не должно упасть :)
~
Решение с :after и трех пиксельным багом в IE6, лежало на поверхности, но все равно спасибо, вот что значит отсуствие времени :)
Занимаюсь в фоновом режиме :)
~
По старше буду, но действительно лучше на ты :)
Из-за появления float, продолжение, как нельзя лучше подходит к посту "IE7 самый "крутой" браузер!? Занятный баг"
Но думаю, кому надо, тот найдет :)
gordi
13 января 2009, 23:31
№ 16Ширина колонок :
Я имел ввиду, что при ширине блока middle, меньше суммарной ширины колонок они выпадать будут. И бордеры не помогут. По крайне мере в моем тестовом примере (уменьшил ширину middle до 300px) бордеры вмещают колонки, но правая съехала...
Попробую еще поковырять, там интересные моменты попутно выскакивали, наверное позже оформлю постом у себя заметки :)
В общем, спасибо за дискуссию, было приятно и полезно.
13 января 2009, 23:43
№ 17Хорошо
"Попробую еще поковырять..."
Я тоже :)
Постараюсь резиновую область контента сделать, хотя бы в самых популярных браузеров.
IE6 брыкаться будет, как всегда, но ему фикс пойдет за милую душу :)
Зайду к тебе на блог, отмечусь в комментах :)
Спасибо, примеры.
Действительно, хорошое дополнение к посту.
gordi

Трекбэки:

25 января 2009, 00:36
Автор: BIakaVeron 19 Январь 2009 "3 равные колонки: absolute/relative float" Просматривая RSS-ленту, наткнулся на интересный пост уважаемого Gordi о создании колонок одинаковой высоты без обтекания float, только через абсолютное относительное позиционирование.
Адрес заметки: http://trifler.ru/blog/post_1231439010.html
Ваш комментарий к статье:



cod


Примечание:
Обязательные для заполнения поля помечены карандашом
email при указании не будет опубликован.
Адреса с http:// преобразуются в ссылки автоматически
Теги запрещены
English German French Spanish Italian Japanese
  • Programming V. Lasto
  • Designer S. Gordi
  • Created in 0,05083 seconds
  • © 2007-2010