Преимущество препроцессоров на примере LESS

от автора

Продолжая неделю верстки на хабре, хочу поделиться и устранить все непонятки относительно препроцессоров. Рассматривать буду на примере LESS, потому что я не люблю SASS он ближе по синтаксису к CSS, при этом содержит в себе ряд самых важных особенностей: наследование, классы/примешивания/миксины, переменные и базовые операции над переменными.

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

Многие не любят препроцессоры за излишнее количество кода, приверженности БЭМу, или еще каким шаблонизаторам. В принципе, они правы, так как неосторожное написание кода на препроцессорах может выдать очень грязный css. В одной из последних статей, автор пишет очень неправильный код LESS, используя дублирование html-структуры в самом файле стилей.

  • Во-первых, это генерирует огромное число строк кода конечного css;
  • Во-вторых, странно, что используя некоторый препроцессор для html, автор вручную дублирует структуру html-тегов в less. Получается некоторое дублирование информации, так почему бы не оптимизировать и данный шаг? Ведь в данном примере автор изначально в less добавляет классы, а затем их необходимые сочетания подключает в нужных местах.

Это требует дополнительного внимания. Возьмем рассматриваемый автором пример:

blue-arial-element{     // в less можно делать строчные комментарии     // поэтому property желательно писать «в столбик»     // background-color: black;      background-color: blue;     color: white;     font-family: Arial;     font-size: 12px; }  .button{     .blue-arial-element; } .header{     .blue-arial-element; } .footer{     .blue-arial-element; } 

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

Вот, оптимизированный код less:

blue-arial-element(){     // в less можно делать строчные комментарии     // поэтому property желательно писать «в столбик»     // background-color: black;      background-color: blue;     color: white;     font-family: Arial;     font-size: 12px; }  .button, .header, .footer{     .blue-arial-element; } 

Данный пример скомпилится в 6 строчек кода против 24(!). На самом деле, такой код может быть только в каком-нибудь одностраничном примере. На большом проекте все будет по-другому.

@pad: 0.5em; @xs: @pad; @s: @pad*1.2; @m: @pad*1.5; @l: @pad*2; @xl: @pad*3;  @color-red: #a81430;  .btn-params(@size: @s) {     padding: @size/2 @size;     display: inline-block;     border-radius: @size/4;     margin: @size/2; } .btn-flat(@size: @s, @color: @color-red) {    .btn-params(@size);   background: @color;    //.gradient(lighten(@color,3%),darken(@color,3%));    color: #fff; } .button {   .btn-flat(@l, @color: #ccc); } .button2 {   .btn-flat; } input[type="submit"], // Обычно на проектах используются разные input input[type="button"], //  button, // а иногда и кнопки .button { // и еще у нас бывают ссылки с классом button   .btn-flat(@m);   &[disabled="disabled"] {     .btn-flat(@m,#eee);   } } 
И этот код скомпилируется в небольшой кусочек кода на css

.button {   padding: 0.5em 1em;   display: inline-block;   border-radius: 0.25em;   margin: 0.5em;   background: #cccccc;   color: #fff; } .button2 {   padding: 0.3em 0.6em;   display: inline-block;   border-radius: 0.15em;   margin: 0.3em;   background: #a81430;   color: #fff; } input[type="submit"], input[type="button"], button, .button {   padding: 0.375em 0.75em;   display: inline-block;   border-radius: 0.1875em;   margin: 0.375em;   background: #a81430;   color: #fff; } input[type="submit"][disabled="disabled"], input[type="button"][disabled="disabled"], button[disabled="disabled"], .button[disabled="disabled"] {   padding: 0.375em 0.75em;   display: inline-block;   border-radius: 0.1875em;   margin: 0.375em;   background: #eeeeee;   color: #fff; } 

  • Здесь я использовал задание размеров с помощью переменных. При этом в процессе разработки не нужно думать над тем, сколько пикселей/пунктов/em’ов ставить для заголовка, маленькой приписочки, большой, средней, маленькой или крохотной кнопки.
  • Используются именно миксины, они не дублируется сами по себе в коде. Используется параметризация миксинов. Хотим красную кнопку, ставим цвет по-умолчанию. Хотим зеленую — ставим в параметр зеленый цвет.
  • В серьезных проектах и для универсальности, стоит задавать переменные для большинства цветов, например, говорящие за себя переменные цвета: @color-disabled; @color-warning; @color-success; @color-brand; @color-brand-2; @color-link; @color-txt; @color-border;

Еще одна проблема верстки CSS

Этой проблемой болен БЭМ, неучтивое использование LESS, да и просто обычного CSS. Это — перебивание одних стилей другими. Иногда встречаешься с тем, что к какой-нибудь несчастной ссылке-кнопки применяется стилей с 10, а то и 20 различных правил. Половина друг друга перебивает. Это мало того, что увеличивает ненужное количество кода, так еще и тормозит редрединг, а к тому же, ну ооочень сильно затрудняет восприятие. Начинаешь искать, какие же селекторы были перебиты каким-нибудь самым специфичным.

К таком поведению ведет две ситуации:

  • Лень
  • Незнание

Лень я неспроста вывел на первое место: часто бывает, что не хочется модернизировать какой-то миксин под аргументы, и просто пишешь другой цвет фону какой-нибудь отличной кнопки. Т.е. получается вот такая вещь:

.btn-params(@size: 0.5em) { padding: @size/2 @size; display: inline-block; border-radius: @size/4; margin: @size/2; } .btn-for-our-project() { .btn-params; background: #ccc; color: #fff; border-radius: 0.25em; border: 1px solid #000; }  .active {   color: #000;   background: yellow; } .button { .btn-for-our-project; &.active { background: #aaa; color: #fff; border: 1px solid blue; } } 
Скомпилированный css

.active {   color: #000;   background: yellow; } .button {   padding: 0.25em 0.5em;   display: inline-block;   border-radius: 0.125em;   margin: 0.25em;   background: #ccc;   color: #fff;   border-radius: 0.25em;   border: 1px solid #000; } .button.active {   background: #aaa;   color: #fff;   border: 1px solid blue; } 

В итоге для тега <a href="/" class="button active"> применится три стиля цвета фона, три цвета текста и еще некоторые ненужные. Разумеется, это не совсем реальный пример, и данная практика еще допустима. Но, когда идет перебивание практически всех стилей: от position и display до color и box-shadow, да еще и в количестве десятка — это очень плохая практика.

Заключение

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

P.S.: Статья получилось маленькой. Думал, что выйдет материала побольше. Поэтому, если я где-то что-то упустил, или же примеры стоит сделать другими, прошу это высказывать в комментариях или ЛС. Предполагаю, что статья после некоторого периода обрастет подробностями, а я повешу шильдик «tutorial».

ссылка на оригинал статьи http://habrahabr.ru/post/204100/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *