CSS: унификация классов и прототипирование (часть 2)
20-12-2014Время чтения ~ 5 мин.CSS, HTML, LESS, SASS 14113
Классы Berry CSS состоят из простых css-правил. Этот фреймворк не задает UI сайта. Его задача — перенести верстку с уровня css-файла в html-код.
Смотрите. Обычно мы делаем так (простой пример):
<div class="my-top"> ... </div> .my-top { margin-top: 20px; padding: 10px; color: #FFF; background-color: #888; }
C помощью Berry CSS будет уже так:
<div class="mar20-t pad10 t-white bg-gray500"> ... </div>
То есть мы написали тот же самый код, только в HTML в виде самостоятельных классов. Если проанализировать работу верстальщика, то это постоянное переключение между css и html файлами. Здесь же мы работаем только с html. Вы удивитесь, сколько это экономит времени и насколько упрощает работу!
В данном примере .my-top
какой-то «технический» класс, не содержащий уникальных стилей. Отступы, фон, текст, ширина и прочие примитивы. При использовании Berry CSS уже не требуется создавать отдельный класс блока. CSS-код будет гораздо (многократно!) меньше.
Общая структура фреймворка
Основной файл style.scss, где и выполняется подключение sass-файлов. Каталог Berry CSS собственно и содержит классы фреймворка.
Каталог main это то, где и выполняется верстка сайта. Причем файлы в этом каталоге подключаются вручную в style.scss, а не все скопом.
В файле main/_base.scss прописаны базовые стили. Это сбросы, подключение шрифтов, а также основная типографика. В этом файле по возможности прописываются только стили тэгов без классов. Выносить в less-переменные какие-то значения для этого файла не имеет смысла, поскольку они будут только единыжды использованы. Так что проще сразу задать нужные css-стили.
Файл main/_variables.scss для задания переменных. Эти переменные могут быть использованы в файлах UniCSS.
Общий порядок работы такой:
- Выставляем в main/_variables.scss нужные значения.
- Правим main/_base.scss под нужный дизайн.
- Свои стили в каталоге main.
Sass-функции
UniCSS использует различные функции для генерации css-классов. Особенностью является то, что через настройки можно управлять тем, какие классы требуются для работы.
Группы классов
Классы UniCSS разделены на функциональные группы по файлам. Если какая-то группа не требуется, то файл можно удалить. Или, наоборот, добавить новый.
Обновление фреймворка
Важный вопрос — как обновлять UniCSS? Мой совет — никак. Для каждого сайта используйте только ту версию, с которой начали работать. Строго говоря, обновлять не следует и любой другой css-фреймворк, поскольку измененные классы/стили/файлы могут поломать сайт.
Цвета
Охватить всю гамму цветов нереально, поэтому за основу взят принцип, что любой дизайн можно составить из 5-ти основных и 5-ти дополнительных цветов. Они задаются в less-переменных. Само значение цвета может быть любым, а можно взять готовые решения из гугловского material design. Они определены как less-переменные в _colors-gmd.scss.
Серому цвету (серая градация) отдано особое значение, поскольку он часто используется для прототипирования. Он также задается в less-переменных.
Цвета задаются для текста (t-
), фона (bg-
), границ (bor-
) и градаций (gr-
).
Сетка. Ширина. Адаптивность
Используется только flex-сетка. IE9 уже мало кого интересует, поэтому ограничений по браузерам можно сказать, что нет. Те, кто уже работает с flex, прочуствовали всю прелесть такого решения.
Для задания ширины используется width с шагом 1%. Такой мелкий шаг часто нужен для задания промежутков. Например три колонки по 32%. Конкретные ширины указываются в _variables.scss
, где можно оставить толькт те варианты, которые будут востребованы.
Адаптивность реализуется через постфиксы -tablet
и -phone
. За основу берется desktop first, то есть вначале определяются стили десктопов (широкие экраны — это дефолт), далее tablet и в конце phone. Это отличается от mobile first других css-фреймворков, но зато проще для понимания. Технически же это просто последовательность задания классов.
Для адаптивности используется только точки: 768px и 480px (задаются в sass-переменных). Всего доступно несколько точек: SMALL, PHONE, TABLET, MEDIUM, DESKTOP, LARGE. Все они также настраиваются.
Точные размеры
Поначалу я решил, что оптимально будет использовать абстрактные размеры, вроде t-small
, pad-large
. В процессе создания сайтов выяснилось, что такая абстракция только усложняет работу. Какой бы ни был абстрактный класс, в результате нужно получить точный размер. Поэтому проще сразу указать нужный класс: t250 (2.5rem), pad50 (50px), t24px (24px), w992px (992px).
Для текста используются единицы rem — это позволяет задавать размер от корневого элемента сайта (body), а не от родительского блока.
Layout-сетка
Модульная (layout) сетка может быть глобальной для всего сайта, либо локальной для каждого блока. Модульная сетка — это не flex. Задача модульной сетки — расположение глобальных блоков: шапка, подвал, сайдбар и т.п. Технически модульная сетка бывает двух вариантов: со 100% шириной браузера и с центральным позиционированием. Вот так задано центрирование:
.layout-center { width: 100%; margin-right: auto; margin-left: auto; max-width: $layout_max_width; }
Если нужно задать фон на всю ширину браузера, а содержимое отцентрировать, то используется дополнительный wrap-блок.
<div class="layout-center-wrap"><div class="layout-wrap"> ... </div></div>
Для div.layout-center-wrap
можно задать дополнительное оформление, например фон и отступы.
<div class="layout-center-wrap bg-gray200 pad20-tb"><div class="layout-wrap"> ... </div></div>
Бордюры
С ними пришлось повозиться, поскольку охватить все возможные варианты очень сложно. Поэтому придумал простую вещь — отдельно задаются разные параметры border: border-style, border-width и border-color. Например, чтобы отобразить левую серую границу в 3px:
<h6 class="bor-gray700 bor-solid-l bor3">Текст</h6>
Это довольно объёмынй код, но только так можно охватить все варианты. Если ширина равна 1px, то её можно не указывать:
<h6 class="bor-gray300 bor-dashed">Текст</h6>
Иконки
Для иконок используется Font-Awesome. Из-за этого размер css-файла увеличивается почти на 40Кб. Это много, но с другой стороны это аж 675 иконок! Думаю, что оно того стоит.
Отступы
Поскольку размеров много (5, 6, 7, 10, 15, 20, 25, 30, 40, 50px), да еще и с !important
, то получается довольно большой объём кода. Если какие-то значения не нужны, то их можно удалить. Или добавить новые. Данный ряд возник в процессе работы над сайтами, но у вас может быть другой вариант.
Классы UniCSS в своём css-коде
Можно делать так (тот же пример, что и вверху):
<div class="my-top"> ... </div> .my-top { @extend .mar20-t; @extend .pad10; @extend .t-white; @extend .bg-gray500; }
ps Кстати, по задачке из первой части: «Почему, например, нельзя сделать двуколоночную сетку 29% и 14% с промежутком 8% выровненным по центру, но смещенным слева на 50px?». В UniCSS это будет так (добавил цвета для красоты):
<div class="flex flex-hcenter bg-color1"> <div class="w29 mar50-l bg-gray200">29%</div> <div class="w8 bg-gray300"></div> <div class="w14 bg-gray400">14%</div> </div>