Цикл через массив имен переменных в Less
В нашем приложении у нас есть предустановленный список цветов, которые пользователь может выбрать, и все, что связано с этим пользователем, будет иметь этот цвет.
Во всем приложении у нас будут различные модули с цветом, прикрепленным как имя класса.
например.
<div class="example_module green">
...
</div>
Мы используем LESS для нашего CSS.
В ряде мест мы делаем такие вещи:
.example_module.green { background: @green; }
.example_module.red { background: @red; }
.example_module.blue { background: @blue; }
etc
Я хотел бы иметь возможность устанавливать все эти имена цветов в виде массива и перебирать их. Если мы добавим цвета в будущем, нам нужно будет добавить их только в одном месте.
Псевдокод:
@colors: ['green', 'red', 'blue'];
for each @color in @colors {
[email protected] { background: @color; }
}
Что-то вроде этого даже поддерживается в LESS?
Ответы
Ответ 1
См. Loops.
Например (предполагается, что переменные @green
, @red
, @blue
определены в другом месте):
@colors: green, red, blue;
.example_module {
.-(@i: length(@colors)) when (@i > 0) {
@name: extract(@colors, @i);
&[email protected]{name} {background: @@name}
.-((@i - 1));
} .-;
}
- - -
В Modern Less то же самое может быть более прямолинейным с помощью плагина Lists:
@colors: green, red, blue;
.for-each(@name in @colors) {
[email protected]{name} {
background: @@name;
}
}
- - -
И в Legacy Less синтаксический сахар может быть достигнут с помощью:
@import "for";
@colors: green, red, blue;
.example_module {
.for(@colors); .-each(@name) {
&[email protected]{name} {background: @@name}
}
}
Если импортированный фрагмент "for"
(это просто мешалка для рекурсивных циклов меньше), можно найти здесь (с примерами здесь и здесь).
Ответ 2
Этот миксин прекрасно работает для меня. Второй параметр - это блок кода, который имеет доступ к текущему элементу итерации (@value) и индексу (@i).
-
Определить миксин:
.for(@list, @code) {
& {
.loop(@i:1) when (@i =< length(@list)) {
@value: extract(@list, @i);
@code();
.loop(@i + 1);
}
.loop();
}
}
-
Использование:
@colors: #1abc9c, #2ecc71, #3498db, #9b59b6;
.for(@colors, {
[email protected]{i} {
color: @value;
}
});
-
Результат css:
.color-1 {
color: #1abc9c;
}
.color-2 {
color: #2ecc71;
}
.color-3 {
color: #3498db;
}
.color-4 {
color: #9b59b6;
}
Ответ 3
С современной LESS (> = 3.7), вы можете использовать встроенный в each
функции:
/* (assuming @clr-green, @clr-red, @clr-blue variables are defined elsewhere) */
@colors: {
green: @clr-green;
red: @clr-red;
blue: @clr-blue;
}
each(@colors, {
[email protected]{key} {
background: @value;
}
});
Ответ 4
.foreach(@list, @body, @i: length(@list)) when (@i>0)
{
.foreach(@list, @body, @i - 1);
@n: length(@list);
@value: extract(@list, @i);
@body();
/* you can use @value, @i, @n in the body */
}
- Использование:
.example-module {
.foreach (red green blue,
{
&[email protected]{value} {
color: @value;
}
});
}
Другой пример:
.nth-child (@list, @style) {
.foreach(@list,
{
@formula: e(%("%dn+%d", @n, @i));
&:nth-child(@{formula}) {
@style();
}
});
}
tr {
.nth-child (#bbb #ccc #ddd #eee,
{
background: @value;
});
}