Цикл по массиву пар имя-значение в LESS

Есть ли способ зациклить массив пар имя / значение LESS? Что-то вроде этого:

arr = alice: black, bob: orange;

.for(arr) // something something //
   .cl-@{name} {
       background-color: @{value}
   }

Чтобы сгенерировать что-то вроде этого:

.cl-alice { background-color: black; }
.cl-bob { background-color: orange; }

Я знаю, что вы можете использовать цикл для цикла, но я не уверен, что это может быть массив объектов, а не значений в LESS.

3 ответа

Ответ, данный @seven-phase-max, работает очень хорошо. Для полноты вы также должны заметить, что вы можете сделать то же самое в Меньше без импортированных "for" сниппет.

с сайта lesscss.org

Пытаясь максимально приблизиться к декларативной природе CSS, Лесс решил реализовать условное выполнение через защищенные миксины вместо операторов if/else, в духе спецификаций функций @media.

а также

В Мессине миксин может позвонить сам. Такие рекурсивные миксины, в сочетании с Guard Expressions и Pattern Matching, могут использоваться для создания различных итеративных / петлевых структур.

Таким образом, в Less вы могли бы написать:

@array: alice black, bob orange;

.createcolorclasses(@iterator:1) when(@iterator <= length(@array)) {
    @name: extract(extract(@array, @iterator),1);
    .cl-@{name} {
        background-color: extract(extract(@array, @iterator),2);
    }
    .createcolorclasses(@iterator + 1);
}
.createcolorclasses();

или действительно:

@array: alice black, bob orange;

.createcolorclasses(@iterator:1) when(@iterator <= length(@array)) {
    @name: extract(extract(@array, @iterator),1);
    &@{name} {
        background-color: extract(extract(@array, @iterator),2);
    }
    .createcolorclasses(@iterator + 1);
}
.cl-{
    .createcolorclasses();
}

В Less "пара" (в ее простейшей форме) также может быть представлена ​​в виде массива, поэтому она может быть такой простой, как:

@import "for";

@array: alice black, bob orange;

.for(@array); .-each(@value) {
    @name:  extract(@value, 1);
    @color: extract(@value, 2);
    .cl-@{name} {
        background-color: @color;
    }
}

Тем не менее, обратите внимание, что ".for" ограничен единственным циклом для каждой области, поэтому лучше переписать выше что-то вроде этого:

@import "for";

@array: alice black, bob orange;

.cl- {
    .for(@array); .-each(@value) {
        @name:  extract(@value, 1);
        &@{name} {
            background-color: extract(@value, 2);
        }
    }
}

Импортированный "for" фрагмент (это просто обёртка mixin для рекурсивных циклов Less) можно найти здесь (с примерами здесь и здесь).

Хотя из других ответов полезно знать, что Less поддерживает рекурсивные функции и миксины, теперь есть гораздо более простой ответ на этот простой вопрос. Это решение протестировано для работы с Less v3.9, но должно быть возвращено к Less v3.7, когда каждый был представлен.

.array() {
  alice: black;
  bob: orange;
}

each(.array(), {
  .cl-@{key} {
    background-color: @value;
  }
});

Вывод аккуратный:

.cl-alice {
  background-color: black;
}

.cl-bob {
  background-color: orange;
}

Хочу больше? Ну, как говорится, "Вы можете рисковать больше". использование @index использовать индекс на основе 1 в формуле выше.

Вот один " параметрический миксин", который вы можете использовать с парами "ключ: значение".

Массив пар "ключ: значение" определяется следующим образом: @array: "ключ: значение", "ключ: значение";

// imported "for" snippet (it's just a wrapper mixin for recursive Less loops)
// http://is.gd/T8YTOR
@import "for";

// loop all items and generate CSS
.generate_all(@array) {
    .for(@array);
    .-each(@item) {
        @name: e(replace(@item, ':(.*)', ''));
        @value: replace(@item, '^[^:]*:', '');
        @{name} {
            z-index: e(@value);
        }
    }
}

Определение:

@array_test: ".test:9000", "header .mainNav:9000", "footer:8000", "li.myclass:5000";

Тестовое задание

.generate_all(@array);

Результат:

.test {
  z-index: 9000;
}
header .mainNav {
  z-index: 8000;
}
footer {
  z-index: 7000;
}
li.myclass {
  z-index: 5000;
}

У меня работает с помощью grunt + less@1.7.4

Другие вопросы по тегам