Умные динамические колонки с применением CSS и jQuery

29 мая 2009 г.

Вольный перевод статьи Smart Columns with CSS & jQuery.

Существует два типа колонок, используемых на веб-сайтах: фиксированной ширины и тянущиеся в ширину в зависимости от размера экрана (их еще называют “резиновыми”).

Недостатком фиксированных колонок при их использовании в “резиновом” блоке является то, что может появляться лишнее незаполненное пространство (при определенной ширине блока), поскольку его ширина меньше ширины столбца:

Фиксированные колонки

“Резиновые” же колонки не оставляют избыточных пустого пространства и прекрасно вписываются в родительский блок. Однако их недостаток заключается в том, что в строку мы можем поместить только фиксированное число столбцов:

''Резиновые'' колонки

Решение

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

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

Умные колонки

Посмотреть пример - Умные динамические колонки.

HTML

Начнем с создания неупорядоченного списка, пункты которого будут вести себя как колонки.

1
2
3
4
5
6
7
8
9
<ul class="column">
  <!-- повторяющийся элемент списка -->
  <li>
    <div class="block">
    <!-- контент -->
    </div>
  </li>
  <!-- конец повторяющегося элемента -->
</ul>

CSS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
ul.column{
  width: 100%;
  padding: 0;
  margin: 10px 0;
  list-style: none;
}
ul.column li {
  float: left;
  width: 200px; /* ширина колонки по умолчанию */
  padding: 0;
  margin: 5px 0;
  display: inline;
}
.block {
  height: 355px;
  font-size: 1em;
  margin-right: 10px; /* отступ между колонками */
  padding: 20px;
  background: #e3e1d5;
}
.block h2 {
  font-size: 1.8em;
}
.block img {
  /* параметры для изображений с меняющимися размерами и бордюром */
  width: 89%; /* убираем 1% от ширины, чтобы предотвратить баг в IE6 */
  padding: 5%;
  background:#fff;
  margin: 0 auto;
  display: block;
  -ms-interpolation-mode: bicubic; /* предотвращение пикселизации изображений в IE 6/7 */
}

jQuery

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function smartColumns() { //функция, подсчитывающая ширину колонок

  //сброс ширины строки до 100% после изменения размера экрана
  $("ul.column").css({ 'width' : "100%"});

  var colWrap = $("ul.column").width(); //определяем ширину строки
  var colNum = Math.floor(colWrap / 200); //определяем, сколько столбцов в 200px вместится в строку и округляем число до целого
  var colFixed = Math.floor(colWrap / colNum); //ширину строки делим на количество столбцов, округляем до целого числа, в результате получаем точную скорректированную ширину колонки

  $("ul.column").css({ 'width' : colWrap}); //ставим точную ширину строки в пикселях вместо использования % - это предотвратит возможные баги в разных браузерах при различных разрешениях экрана
  $("ul.column li").css({ 'width' : colFixed}); //ставим точную ширину измененным столбцам

}

smartColumns(); //запускаем функцию после загрузки страницы

$(window).resize(function () { //запускаем функцию после каждого изменения размера экрана
  smartColumns();
});

Ссылки по теме

P.S. Довольно интересная штука. При удобном случае нужно будет обязательно воспользоваться.

Теги: , , , автор: Dimox | рубрика jQuery

Комментарии (28): »

  1. Красиво:)
    Возмем на заметку.

    Еще бы к этому автоматическое подстраивание размера шрифта под разные разрешения, раз уж скрипт используется :)

    @
  2. Да, все хорошее вовремя…
    Делал подобное в своем проекте, то там было немного веселее, там такое происходило с таблицей :) это уменьшает вероятность того что во «всемилюбимом» ИЕ распологаться блоки будут хорошо…

    @
  3. Удивлен, что тебе понравилось, ты же не любишь скрипты.

  4. Удивлен…

    У куда без них, Дима :)
    Тенденция однако :)
    Но ты подумай, как с размером шрифта при разном разрешении быть.
    Еще бы при при уменьшении размеров экрана монитора пропорции соблюдались бы, размер колонки уже - шрифт чуть меньше :)

    @
  5. Т.е. ты хочешь, чтоб шрифт был тем больше, чем больше разрешение экрана и наоборот (в указанных пределах)?

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

  6. <blockquoteТ.е. ты хочешь, чтоб шрифт…
    Да, именно так, чтобы все было автоматом.
    Понятно, что задача не простая и может быть однозначного решения не имеет, но лично не отказался бы от такой фишки :)

    @
  7. В общем, я понял. Сейчас сделал, так сказать, набросок, уже кое-что получилось. Так что это вполне реально реализовать.

  8. Давай, давай :)

    Тоже озадачился этой проблемой, так сказать пролог “Контроль”, примеры там есть, но это только про подгонку размеров макета при разных разрешениях, до размеров шрифта, еще не созрел :)

    @
  9. Получилось - http://dimox.name/fontsize.html. С кроссбраузерностью проблем нет.

    В самом скрипте есть 2 настройки:

    1
    2
    var width = 1000; // ширина, от которой идет отсчет
    var fontSize = 12; // минимальный размер шрифта

    1000 - это та же ширина, что и усновного родительского блока (#wrapper).

    Кроме тега body, у всех тегов нужно использовать em вместо px (там, где ты хочешь динамически менять размер шрифта).

    Пожалуй, уже можно писать статью на эту тему =)

  10. Круто :)
    Пиши статью, но лучше, если за основу макет возьмешь стандартный трех колоночный.
    Пусть там и ширина колонок меняется и размер шрифта.
    И в пошаговом режиме объяснялка, что, как и куда.
    Цены тогда ей не будет :)
    Всех к тебе засылать буду, для прочтения :)

    @
  11. Может, я чего проглядел, но ИМХО, вместо jQuery можно было бы обойтись ведением min-width.
    А шЫштой осел — да забудем уже про него:-)

    @
  12. …обойтись ведением min-width…

    А внимательнее пост прочитать?
    Речь-то совсем о другом :)

    @
  13. Дима, кинул тебе на мыло, свою новую разработку,
    к ней поможешь свое хозяйство прикрутить?

    @
  14. Да, вроде, мысль понятна.

    @
  15. Покажите тогда на примере, как то же самое будет решено на чистом CSS.

  16. Пиши статью, но лучше, если за основу макет возьмешь стандартный трех колоночный.
    Пусть там и ширина колонок меняется и размер шрифта.

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

    А изменение размера шрифта к такому макету можно прикрутить.

  17. Посидел, покрутил, и понял, что при расширении контентной части без скриптов никуда.

    @
  18. Не понимаю…

    Нет, конечно, переноса колонок делать не надо :)
    Но динамика измения ширины колонок и одновременно размера шрифта нужна.
    Важны пропорции не только в ширине колонок , но и в расстоянии между ними.
    Приблизительно так, как в посланном тебе на мыло, моем макете,
    не важно, что там фиксированная колонка, в принципе все может прокручиваться.
    Причем, вместе с min/max-width всему макету.
    Пусть ширина колонок в %.
    Как пропорциональное именине размера шрифта к этому привязать?

    @
  19. смотрел в konqueror при определенной ширине браузера, начинается “слайд шоу”!!!
    ширина около 1200-1300, точно сказать не могу, ибо ФФ еще не ставил!

  20. Спасибо, Дима за помощь.
    Все получил.
    Играюсь :)
    Если будут вопросы то задам, ты же автор данной фишки.
    Пиши статью, от себя обязательно линк дам,
    думаю многим пригодится.

    @
  21. Пожалуйста. Статью напишу.

  22. К тому, что ты сделал для меня, по моей просьбе,
    надо бы добавить из оригинального примера возможность масштабирования картинок, тогда полный фен-шуй будет :)
    И, как писал, рассмотреть все на конкретном примере - стандартной трех колоночной разметке, во всех подробностях.
    Может даже и не на одну статью потянет :)

    @
  23. В примере из статьи масштабирование изображений работает на голом CSS, так что скриптов для этого не нужно.

  24. C некоторыми оговорками (последняя строка ячеек всегда будет по горизонтальному центру, сколько бы их в строке не было) - можно:
    Для

    1
    ul class="column"
    1
    text-align:center

    , для списков - display:inline-block; без обтекания + хаки для IE и младших лисиц.

    @
  25. 25
    Далаирен
    Далаирен

    FF3 Win7RC1
    Скрипт, боюсь, не выполняет свою функцию.
    Opera10 Wnin7RC1 - нормально.

    @
  26. 26
    Далаирен
    Далаирен

    Прошу прощения - деза)
    В примере не выполняется, но к кастому моему вполне прикрутилось. о_О
    Мистика.

    @
  27. Спасибо, очень интересный пример! Интересно и увлекательно разобран по полочкам. Что-то в этом роде я придумал на div, а на списках не догадался. Не додумался и картинкам назначать ширину width: 89% - клёво!
    Но вот вопрос: я решил этот пример использовать для фотоальбома, в котором фоты наложены “внавал”, резиново. Но к каждой фотке хотелось бы вставить комменты.
    Если размеры и ориентация, а также объем комментов строго одинаков, то все идет пучком: при изменении разрешения экрана, размера окна браузера все резиновое и “резинит” отлично.
    Но в реале фотки имеют разный размер и ориентацию, разный объем текста и колонки получаются разной высоты. И вот тут получается неприятный фикус-покус: маленькие колонки цепляются за высокий правый край бОльших колонок, находящихся раньше - получаются зияющие пустоты. Как их избежать - ума не приложу.
    Может честной изобретательный и остроумный народ подскажет что-то оч.ценное? Или такая идея неважнецкая?

    @
  28. К сожалению, указанная вами ссылка не работает сейчас.
    Не могли бы вы воскресить эту страницу?

    Заранее спасибо.

    @

Присоединяйтесь к обсуждению!

Отправляя кoммeнтapий, Вы автоматически принимаете правила кoммeнтиpoвaния на этом блоге.

Правила кoммeнтиpoвaния на блоге dimox.name:

  1. Первый кoммeнтapий всегда проходит премодерацию.
  2. В поле "URL блога" можно указывать только ссылку на главную страницу вашего блога. Ссылки на прочие веб-ресурсы (в том числе блоги/сплоги, созданные не для людей) будут удалены.
  3. Запрещается использовать в качестве имени комментатора слоганы/названия сайтов, рекламные фразы, ключевые и т.п. слова. В случае несоблюдения этого условия имя изменяется по усмотрению владельца блога. Просьба указывать нормальное имя или ник.
  4. Весьма вероятно, что короткий и неинформативный кoммeнтapий вида "Спасибо!", "Интересная статья", будет удален. Исключение составляют знакомые автору блога комментаторы.

Подписаться, не комментируя

Предыдущие из рубрики