Препроцессорный код

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

Основная идея, которую порой озвучивают философы, - постпроцессоры лучше, чем препроцессоры.

На такую формулировку в голову приходит один классический вопрос, что лучше - кушать или дышать?

Чувствуете, что слово "или" здесь неуместно!?

Препроцессоры vs постпроцессоры - в корне неправильная постановка вопроса!

Каждый из уровней преобразования кода решает свои задачи.

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

Также обращаем внимание на ещё одно заблуждение. Расхожая фраза: "зачем мне препроцессоры, у меня postcss и его плагины, там тоже есть переменные и примеси, если нужно".

Дело в том, что не все плагины postcss - постпроцессоры! Например, precss, дающий стиль, похожий на SCSS, - тоже препроцессор. Вершина непонимания обычно выглядит так. Верстальщик любит поговорить, что ему не нужны препроцессоры, у него, мол, postcss. Смотришь, а там плагин precss для переменных и примесей. Что это, если не препроцессор?

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

Примеси делают код короче!

Особенно, когда речь идёт про вёрстку по сетке.

Во-первых, задание размера элемента идеально превращается в функцию, так как зависит от одного параметра:


.size(@n){
   width: calc(100% / 12 * @n - 30px);
}

12 колонок и 30px здесь константы, так как они определяются один раз дизайнером при создании сетки макета.

Во-вторых, на каждую контрольную точку можно создать примесь, например:


.size-sm(@n){
   @media screen and (max-width: 768px){
      width: calc(100% / 12 * @n - 30px);
   }
}

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

Напишем:


.userCard{
   box-sizing: border-box;
   margin: 15px;
   .size(3);
   .size-md(4);
   .size-sm(6);
   .size-xs(12);
}

Получим:


.userCard{
   box-sizing: border-box;
   margin: 15px;
   width: calc(100% / 4 - 30px);
}
 
@media screen and (max-width: 992px){
   .userCard{
      width: calc(100% / 3 - 30px);
   }
}
 
@media screen and (max-width: 720px){
   .userCard{
      width: calc(100% / 2 - 30px);
   }
}
 
@media screen and (max-width: 576px){
   .userCard{
      width: calc(100% - 30px);
   }
}

Не секрет, что в том же boostrap есть возможность работать с препроцессорной сеткой. Однако перспектива писать код вида:


@include media-breakpoint-up('md'){
   @include make-col(3);
}

не вдохновляет! Сказывается то, что написанный SCSS-код в bootstrap заточен на генерацию CSS-сетки, а не на удобное использование примесей.

Заключение.

Если вы не согласны с изложенными выше мыслями, скорее всего, вам больше подойдёт другой стиль вёрстки, а не такой, который предлагает smart-grid.

Если же перечисленные выше идеи кажутся логичными, то остаётся где-то найти удобную препроцессорную библиотеку. Здесь и появляется Smart Grid - модуль , генерирующий препроцессорный файл по заданным настройкам.