Увеличить переменную в LESS css

Как я могу увеличить переменную в LESS css?

Вот пример..

@counter: 1;
.someSelector("nameOfClass", @counter);
@counter: @counter + 1;
.someSelector("nameOfClass", @counter);

Приведенный выше фрагмент кода вызовет эту «синтаксическую ошибку».

SyntaxError: Recursive variable definition for @counter

Есть ли обходной путь для этой ошибки? Например, есть ли такое обозначение, как @counter++?

Спасибо..


person Yacoub Oweis    schedule 25.11.2013    source источник
comment
Разве это не просто уменьшенная копия stackoverflow.com/questions/20199298?   -  person seven-phases-max    schedule 25.11.2013
comment
@ Seven-Phases-Max: вероятно (подозрительно похоже как в вопросе, так и во времени).   -  person ScottS    schedule 25.11.2013


Ответы (1)


Строго не возможно

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

Рассмотрим этот пример:

@counter: 1;
.someSelector("nameOfClass", @counter);
@counter: 2;
.someSelector("nameOfClass1", @counter);

.someSelector(@name; @count) {
  @className: ~"@{name}";
  .@{className} {
  test: @count;
  }
}

Вывод будет 2 для обоих:

.nameOfClass {
  test: 2;
}
.nameOfClass1 {
  test: 2;
}

Это связано с тем, что LESS определяет @counter с последним определением переменной в этой области. Он не обращает внимания на порядок вызовов с использованием @counter, а скорее действует так же, как CSS, и принимает во внимание "каскад" переменной.

Для дальнейшего обсуждения этого в LESS вы можете отслеживать обсуждение, происходящее в этом запросе функции LESS< /а>.

Решение находится в Recursive Call Setter для локальной переменной

Seven-phases-max связан с тем, что он считает ошибкой в ​​LESS , но я так не думаю. Скорее, мне кажется, что это творческое использование рекурсивного сброса счетчика для получения желаемого эффекта. Это позволяет вам достичь того, чего вы хотите (используя мой пример кода):

// counter

.init() {
  .inc-impl(1); // set initial value
} .init();

.inc-impl(@new) {
  .redefine() {
    @counter: @new;
  }
}

.someSelector(@name) {
  .redefine(); // this sets the value of counter for this call only
  .inc-impl((@counter + 1)); // this sets the value of counter for the next call
  @className: ~"@{name}";
  .@{className} {
    test: @counter;
  }
}

.someSelector("nameOfClass");
.someSelector("nameOfClass1");

Вот вывод CSS:

.nameOfClass {
  test: 1;
}
.nameOfClass1 {
  test: 2;
}

ПРИМЕЧАНИЕ. Я полагаю, что здесь вы не строго меняете глобальное значение, а устанавливаете новое локальное значение при каждом вызове .someSelector. Сомнительно, основано ли это на ошибочном поведении или нет, но если это так, это решение может исчезнуть в будущем. Чтобы получить дополнительные комментарии об ограничениях этого метода, см. обсуждение здесь.

person ScottS    schedule 25.11.2013
comment
Кстати. Я только что вспомнил, что есть ошибка/проблема LESS, которой можно злоупотреблять для эмуляции такого переопределения счетчика и переменной. См. эту суть. Но это не более чем просто любопытная поделка конечно. Я надеюсь, что проблема будет решена в конце концов. - person seven-phases-max; 25.11.2013
comment
@seven-phases-max: я не согласен с тем, что это ошибка в вашей сути. Определен один глобальный миксин .inc(), который рекурсивно устанавливает локальную переменную @counter при каждом вызове (на самом деле он не изменяет глобальную переменную-счетчик). Таким образом, по сути, он отслеживает непрерывный подсчет, но обслуживает переменную локально, что именно то, что необходимо для решения здесь. Я адаптировал как этот код, так и другой вопрос для работы с этим. - person ScottS; 26.11.2013
comment
В любом случае, даже если это считается проблемой, ее почти невозможно исправить без серьезного рефакторинга компилятора, поэтому такое поведение почти не изменится в ближайшее время, поэтому я думаю, что его можно использовать в значительной степени безопасно. Если, конечно, не существует другого менее хакерского решения. - person seven-phases-max; 26.11.2013
comment
Кстати. на всякий случай также обратите внимание, что вам не нужно изменять сам .inc(), чтобы использовать новое значение счетчика. См. другой вариант, таким образом реализацию можно даже поместить в отдельный файл less . Я также разместил там некоторые комментарии по затронутым вопросам (это кажется даже более полным, чем я написал выше). - person seven-phases-max; 26.11.2013
comment
Кстати. этот трюк, вероятно, не будет работать в Less 1.7.0 (оказалось, что он основан на #1291 проблема, которая была недавно исправлена). Или, может быть, будет, я не уверен, что нужны дополнительные тесты ... - person seven-phases-max; 21.02.2014
comment
- обновление: будет работать частично. Счетчик увеличивается только при обновлении в глобальной области. - person seven-phases-max; 21.02.2014