Правила оформления LESS и CSS кода
Данный раздел описывает правила написания LESS и CSS кода, принятые в Инфо-Эксперт.
Этих правил следует придерживаться при поддержке старых проектов и обязательно соблюдать при разработке новых проектов.
Комментирование кода
Комментироване LESS кода — его неотъемлимая часть. Без комментариев разобраться в чужом коде порой просто невозможно. Поэтому следует
// Каталог
.catalog {
&-item {
...
}
}
// Тут может быть сколько угодно строк кода
// Корзина
.basket {
&-item {
...
}
}
// Тут ещё 500 строк кода
/* =============================
Каталог */
/* ============================= */
.catalog {
&-item {
...
} //.catalog-item
} //.catalog
// Тут может быть сколько угодно строк кода
/* =============================
Корзина */
/* ============================= */
.basket {
&-item {
...
} //.basket-item
} //.basket
// Тут ещё 500 строк кода
Организация LESS-файлов
Имя файла следует начинать с двухзначной цифры, после которой идёт тире и пояснительное название файла, понятное для человека. Это даёт возможность нормального восприятия структуры файлов и приводит структуру проектов в общий порядок.
- 00-09 — файлы, которые не попадают в результирующий CSS (миксины, переменные и т.д.)
- 10-19 — файлы, которые обязательно должны присутствовать, задают костяк шаблона (сетка, кнопки, иконки, формы и т.д.) и оформляют стандартные элементы html.
- 20-79 — различные дополнительные файлы, отвечающие за оформление конкретных кусков вёрстки (меню, модальные окна, слайдеры, хлебные крошки, каталог и т.д.).
- 80-main.less — основной файл стилей сайта, сюда как правило пишется всё, что относится к конкретному сайту, это уникальный для каждого проекта файл, если куски кода кочуют в этом файле из проекта в проект - значит надо выносить их в отдельный файлы в пределах имён 20-79.
- 90-helpers.less — различные хелперы типа
.clearfix
и прочие стили, помогающие привести вёрстку в нужный вид, не создавая излишнего кода.
При разработке допускается совпадение чисел в наименовани файлов.
Оформление LESS и CSS кода
Каждое свойство — отдельная строка.
Цель — лучшая читаемость, проще найти и поправить свойство.
Допускается исключение для случаев, когда стиль описвается одним классом и одним свойством. В этом случае следует отделять пробелами скобки от свойства.
.normal {font-weight: normal; font-style: normal; text-decoration: none;}
.p10{padding:10px}
.normal {
font-weight: normal;
font-style: normal;
text-decoration: none;
&:hover {
color: red;
}
}
.p10 { padding:10px; }
Каждый селектор — на отдельной строке
Цель — лучшая читаемость, проще найти селектор.
.class, .class1, .class2, .class3 {
color: red;
}
.class,
.class1,
.class2,
.class3 {
color: red;
}
Группировка правил
Цель — уменьшение длины селекторов, уменьшение веса CSS-файла, как следствие — ускорение обработки сыы браузером.
Это необходимо для лёгкого поиска нужного селектора при отладке и доработке вёрстки.
// LESS
.class {
color: blue;
.class-red {
color: red;
.class-green {
color: green;
.class-yellow {
color: yellow;
.class-orange {
color: orange;
}
}
}
}
}
//
//
//
//
// Скомпилированный CSS
.class {
color: blue;
}
.class .class-red {
color: red;
}
.class .class-red .class-green {
color: green;
}
.class .class-red .class-green .class-yellow {
color: yellow;
}
.class .class-red .class-green .class-yellow .class-orange {
color: orange;
}
// LESS
.class {
color: blue;
&-red {
color: red;
} //.class-red
&-green {
color: green;
} //.class-green
&-yellow {
color: yellow;
} //.class-yellow
&-orange {
color: orange;
} //.class-orange
} //.class
// Скомпилированный CSS
.class {
color: blue;
}
.class-red {
color: red;
}
.class-green {
color: green;
}
.class-yellow {
color: yellow;
}
.class-orange {
color: orange;
}
Скобки, отступы, порядок следования свойств и прочее
- В качестве отступов используем табуляцию, а не пробелы.
- Перед открывающей фигурной скобкой ставим пробел.
- Открывающая фигурная скобка находится в одной строке с селектором.
- Закрывающая фигурная скобка располагается в следующей строке за последним свойством.
- После двоеточия ставим пробел.
- После каждого свойства ставим точку с запятой.
- Свойства с префиксами пишем в конце списка свойств.
- Свойства без префиксов пишем после свойств с префиксами.
- Используемые миксины по возможности пишем в конце списка свойств.
- Вложенные правила отделяем пустой строкой.
- Для служебных комментариев в тексте используем однострочный LESS-комментарий
//
вместо CSS-комментария/* */
. - Для нулевых значений единицы измерения не указываем (кроме transition-delay: 0s).
- Для дробных значений не обязательно писать ноль.
- В url() не обязательно ставить кавычки, однако если используется base64-строка — кавычки ставим в обязательном порядке.
- Составные свойства (например, padding, margin) группируем в одно по взможности.
- Не добавляйте пробелы после запятых в rgba(), rgb() и т.п.
- Цвет в формате HEX пишем в нижнем регистре
#fff
,#f94568
. - Ни при каких обстоятельствах не используем
@import
в CSS-файлах!
.class,.class1,.class2,.class3{
color: red
&, &.mod {padding:10px;display:block;color:#FFFFFF}}
.class1
{
color:@back;
background:@white;
padding:0px 0px 0px 0px;
box-shadow:inset 0px 0 0 2px rgba(0, 0, 0, 0.5);
-webkit-box-shadow:inset 0px 0 0 2px rgba(0, 0, 0, 0.5) }
.class,
.class1,
.class2,
.class3 {
color: red;
&,
&.mod {
padding: 10px;
display: block;
color: #fff;
}
}
.class1 {
color: @back;
background: @white;
padding: 0;
-webkit-box-shadow: inset 0 0 0 2px rgba(0,0,0,.5);
box-shadow: inset 0 0 0 2px rgba(0,0,0,.5);
}
Формирование имён селекторов
Имена классов следует формировать так, что бы из имени можно было понять за что отвечает стиль или для чего предназначен. Все имена классов пишем в нижнем регистре, в качестве разделителя слов используем черточку. .aaa-bbb-ccc {}
Для классов-помощников используем названия классов, соответствующих аббревиатурам emmet. Пример таких классов можно наблюдать в файле 90-helpers.less
.className {
border: solid 1px @gray;
padding: 15px;
background: lighten(@gray, 50%);
}
.block1 { padding: 10px; }
.mar_b_l { margin-left: 10px; }
.gray-border-block {
border: solid 1px @gray;
padding: 15px;
background: lighten(@gray, 50%);
}
.p10 { padding: 10px; }
.ml10 { margin-left: 10px; }
Миксины
Используем только параметризованные миксины. По возможности задаём значения по умолчанию для параметров миксина.
Цель — уменьшение количества ненужного css-кода.
Вызов миксина без передачи параметров допускается писать без скобок.
.mix() {
color: @red;
background: @btnColor;
}
.class {
.mix();
}
.class1 {
.mix;
color: @green;
}
.mix(@color: #f00, @bgColor: #000) {
color: @color;
background: @bgColor;
}
.class {
.mix;
}
.class1 {
.mix(@green);
}
Переменные
Называйте переменные осмысленно, так, чтобы можно было понять за что она отвечает. Не стоит называть переменную именем цвета (если конечно это не белый, серый или черный) т.к. цвет дизайна может смениться на противоположный и будет не очень красиво, когда переменная @red будет обозначать синий цвет.
В конце объявления переменной оставляйте комментарий, так SublimeText будет давать вам подсказки при попытке вести название переменной.
Хорошим тоном будет выравнивание значений переменный в один столбик.
@blue: #3da4cb; // blue
@red: #fe4a49; // red
@orange: #fed766; // orange
@primary: #3da4cb; // primary
@secondary: #fe4a49; // secondary
@additional: #fed766; // additional
Инструменты для авто-форматирования кода, настройка параметров
К сожалению корректное форматирование LESS кода возможно пока только ручками, поэтому не забывайте про раздел ответственность.
Однако есть несколько плагинов для SublimeText, немного упрощающих жизнь разработчика.
Плагины для SublimeText
- Emmet — первый плагин, который должен быть установлен в ST после packagecontrol.
- Alignment — для выравнивания столбиком.
- List stylesheet variables — для удобного просмотра списка доступных переменных LESS.
- All Autocomplete или AutocompletionFuzzy — для автокомплита.
Сниппеты для SublimeText
less_rule — для удобной вставки переменной (правила)
<snippet>
<content><![CDATA[
@${1:lightColor}: #${2}; // ${1:lightColor}
${0}]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>rule</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<!-- <scope>source.less</scope> -->
<description>LESS rule</description>
</snippet>
less_class — для удобной вставки класса с комментарием.
<snippet>
<content><![CDATA[
${1:.class} {
${0}
} //${1:.class}
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>less_class</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<!-- <scope>source.python</scope> -->
<description>LESS class</description>
</snippet>
less_subclass — для удобной вставки вложенного класса или модификатора.
<snippet>
<content><![CDATA[
&-${1:item} {
${0}
} //.${2:class}-${1:item}
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>less_subclass</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<!-- <scope>source.python</scope> -->
<description>LESS sub class</description>
</snippet>
less_media — для удобной вставки медиазапросов с переменными.
<snippet>
<content><![CDATA[
${1:@media (max-width: @screenPhone) {
// телефоны
\}}
${2:@media (min-width: @screenPhoneMax) and (max-width: @screenTablet) {
// таблетки
\}}
${3:@media (min-width: @screenTabletMax) and (max-width: @screenDesktop) {
// десктоп
\}}
${4:@media (min-width: @screenDesktopMax) and (max-width: @screenLarge) {
// большой десктоп
\}}
${5:@media (min-width: @screenLarge) {
// больше большого десктопа
\}}
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>less_media</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<!-- <scope>source.python</scope> -->
<description>Медиазапросы для LESS</description>
</snippet>