Простая CSS-сетка на основе unsemantic.
Введение.
Для работы над сайтами весьма полезным является применение макетных сеток, они же css фреймворки. В своё время я выбрал для использования CSS фреймворк Unsemantic, как наиболее гибкий и удобный. В процессе работы с ним, мной была сделана его модификация, еще более удобная и гибкая. Позже в среде вебдизайна стал популярен Bootstrap. Я познакомился с ним. Моё главное ощущение от него - кондовость по сравнению с моей сеткой. ))) Но директора студий требуют бутстрап... Главный их довод - "у него хорошая документация" - можно ознакомить клиента, чтобы он не ломал вёрстку и соответственно - меньше проблем с поддержкой сайта. Посему пишу мануал. Благо моя сетка значительно проще. Я имею в виду мой фреймворк проще и намного гибче сетки Bootstrap. Если нужны её расширения - то вполне подойдёт jQuery UI.
Назвал я её незатейливо - "Простая CSS-сетка" )))
Собственно, вот она. CSS_simple_grid.rar. Внутри архива имеется этот мануал, а так же мануал на adapt.js.
Структура фреймворка и его установка.
Сам CSS фреймворк состоит из общего файла grid-base.css и условно подключаемых файлов, для разных диапазонов ширин окна браузера (grid_0.css ... grid_8.css), а так же типов устройств (grid_print.css - для вывода на печать). Все условные файлы практически идентичны между собой, имеют одинаковую структуру классов и их параметров. Ширины элементов для всех файлов заданны в процентах от ширины родительского элемента. Файлы отличаются только префиксами классов.
У классов grid-base.css префиксы отсутствуют, у файлов ширин grid_0.css ... grid_8.css префиксы соответственно g0_ .... g8_ , файл grid_print.css имеет префиксы print_.
Если вам недостаточно имеющихся вариантов - вы можете создать свой, просто скопировав и переименовав соответственно условный файл и префиксы классов в нём.
Viewport.
Чтобы заставить страницу масштабироваться до ширины окна просмотра, HTML-файлы, вызывающие CSS_simple_grid, должны использовать тег meta…
<head> <!-- Отформатирован для удобства чтения --> <meta name="viewport" content=" width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1 " /> </head>
Установка фреймворка .
Необходимо подключить общий файл с помощью html.
<link rel="stylesheet" href="/css/grid-base.css" />
А так же, некоторое количество условных файлов, с соответствующими условиями.
С помощью html тегов.
<link rel="stylesheet" media="(max-width:760px)" type="text/css" href="/css/grid_0.css" /> <link rel="stylesheet" media="(min-width:761px) and (max-width:980px)" type="text/css" href="/css/grid_1.css" /> <link rel="stylesheet" media="(min-width:981px) and (max-width:1280px)" type="text/css" href="/css/grid_2.css" /> <link rel="stylesheet" media="(min-width:1281px) and (max-width:1600px)" type="text/css" href="/css/grid_3.css" /> <link rel="stylesheet" media="(min-width:1601px) and (max-width:1920px)" type="text/css" href="/css/grid_4.css" /> <link rel="stylesheet" media="(min-width:1921px) and (max-width:2540px)" type="text/css" href="/css/grid_5.css" /> <link rel="stylesheet" media="(min-width:2541px)" type="text/css" href="/css/grid_6.css" /> <link rel="stylesheet" media="print" type="text/css" href="/css/grid_print.css" />
или с помощью javascript, например с помощью adapt.js (он приложен с фремворком)
/* * Функция обратного вызова на событие window.resizing * * range - номер диапазона * width - ширина окна */ var resizeFunc = function (range, width) { // Псевдоним тега HTML. var html = document.documentElement; // Заменить ID в теге HTML. html.id = 'range_' + range; // Найди все экземпляры классов mobile, tablet или desctop, и убери их. html.className = html.className.replace(/(\s+)?( mobile| tablet| desctop)/g, ''); if (range == 0)// для мобильного телефона { // Добавить класс "mobile" html.className += ' mobile'; /* * Дальше идут разные манипуляции для телефонной версии */ } else if (range <= 2)// для планшета { // Добавить класс "tablet" html.className += ' tablet'; /* * Дальше идут разные манипуляции для планшетной версии */ } else // для больших устройств { // Добавить класс "desctop" html.className += ' desctop'; /* * Дальше идут разные манипуляции для десктопной версии */ } }; // Редактируйте в соответствии с вашими потребностями. var ADAPT_CONFIG = { // Где ваш CSS? path: 'css/', // Функция обратного вызова callback: resizeFunc, // false = Запускать только один раз, когда страница загружается в первый раз. // true = Изменение размера окна и наклона страницы. dynamic: true, // Первый параметр в диапазон является минимумом. // Последний параметр в диапазон является максимумом. // Разделитель диапазоны по ключевому слову "to". range: [ '0 to 760 = grid_0.css', '760 to 980 = grid_1.css', '980 to 1280 = grid_2.css', '1280 to 1600 = grid_3.css', '1600 to 1940 = grid_4.css', '1940 to 2540 = grid_5.css', '2540 = grid_6.css' ] };
Javascript подключение позволяет синхронизировать смену таблиц css дополнительными манипуляциями с DOM посредством JS, как видно из вышестоящего примера.
Примечание: Для правильного функционирования сетки, файл grid-base.css должен быть подключён перед всеми условными файлами.
Структура классов.
Класс grid-container - задаёт общюю ширину сетки. Он должен быть определён в css файле проекта в общем случае, так и для необходимых диапазонов ширин и параметров media.
При подключении условных файлов при помощи html тегов параметры класса grid-container надо задавать с помощью css тега @media.
@media (max-width:760px) { .grid-container { width: 95%; } } @media (min-width:761px) and (max-width:980px) { .grid-container { width: 90%; } } @media (min-width:981px) and (max-width:1280px) { .grid-container { width: 87%; } } @media (min-width:1281px) and (max-width:1600px) { .grid-container { width: 85%; } } @media (min-width:1601px) and (max-width:1920px) { .grid-container { width: 82%; } } @media (min-width:1921px) and (max-width:2540px) { .grid-container { width: 79%; } } @media (min-width:2541px) { .grid-container { width: 2000px; } }
При подключении условных классов при помощи adapt.js определение класса лучше привязывать параметрам тега html.
.grid-container { margin-left: auto; margin-right: auto; padding-left: 10px; padding-right: 10px; } html#range_0 .grid-container { width: 95%; } html#range_1 .grid-container { width: 90%; } html#range_2 .grid-container { width: 87%; } html#range_3 .grid-container { width: 85%; } html#range_4 .grid-container { width: 82%; } html#range_5 .grid-container { width: 79%; } html#range_6 .grid-container { width: 2000px; }
Впрочем, данные методы можно сочетать, например для случая
@media print { .grid-container { width: 95%; } }
Почти все остальные имена классов подчиняются единым правилам. (Исключения будут описанны ниже.)
<ИМЯ КЛАССА>=<ПРЕФИКС_><ТИП><-ШИРИНА>
Где:
<ПРЕФИКС_> - соответствует имени условного файла и одинаков для всех классов внутри файла.
<ТИП> - определяет, что данный класс задаёт у элемента.
<-ШИРИНА> - задаёт ширину элемента, или величину свойства соответствующего типа.
ПРЕФИКС.
Для общего файла grid-base.css префикс отсутствует, у файлов ширин grid_0.css ... grid_8.css префиксы соответственно g0_ .... g8_ , файл grid_print.css имеет префиксы print_.
В принципе, вы можете создать собственные условные файлы для других типов медиоконтента, или условий подключения. Для этого достаточно скопировать один из условных файлов, переименовать его и заменить в нем все префиксы на свои.
ТИП
Типы элементов сетки: grid, alpha, omega, grid-parent, pull, push, prefix, suffix, hide-on, display. Описание типов будет приведено ниже.
ШИРИНА
Ширина блоков задается числом соответствующим величине в процентах с шагом 5 (0, 5, 10, 15....100), а так же 33 и 66, имеющих ширину соответственно 33.33333% и 66.66667%. В сетке ширин для типа grid есть одна особенность - класс grid-0 со всеми префиксами означает, что данный контейнер невидим (display: none;).
Описание типов элементов сетки.
grid - задаёт блок определённой ширины ,а так же внутренние отступы padding-left: 10px; и padding-right: 10px;
alpha - задаёт отсутствие левого внутреннего отступа в блоке (padding-left: 0;), omega - то же самое, только для правого внутреннего отступа (padding-right: 0;). Если требуется убрать оба поля, то приеняется тип grid-parent. Ширина у этих типов отсутствует.
Блок с нулевыми отступами нужен, например, для случае, когда внутри этого блока находится дочерняя подсетка., поэтому и название типа grid-parent
<div class="grid-container"> <div class="grid-50 g0_grid-100 g1_grid-100">grid-50 g0_grid-100 g1_grid-100</div> <div class="grid-50 g0_grid-100 g1_grid-100 grid-parent g0_grid-parent g1_grid-parent"> <p>grid-50 g0_grid-100 g1_grid-100 grid-parent g0_grid-parent g1_grid-parent</p> <div class="grid-33">grid-33</div> <div class="grid-33">grid-33</div> <div class="grid-33">grid-33</div> </div> </div>
grid-50 g0_grid-100 g1_grid-100 grid-parent g0_grid-parent g1_grid-parent
pull - Сдвигает влево элемент сетки на значение ширины.
push - Сдвигает вправо элемент сетки на значение ширины.
Если вы хотите поменять визуальное расположение столбцов, но не повлиять на порядок источников, вы можете использовать классы push-x и pull-x и/или их условные версии — y_push-x и y_pull-x. (где y - префикс класса) Вы, конечно, тоже можете их комбинировать.
Например:
<div class="grid-container"> <div class="grid-25 g0_push-25 g1_push-25">1</div> <div class="grid-25 g0_pull-25 g1_pull-25">2</div> <div class="grid-25 g0_push-25 g1_push-25">3</div> <div class="grid-25 g0_pull-25 g1_pull-25">4</div> </div>
Меняет блоки 1 с 2 и 3 с 4 местами на узких ширинах окна.
prefix - создаёт внешний отступ слева от блока на размер значения ширины, как будто там находится невидимый блок. Текущий блок сдвигается вправо от своего места.
suffix - создаёт внешний отступ справа от блока на размер значения ширины, как будто там находится невидимый блок. Текущий блок остается на своём месте, а следующий блок сдвигается вправо от своего места.
hide-on - скрывает текущий блок. По действию аналогичен классу grid-0.
display - показывает текущий блок. Этот тип элемента не задан для общего случая (без префикса класса), то есть имеет смысл только g0_display, g1_display и тд.
Пример использования prefix, hide-on и display:
<div class="grid-container"> <div class="grid-20 hide-on g0_display">1</div> <div class="grid-20 hide-on g1_display prefix-20">2</div> <div class="grid-20 hide-on g2_display prefix-40">3</div> <div class="grid-20 hide-on g3_display prefix-60">4</div> <div class="grid-20 hide-on g4_display g5_display g6_display g7_display prefix-80">5</div> </div>
Этот пример показывает разные элементы, каждый в своём диапазоне ширин окна, сдвигая их, так, как будто остальные элементы присутствуют.
Элементы специальных классов.
Класс clear - задаёт невидимый блок нулевого размера, приводящий к тому, что следующий за ним блок всегда будет распологаться с новой строки.
В приведённом ниже примере первая группа содержит блок clear между 3 и 4 блоками сетки, а вторая нет.
<div class="grid-container"> <div class="grid-25 g0_grid-100 g1_grid-50">1 grid-25 g0_grid-100 g1_grid-50</div> <div class="grid-25 g0_grid-100 g1_grid-50">2 grid-25 g0_grid-100 g1_grid-50</div> <div class="grid-25 g0_grid-100 g1_grid-50">3 grid-25 g0_grid-100 g1_grid-50</div> <div class="clear"></div> <div class="grid-25 g0_grid-100 g1_grid-50">1 grid-25 g0_grid-100 g1_grid-50</div> <div class="grid-25 g0_grid-100 g1_grid-50">2 grid-25 g0_grid-100 g1_grid-50</div> <div class="grid-25 g0_grid-100 g1_grid-50">3 grid-25 g0_grid-100 g1_grid-50</div> <div class="grid-25 g0_grid-100 g1_grid-50">4 grid-25 g0_grid-100 g1_grid-50</div> </div> <p> </p> <div class="grid-container"> <div class="grid-25 g0_grid-100 g1_grid-50">1 grid-25 g0_grid-100 g1_grid-50</div> <div class="grid-25 g0_grid-100 g1_grid-50">2 grid-25 g0_grid-100 g1_grid-50</div> <div class="grid-25 g0_grid-100 g1_grid-50">3 grid-25 g0_grid-100 g1_grid-50</div> <div class="grid-25 g0_grid-100 g1_grid-50">1 grid-25 g0_grid-100 g1_grid-50</div> <div class="grid-25 g0_grid-100 g1_grid-50">2 grid-25 g0_grid-100 g1_grid-50</div> <div class="grid-25 g0_grid-100 g1_grid-50">3 grid-25 g0_grid-100 g1_grid-50</div> <div class="grid-25 g0_grid-100 g1_grid-50">4 grid-25 g0_grid-100 g1_grid-50</div> </div>
С clear:
Без clear: