Статьи

Комплексное введение в Less: Mixins

Смешать … что?

С помощью Less мы можем определить так называемые «миксины», которые имеют некоторые сходства с функциями в языках программирования. В Less они используются для группировки инструкций CSS в удобных, многократно используемых классах. Миксины позволяют встроить все свойства класса в другой класс, просто включив имя класса в качестве одного из его свойств. Это как переменные, но для целых классов. Любой класс CSS или набор правил идентификатора могут быть смешаны таким образом:

.round-borders {
  border-radius: 5px;
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
}

#menu {
  color: gray;
  .round-borders;
}

// Output
.round-borders {
  border-radius: 5px;
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
}

#menu {
  color: gray;
  border-radius: 5px;
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
}

Как видите, этот вывод представляет собой сам миксин и набор правил CSS. Если вы не хотите, чтобы миксины появлялись в вашем скомпилированном файле .css Вы можете удивиться, почему я использую заглавные буквы в названиях миксинов. Это связано с тем, что селекторы CSS-классов также используют символ точки, и нет никакого способа отличить его от имени миксина Less. Вот почему я обычно использую заглавные буквы, как в объектно-ориентированном программировании, которое использует заглавные буквы для классов.

Пожалуйста, введите ваши аргументы

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

 .round-borders (@radius) {
  border-radius: @radius;
  -moz-border-radius: @radius;
  -webkit-border-radius: @radius;
}

И вот как мы можем смешать его в различные наборы правил:

 header {
  .round-borders(4px);
}

.button {
  .round-borders(6px);
}

Параметрические миксины также могут иметь значения по умолчанию для своих параметров:

 .round-borders (@radius: 5px) {
  border-radius: @radius;
  -moz-border-radius: @radius;
  -webkit-border-radius: @radius;
}

Теперь мы можем вызвать это так:

 header {
  .round-borders;
}

И это будет включать 5-пиксельный border-radius

Если у вас есть миксин, у которого нет аргументов, но вы не хотите, чтобы он отображался в конечном выводе, предоставьте ему пустой список аргументов:

 .hiddenMixin() {
  color: black;
}
 p {
  .hiddenMixin()
}

Что бы вывести:

 p {
  color: black;
}

В миксине есть специальная переменная с именем @arguments Значение переменной имеет все значения, разделенные пробелами. Это полезно для быстрого назначения всех аргументов:

 .box-shadow(@x: 0, @y: 0, @blur: 1px, @color: #000) {
  box-shadow: @arguments;
  -moz-box-shadow: @arguments;
  -webkit-box-shadow: @arguments;
}

.box-shadow(2px, 5px);

Что приводит к:

 box-shadow: 2px 5px 1px #000;
-moz-box-shadow: 2px 5px 1px #000;
-webkit-box-shadow: 2px 5px 1px #000;

Немного сватовства 🙂

Когда вы микшируете миксин, все доступные миксины с таким именем в текущей области видимости проверяются на соответствие тем, что было передано в миксин и как оно было объявлено.

Простейший случай — это совпадение по арности (количество аргументов, которые принимает миксин). Используются только те миксины, которые соответствуют числу переданных аргументов, за исключением миксинов с нулевым аргументом, которые всегда включены. Вот пример:

 .mixin() { // this is always included
  background-color: white;
}

.mixin(@a)  {
  color: @a;
}

.mixin(@a, @b) {
  color: fade(@a, @b);
}

Теперь, если мы вызовем .mixin@a@b

Другой способ контроля соответствия миксина заключается в указании значения вместо имени аргумента при объявлении миксина:

 .mixin (dark, @color) {
  color: darken(@color, 10%);
}

.mixin (light, @color) {
  color: lighten(@color, 10%);
}

.mixin (@_, @color) { // this is always included
  display: block;
}

@switch: light;

.class {
  .mixin(@switch, #888);
}

Мы получим следующий CSS:

 .class {
  color: #a2a2a2;
  display: block;
}

Там, где цвет перешел на .mixin Если бы значение @switch Были использованы только совпадающие определения. Переменные соответствуют и привязываются к любому значению, а все, кроме переменной, соответствует только значению, равному себе.

гвардия

Другой способ ограничения, когда миксин смешивается, — это использовать охрану. Guard — это специальное выражение, которое связано с объявлением mixin, которое оценивается во время процесса mixin. Прежде чем использовать миксин, он должен получить значение true. Охранники полезны, когда вы хотите сопоставить выражения, в отличие от простых значений или арности.

Мы используем ключевое слово when

 .mixin (@a) when (lightness(@a) >= 50%) {   
  background-color: black;
}

.mixin (@a) when (lightness(@a) < 50%) {
  background-color: white;
}

.mixin (@a) { // this is always included
  color: @a;
}

.class1 {
  .mixin(#ddd);
} // this matches the first mixin

.class2 {
  .mixin(#555);
} // this matches the second mixin

Вот что мы получим:

 .class1 {
  background-color: black;
  color: #ddd;
}

.class2 {
  background-color: white;
  color: #555;
}

Полный список операторов сравнения, используемых в охранниках:>,> =, =, = <, <.

Если вы хотите сопоставить миксины в зависимости от типа значения, вы можете использовать функции is *. Это iscolor, isnumber, isstring, iskeyword и isurl. Если вы хотите проверить, находится ли значение, помимо числа, в определенной единице, вы можете использовать один из них — ispixel, ispercentage, isem. Вот быстрый пример:

 .mixin (@a) when (iscolor(@a)) {
  color: @a;
}

.mixin (@a) when (ispixel(@a)) {
  width: @a;
}

body {
  .mixin(black);
}

div {
  .mixin(960px);
}

// Output
body {
  color: #000000;
}

div {
  width: 960px;
}

Охранники могут быть разделены запятой — если любой из охранников оценивается как true, это считается совпадением:

 .mixin (@a) when (@a > 10), (@a < -10) { ... }

Вместо запятой мы можем использовать ключевое слово and

 .mixin (@a) when (isnumber(@a)) and (@a > 0) { ... }

Наконец, вы можете использовать ключевое слово not

 .mixin (@b) when not (@b > 0) { ... }

Думаешь, математика это плохо? Подумай еще раз.

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

 @sidebarWidth: 400px;
@sidebarColor: #FFCC00;
#sidebar {
  color: @sidebarColor + #FFDD00;
  width: @sidebarWidth / 2;
  margin: @sidebarWidth / 2 * 0.05;
}

// Output
#sidebar {
  color: #FFFF00; // color is brighter 
  width: 200px;   // width is reduced to 200px
  margin: 10px;   // margin is set to 5% of the width
}

Скобки могут быть использованы для контроля порядка оценки. Они требуются в составных значениях:

 border: (@width * 2) solid black;

Less также предоставляет вам пару удобных математических функций. Эти:

 round(1.67); // returns 2   
ceil(2.4);   // returns 3   
floor(2.6);  // returns 2

И, если вам нужно превратить значение в процент, вы можете сделать это с помощью функции процента:

 percentage(0.5); // returns 50%

Здесь я покажу вам маленький секрет: как использовать золотое сечение в вашем дизайне. Вам не нужен калькулятор вообще. Проверь это:

 @baseWidth: 960px;
@mainWidth: round(@baseWidth / 1.618);
@sidebarWidth: round(@baseWidth * 0.382);

#main {
  width: @mainWidth;
}

#sidebar {
  width: @sidebarWidth;
}

И ответ:

 #main {
  width: 593px;
}

#sidebar {
  width: 367px;
}

И вуаля! Ваш расклад правильно разделен с золотым сечением. Вы все еще думаете, что математика это плохо ?! Я так не думаю 🙂

Цветная Алхимия

Less предоставляет множество функций, которые преобразуют цвета. Сначала цвета преобразуются в цветовое пространство HSL, а затем обрабатываются на уровне канала. Все цветовые операции принимают цвет и процент в качестве параметров, кроме вращения, которое использует целые числа от 0 до 255 вместо процентов для изменения оттенка, и смешивает, который принимает два цвета в качестве параметров. Вот краткий справочник для вас:

 lighten(@color, 10%);    // lightens color by percent and returns it
darken(@color, 10%);     // darkens color by percent and returns it
saturate(@color, 10%);   // saturates color by percent and returns it
desaturate(@color, 10%); // desaturates color by percent and returns it
fadein(@color, 10%);     // makes color less transparent by percent and returns it
fadeout(@color, 10%);    // makes color more transparent by percent and returns it
fade(@color, 50%);       // returns a color with the alpha set to amount

spin(@color, -10);       // returns a color with amount degrees added to hue
mix(@color1, @color2);   // return a mix of @color1 and @color2

Вы также можете извлечь информацию о цвете из каналов оттенка, насыщенности, яркости и альфа:

 hue(@color);        // returns the 'hue' channel of @color
saturation(@color); // returns the 'saturation' channel of @color
lightness(@color);  // returns the 'lightness' channel of @color
alpha(@color);      // returns the 'alpha' channel of @color

Это полезно, если вы хотите создать новый цвет на основе канала другого цвета, например:

 @new: hsl(hue(@old), 45%, 90%);

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

Ты любишь иерархию? Да.

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

 header {}
header nav {}
header nav ul {}
header nav ul li {}
header nav ul li a {}

В Меньше вы можете написать:

 header {
  nav {
    ul {
      li {
        a {}
      }
    }
  }
}

Как видите, это дает вам чистый, хорошо структурированный код, представленный сильной визуальной иерархией. Теперь вам не нужно повторять селекторы снова и снова. Просто вложите соответствующий набор правил в другой, чтобы указать иерархию. Полученный код будет более кратким и имитирует структуру вашего дерева DOM. Если вы хотите дать псевдоклассам эту структуру вложенности, вы можете сделать это с помощью оператора &. Оператор & представляет селектор родителя. Он используется, когда вы хотите, чтобы вложенный селектор соединялся со своим родительским селектором, а не действовал как потомок.

Например, следующий код:

 header { 
  color: black; 
}

header nav {
  font-size: 12px;
}

header .logo {
  width: 300px;
}

header .logo:hover {
  text-decoration: none;
}

Можно написать так:

 header {
  color: black;
  nav {
    font-size: 12px;
  }
  .logo {
    width: 300px;
    &:hover { text-decoration: none }
  }
}

Или так:

 header    { color: black;
  nav     { font-size: 12px }
  .logo   { width: 300px;
    &:hover { text-decoration: none }
  }
}

Назовите это, используйте это, и повторно используйте это. Это так просто?

Что если вы хотите сгруппировать миксины в отдельные пакеты для последующего повторного использования или для распространения? Less дает вам возможность сделать это, вложив миксины в набор правил с идентификатором, например #namespace.

Например:

 #fonts {
  .serif (@weight: normal, @size: 14px, @lineHeight: 20px) {
    font-family: Georgia, "Times New Roman", serif;
    font-weight: @weight;
    font-size: @size;       
    line-height: @lineHeight;
  }
  .sans-serif (@weight: normal, @size: 14px, @lineHeight: 20px) { 
    font-family: Arial, Helvetica, sans-serif;
    font-weight: @weight;
    font-size: @size;       
    line-height: @lineHeight;
  }
  .monospace (@weight: normal, @size: 14px, @lineHeight: 20px) {
    font-family: "Lucida Console", Monaco, monospace
    font-weight: @weight;
    font-size: @size;       
    line-height: @lineHeight;
  }
}

Затем, чтобы вызвать миксин из этой конкретной группы, вы делаете это:

 body {
  #fonts > .sans-serif;
}

И вывод:

 body {
  font-family: Arial, Helvetica, sans-serif;
  font-weight: normal;
  font-size: 14px;       
  line-height: 20px;
}

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

Некоторые особые случаи

Строковая интерполяция

Строковая интерполяция — это удобный способ вставить значение переменной прямо в строковый литерал. Переменные могут быть встроены в строки с помощью конструкции @{name}

 @baseURL: "http://example.com";
border-image: url("@{base-url}/images/border.png");

Спасаясь

Иногда вам может потребоваться вывести значение CSS, которое либо является недопустимым синтаксисом CSS, либо использует собственный синтаксис, который Less не распознает. Если это так, просто поместите значение в строку с префиксом оператора ~, например:

 body {
  @size ~"20px/80px";
  font: @size sans-serif;
}

Это называется «экранированным значением», что приведет к:

 body {
  font: 20px/80px sans-serif;
}

Я готов. Покажите мне магию, пожалуйста.

Идея Less заключается в том, чтобы ускорить и упростить только этап разработки. Это означает, что то, что запускается на вашем конечном веб-сайте, должно быть простым, старым CSS, а не Less. К счастью, это можно сделать очень легко. Все, что вам нужно сделать, это получить компилятор Less и позволить ему делать свою работу. Я рекомендую WinLess (для Windows) и LESS.app (для OS X)

Здесь я объясню вам, как работать с WinLess. Сначала скачайте и установите его. Когда вы запускаете WinLess, все, что вам нужно сделать, это перетащить папку с файлами .less Чтобы настроить поведение WinLess, откройте «Файл»> «Настройки». Я оставляю флажок «Сократить по умолчанию» неактивным, потому что хочу, чтобы мой файл был читабельным, и минимизирую свои файлы только при выводе в производство. Я проверяю другие два параметра ниже, потому что я не хочу компилировать вручную каждый раз, когда я сохраняю файл, и потому, что я хочу знать, успешна ли компиляция. Кстати, для целей обучения вы можете использовать WinLess Online Less Compiler — идеально, если вы хотите быстро что-то попробовать.

Для работы с LESS.app вы можете проверить видеоурок на домашней странице его сайта.

Есть еще один вариант для тех из вас, кто не использует ПК или Mac. Вы можете получить Хруст! , который является кросс-платформенным приложением AIR. Crunch — это не только компилятор Less, но и редактор Less. Это круто, потому что Crunch — единственный редактор, насколько мне известно, который дает подсветку синтаксиса для файлов .less Попробуйте, чтобы понять, что я имею в виду. Знаешь что? Я расскажу тебе мой маленький секрет. На самом деле, я использую оба из них — WinLess для компиляции и Crunch для редактирования. Звучит круто, а?

OK. Я действительно очарован. Где я могу найти больше?

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

  • Официальная Меньшая документация — хорошо. Это не может быть использовано в ваших проектах 🙂 Однако вы должны регулярно проверять наличие обновлений и новых функций, добавленных в язык.
  • Less Elements — коллекция полезных миксинов Less.
  • Preboot.less — еще одна коллекция миксов и переменных Less.
  • Semantic Grid System — простой и удобный в использовании инструмент верстки страниц. Он поддерживает фиксированные, текучие и гибкие макеты. И, кстати, вы также можете использовать его с Sass и Stylus (если вы еще не влюбились в Less).
  • Centage — если вам нужна полная текучесть и гибкость, вы обязательно должны это проверить.
  • Perkins CSS3 Less Framework — приятный и богатый фреймворк Less, который использует HTML5 и CSS3.

Если вы хотите найти еще больше ресурсов о Less, GitHub — это то, что вам нужно. Как вы увидите, там есть множество вкусностей. Чего же ты ждешь? Иди и проверь их.

Несколько заключительных слов

Вкратце, Less — это быстрый, простой и современный способ написания и создания кода CSS. Так что не будьте слишком консервативны, просто попробуйте. Потратьте некоторое время с Less, и вы будете создавать и настраивать сложные таблицы стилей быстрее и проще, чем когда-либо прежде. Желаю вам счастливого программирования и всегда помните: «Меньше значит больше»

И если вам понравилось читать этот пост, вы полюбите Learnable ; место, чтобы узнать новые навыки и приемы у мастеров. Участники получают мгновенный доступ ко всем электронным книгам SitePoint и интерактивным онлайн-курсам, таким как Launch into Less .

Комментарии к этой статье закрыты. Есть вопрос о Меньше? Почему бы не спросить об этом на наших форумах ?