Верстаем кроссбраузерный “резиновый” макет страницы

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

Итак…

Задача – создать кроссбраузерный “резиновый” макет с правосторонним сайдбаром, в котором (макете) колонка с контентом при разрешениях экрана 1280×1024 и выше визуально располагалась бы примерно по центру окна браузера.

Особенности

  • “Резиновый” макет. Растяжка должна происходить за счет колонки с контентом.
  • Прижать все содержимое страницы к правому краю окна браузера при разрешениях экрана 1280×1024 и ниже.
  • Слева сделать динамический отступ с целью визуально отцентрировать контент (только на разрешениях 1280×1024 и выше).
  • Ограничить максимальную ширину страницы для больших разрешений экрана (в моем примере – 1300 пикселей).
  • Добиться кроссбраузерности.
  • Использовать минимальное количество тегов, скриптов и хаков.

Если говорить только о современных браузерах (Opera, FireFox, Safari, Chrome, IE8b2), то они вообще не создают никаких проблем, и поставленная задача в них решается налегке, даже в IE7 все работает со стандартными стилями. Проблема заключается, как обычно, в IE6, поэтому, собственно, вся работа сворачивается к изобретению “костылей” для этого браузера.

Примеры

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

Максимум, что мне удалось сделать для IE6 – применить expression на минимальную и максимальную ширину, но результат оставляет желать лучшего – при сужении/расширении окна браузера он ведет себя неадекватно.

В общем, взываю к вашей помощи, уважаемые коллеги ;) Помогите, пожалуйста, красиво решить задачу.

P.S. По секрету всему свету – возлагаю большие надежды на Сергея, поскольку знаю, что он подобные вещи решает на “ура!” =)

Комментарии (25)

  1. 8 ноября 2008 г. в 23:28

    Мажор, способ простой, но, к сожалению, весьма ограниченный. Дело в том, что 60% (к примеру) от 1024 – это одно количество пикселей. А от 1680 (мое разрешение) – совсем другое. При изменении разрешения сайт визуально будет “худеть”. Совсем плохо, если он должен быть на всю ширину окна. Начнет отлипать.

  2. Анатолий
    8 ноября 2008 г. в 23:41

    Когда-то мне очень понравилось решение:
    http://www.alistapart.com/articles/switchymclayout
    не совсем, может, то что нужно, но, может, сгодится

  3. 8 ноября 2008 г. в 23:49

    Dimox,
    Дело хорошее, но, скажем, хорошо отравнять инпуты во всех инкарнациях с применением таблиц гораздо проще. Я, скажем, был сильно удивлен, когда в разметке http://www.artlebedev.ru/ обнаружил тег center. Но потом подумал-подумал, и пришел к выводу, что если это удобно и облегчает жизнь – вполне можно юзать. А к консорциуму мы начнем прислушиваться, когда он предложит простой и приятный способ отбивки дивов по центру:-)

    Кстати. Подсвечивание рамки при ховере на контентном диве – это фича?

  4. 9 ноября 2008 г. в 12:43

    2sordes:

    2. Контентный div должен иметь своим родителем окно бровзера. Для этого его надо объявить сразу за body с position:absolute; и задать справа и слева фиксированные отступы (div будет растягиваться и сжиматься динамически, сам видел!).

    Неплохо бы пример такой реализации. На словах мне сложно понять.

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

    Я и без таблиц, по-моему, неплохо с ними справляюсь.

    Кстати. Подсвечивание рамки при ховере на контентном диве – это фича?

    Это :hover через CSS.

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

    2gordi:

    Вместо expression лучше JavaScript попробуй:

    Я его пробовал – результат тот же, что и сейчас с expression.

    Может, тебе за основу взять этот пример

    Спасибо! Попробую, посмотрим, что получится.

    В твоем примере при добавлении инфы в правую колонку, серый фон только по области контента идет :)

    Не к тому блоку фон прицепил просто =) Не суть важно.

  5. 9 ноября 2008 г. в 13:09

    Делаешь правую колонку необходимой ширины, а для общего в моем примере контейнера, задаешь margin:0 0 0 XXpx;

    Стал пробовать – есть проблема. Заключается в том, что в результате создания этого margin отступ слева присутствует всегда, при любом разрешении. В моем же примере он постепенно исчезает, начиная с 1280×1024 и ниже. Т.е. предложенный тобой вариант при разрешении 1024×768 смотрится совсем уж некрасиво.

    Я так полагаю, у меня этот отступ очень удачно исчезает, благодаря эмуляции минимальной ширины, тобой же однажды и предложенной. Имею в виду технику: body {padding-left: 999px} #wrapper {margin-left: -999px}.

  6. gordi
    9 ноября 2008 г. в 14:05

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

  7. 9 ноября 2008 г. в 14:57

    Только я понять не могу – зачем…
    Привычка верстать фиксированные блоки – это отличная привычка. Не зря все книги похожи одна на одну – потому что так удобнее

  8. 9 ноября 2008 г. в 15:53

    Сергей, я как раз в процентах и пробовал.

    2ioni:

    Только я понять не могу – зачем…

    Чтобы выглядело красиво одновременно на разных разрешениях монитора.

  9. gordi
    9 ноября 2008 г. в 16:16

    Так, Дима.
    Добавь к своим стилям такой expression

    * html #wrapper {
    width:expression(
    (document.compatMode && document.compatMode == ‘CSS1Compat’) ?
    (document.documentElement.clientWidth 1300 ? “1300px” : “auto”)) :
    (document.body.clientWidth 1300 ? “1300px” : “auto”)));
    }
    Размеры нужные поставишь.
    И туда же zoom:1;
    Все должно работать, проверил :)
    Хотя у меня монитор 17″, как на 19″ и более не знаю :)
    Гонял на рзных разрешениях, все вроде получается, как тобой задумано.

  10. gordi
    9 ноября 2008 г. в 16:20

    Угловые скобки улетели :)

    * html #wrapper {
    width:expression(
    (document.compatMode && document.compatMode == ‘CSS1Compat’) ?
    (document.documentElement.clientWidth < 960 ? "960px" : (document.documentElement.clientWidth > 1300 ? “1300px” : “auto”)) :
    (document.body.clientWidth > 960 ? “960px” :
    (document.body.clientWidth < 1300 ? "1300px" : "auto"))); }

  11. Сергей
    10 ноября 2008 г. в 18:30

    По моему лучше привычка резиновый диз, только потестить нужно на разных мониторах и видюхах )

  12. gordi
    10 ноября 2008 г. в 19:38

    Сергей“…резиновый диз…”
    Вот когда при резиновом дизайне появится возможность пропорционально уменьшать/увеличивать размер шрифта автоматом, то проблема умрет сама по себе.
    Если у вас страница оптимизирована к примеру под 1024*768 и 17″ с резиновой областью контента, то при просмотре/чтении текста при большем разрешении комфорта не будет, это совершенно точно :)
    Размер шрифта уменьшится, строка станет длиннее.
    Предложенное автором решение на мой взгляд имеет право на жизнь, так, как простым способом достигается ограничение размера макета, без использования скриптов.

  13. 10 ноября 2008 г. в 21:27

    Сергей, спасибо! Я думаю, что сейчас получился оптимальный вариант. Не хватало только zoom:1, а твой последний вариант скрипта дает наилучший результат. Единственный артефакт, который остается – когда сужаю/расширяю окно, местами возникает горизонтальная прокрутка (у меня монитор 24″). По сути это не так уж и страшно, поскольку при стандартных разрешениях этой прокрутки нет.

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

    Спасибо! ;)

    В общем, будем условно считать, что с задачей справились, а прокрутка в IE6 – это издержки недобраузера.

    Всем спасибо! Тему можно считать закрытой =)

  14. gordi
    10 ноября 2008 г. в 21:42

    Вместо zoom:1; можно попробовать height:1%;
    Но проблема спонтанного возникновения горизонтальной прокрутки в IE6 похоже не устранима :(
    Что же касается твоей идеи, таким вот образом бороться с не контролируемой растяжкой области контента на всю, ширину окна браузера, считаю ее очень преспективной.
    Решение без скриптов это большой плюс, в общем сижу и думаю, надо все это дело конкретно протестировать, и писать пост :)
    Есть некоторые наметки, ты тоже не останавливайся на достигнутом :)

  15. 11 ноября 2008 г. в 12:26

    Dimox, лови:

    <head>
    <style>
    body
    {
    padding:0;
    margin: 0;
    }
    </style>
    </head>
    <body>
    <div style="position: absolute; left: 100px; right: 100px; height:100%; background:#f00; min-width: 300px; overflow: auto;">
    </body>

    Сохрани код и посмотри полученную веб-страницу:-)
    Решение кросс-браузерное, несмотря на то, что ie6 не понимает min-width.

    1. Arctic
      24 марта 2009 г. в 11:01 / ответ на коммент sordes

      Не работает все это в ie6,7..

  16. seo специалисты
    17 ноября 2008 г. в 15:48

    Hello!
    Уважаю всех товарищей, что умеют работать с кодом.

  17. 25 ноября 2008 г. в 18:19

    Советую почитать http://www.webmascon.com/topics/coding/13a.asp

  18. 25 ноября 2008 г. в 18:34

    Roma, что хотели этим сказать? Указанную статью я уже давно прочитал.

  19. Evgen
    18 июня 2009 г. в 08:08

    Привет, всем!
    Вот натолкнулся на решение проблемы “кроссбраузерный, резиновый макет страницы”.
    Статья: http://blog.sjinks.org.ua/css/209-cross-browser-liquid-three-column-layout-full-height/
    Пример: http://blog.sjinks.org.ua/test/3col/3col_h100.html

  20. 29 сентября 2010 г. в 19:10

    спасибо огромное за способ с отсупами по краям
    очень нужно было

Ваш комментарий

Жирный текст

Ссылка

Цитата

Внутристрочный код

CSS-код

HTML-код

JavaScript-код

PHP-код