Функции в Less CSS: руководство и примеры

Краткое введение в Less
Less CSS — это препроцессор CSS, который добавляет переменные, вложенность, миксины и функции поверх классического CSS. Если вы знакомы с «vanilla» CSS, переход к Less обычно не требует резкой пересадки — синтаксис близок, а преимущества ощутимы при работе с крупными стилевыми базами.
Определение: Функция — это блок кода, который принимает параметры, обрабатывает их и возвращает значение; в Less функции применяются прямо в местах определения свойств.
Важно: препроцессор работает на этапе сборки (или в браузере при подключении компилятора), поэтому итоговый браузерный CSS не содержит вызовов функций — остаются только вычисленные значения.
Что такое функции и зачем они нужны
В программировании функция выполняет определённую задачу и может быть вызвана многократно. Она снижает дублирование логики и улучшает читаемость. В Less это выражается в том, что вы можете вычислять значения, выбирать варианты по условию и манипулировать строками и списками прямо в стилях.
Пример на JavaScript (для понимания концепции, код оставлен как в исходнике):
function checkDiscount(price, threshold){
if (price >= threshold){
let discount = 5/100 * price;
return `Your discount is $${discount}`;
} else {
return `Sorry, this item does not qualify for a discount. `
}
}
Этот пример показывает общую идею: вы выносите логику в одну функцию и затем переиспользуете её.
Понимание функций в Less
В обычном CSS набор функций ограничен (например, calc()). Less добавляет более мощные функции: условные, строковые, для списков и т. д.
Пример использования calc в CSS (для сравнения):
p{
background-color: red;
width: calc(13px - 4px);
}
В Less есть функция if, принимающая условие и два результата:
@width: 10px;
@height: 20px;
div{
margin:if((@width > @height), 10px, 20px)
}
После компиляции получим:
div {
margin: 20px;
}
Пояснение: Less сравнивает значения и возвращает первый аргумент (10px), если выражение истинно, иначе — второй (20px).
Важно: Less выполняет сравнения в момент компиляции, поэтому условие должно быть вычислено до генерации итогового CSS.
Логические значения в Less
Boolean — это значение true или false. Функция boolean() позволяет преобразовать выражение в логическое значение и сохранить его в переменной:
@text-color: red;
@bg-color: boolean(@text-color = red);
Затем это значение можно использовать в условной конструкции:
div{
background-color: if(@bg-color,green,yellow);
}
Результат компиляции:
div {
background-color: green;
}
Замена текста в строке с помощью replace()
Синтаксис:
replace(string, pattern, replacement, flags)
- string — исходная строка;
- pattern — искомая подстрока или регулярное выражение;
- replacement — строка‑замена;
- flags — необязательный параметр для флагов регулярного выражения.
Пример:
@string: "Hello";
@pattern: "ello";
@replacement: "i";
div::before{
content: replace(@string,@pattern,@replacement)
}
После компиляции:
div::before {
content: "Hi";
}
Совет: при использовании регулярных выражений передавайте fourth‑параметр flags для глобального поиска или нечувствительности к регистру.
Функции для работы со списками
В Less список задаётся через запятые или пробелы:
@groceries: "bread", "banana", "potato", "milk";
length() возвращает количество элементов списка:
@result: length(@groceries);
extract() получает элемент по позиции (в Less индексация начинается с 1):
@third-element: extract(@groceries, 3);
range(start, end, step) генерирует список значений с шагом step (по умолчанию step = 1). В Less range чаще используется для генерации наборов значений, которые затем можно применить как шорткап для свойств с несколькими аргументами:
div {
margin: range(10px, 40px, 10);
}
Компиляция даст:
div {
margin: 10px 20px 30px 40px;
}
Пояснение: range начинает с 10px, затем 20px, 30px и заканчивает 40px.
Практический проект: простая страница с Less-функциями
Соберём всё вместе. Создайте папку с index.htm и style.less.
index.htm (фрагмент):
Document
Обратите внимание: без тега script браузер не будет компилировать Less на лету. Для продакшена лучше компилировать .less в .css заранее, используя lessc.
Установка через npm:
npm install -g less
Компиляция файла:
lessc style.less style.css
Файл style.less (пример из статьи):
@container-width: 50rem;
@container-bg-color: yellow;
@string: "Hello from the children of planet Earth!";
@pattern: "children of planet Earth!";
@replacement: "inhabitants of Pluto!";
.container{
width: @container-width;
background-color: @container-bg-color;
padding: if(@container-width > 30rem, range(20px, 80px, 20),"");
border: solid;
}
h1:first-child::after{
content: replace(@string,@pattern,@replacement);
}
Ожидаемый результат после компиляции:
.container {
width: 50rem;
background-color: yellow;
padding: 20px 40px 60px 80px;
border: solid;
}
h1:first-child::after {
content: "Hello from the inhabitants of Pluto!";
}

Повышение продуктивности с препроцессорами
Функции и структуры препроцессоров уменьшают объём копипасты, упрощают рефакторинг и делают стили более предсказуемыми. Особенно это заметно в больших проектах, где повторяющиеся паттерны и наборы свойств должны поддерживаться на протяжении времени.
Когда функции Less не подходят
- Вам нужен нативный CSS для старых рабочих процессов, где сборка невозможна.
- Ограничения совместимости с инструментами: некоторые сборщики/CI в проекте могут не поддерживать Less по умолчанию.
- Если логика слишком сложная — возможно, лучше генерировать CSS из JavaScript/TypeScript или использовать CSS‑in‑JS.
Альтернатива: Sass (SCSS) — более распространённый препроцессор с похожим набором возможностей; выбор часто обусловлен экосистемой и личными предпочтениями.
Ментальные модели и эвристики при использовании функций
- Думайте о Less как о простом слое компиляции: всё вычисляется заранее.
- Выносите значение, которое может измениться, в переменную.
- Используйте функции для «полиморфных» значений: если одно свойство может иметь несколько вариантов — применяйте if/boolean.
- Ограничьте сложную логику в стилях: если условие требует доступа к runtime‑данным, решайте это в JavaScript.
Мини‑методология: как вводить функции Less в проект (шаги)
- Идентифицируйте повторяющиеся значения и паттерны (цвета, отступы, наборы шрифтов).
- Вынесите их в переменные и миксины.
- Протестируйте замену дублирующего кода функциями, например if или range.
- Компилируйте и проверяйте итоговый CSS на совпадение с ожидаемым поведением.
- Документируйте самые используемые функции в README стайлгайда.
Чек-листы по ролям
Разработчик (frontend):
- Выделил переменные для повторяющихся значений.
- Проверил, что файлы .less компилируются в чистый .css без ошибок.
- Обновил сборку CI для компиляции Less.
Дизайнер:
- Согласовал систему отступов и масштаб (rem, px).
- Проверил визуальный результат после компиляции на основных устройствах.
Техлид:
- Утвердил правила использования функций (когда использовать, когда нет).
- Отслеживает влияние на производительность сборки.
Шпаргалка функций (быстрый чек)
- if(cond, a, b) — условный оператор;
- boolean(expr) — возвращает true/false;
- replace(str, pattern, replacement, flags?) — замена в строке;
- length(list) — длина списка;
- extract(list, index) — элемент по 1‑based индексу;
- range(start, end, step?) — набор значений.
Примеры ошибок и как их избегать
- Ошибка: ожидание runtime‑переменных в Less. Решение: вычисляйте подобные значения в JavaScript и применяйте классы или инлайновые стили.
- Ошибка: сложные регулярные выражения в replace(), которые ведут к неожиданным результатам. Решение: тестируйте replace() локально и при необходимости используйте escape для спецсимволов.
Критерии приёмки
- Все .less файлы компилируются без ошибок.
- Итоговый CSS соответствует дизайну.
- Переменные и функции задокументированы в проектном README.
- CI собирает и валидирует CSS при каждом pull request.
Быстрый глоссарий
- Less: препроцессор CSS;
- Миксин: переиспользуемый блок стилей;
- Переменная: именованное значение, используемое в стилей;
- Компиляция: процесс преобразования .less в .css.
Решение для выбора инструмента — простое дерево
flowchart TD
A[Нужен препроцессор?] -->|Да| B{Есть опыт в команде}
B -->|Да: предпочитают JS| C[Less]
B -->|Да: предпочитают Ruby/шире экосистема| D[Sass/SCSS]
B -->|Нет| E[Оценить обе: PoC и тесты]
A -->|Нет| F[Оставить чистый CSS]Заключение
Less добавляет мощные функции в стили, делая код чище и проще в сопровождении. Он особенно полезен для проектов с большим количеством повторяющихся паттернов. Однако важно не переносить в стили всю бизнес‑логику: оставляйте runtime‑решения для JavaScript, а в Less держите предсказуемые, компилируемые вычисления.
Итоговые рекомендации:
- Начните с небольших шагов: вынесите переменные и простые функции;
- Документируйте соглашения стилей;
- Используйте автоматическую сборку и тестирование, чтобы гарантировать стабильность.