2015-04-07 2 views
1

Мне нужно добиться такого эффекта, но даже когда @padding на самом деле < @height все еще использует значение множителя 2, которое не имеет смысла ... Есть ли какие-либо ограничения, которые я не знаю о ?LESS условное изменение переменной внутри mixin

.btn-svg-offset(@height, @padding) { 
    @paddings-n: floor(@height/@padding); 
    @multiplier: 2; 

    & when (@padding < @height) { 
     @multiplier: 1; 
    } 

    @btn-svg-offset: @padding + ((@height/@multiplier) * @paddings-n); 
}; 

Любые обходные приветствуются)

ответ

3

& when не if (они обычно говорят так просто для краткости). & {...} по-прежнему является регулярным набором правил с его собственной областью, а переменные, определенные внутри набора правил, не отображаются во внешних областях.

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

.btn-svg-offset(@height, @padding) { 
    @paddings-n: floor(@height/@padding); 

    .-() {@multiplier: 2} .-; 
    .-() when (@padding < @height) { 
     @multiplier: 1; 
    } 

    @btn-svg-offset: @padding + ((@height/@multiplier) * @paddings-n); 
} 

Обратите внимание, что вы можете поместить то же условие на .btn-svg-offset mixin (так что в реальном коде он не обязательно должен быть таким подробным, как в моем примере ... Точный код может меняться, хотя в зависимости от использования mixin и других его внутренних компонентов).

(Upd.) Например, следующий код (некоторые вариации возможны также) было бы эквивалентно:

.btn-svg-offset(@height, @padding, @multiplier: 2) { 
    @paddings-n: floor(@height/@padding); 
    @btn-svg-offset: @padding + @height/@multiplier * @paddings-n; 
} 

.btn-svg-offset(@height, @padding) when (@padding < @height) { 
    .btn-svg-offset(@height, @padding, 1); 
} 
+0

Эй человек, ТНХ очень приятно это .-! Проблема в том, что часть (@padding <@height) {все еще не работает :(Любые идеи, почему? Первое объявление работает, хотя) – thematrixhasyou

+0

P.S. МЕНЬШЕ было бы реально, если бы к настоящему времени было бы очень удобно)) Я знаю, что SASS есть, но я его ненавижу) – thematrixhasyou

+0

Я думаю, что оба решения не будут работать, потому что '@multiplier: 2' утечка в область вызывающего абонента до' когда 'был вызван, а затем« Переменная, определенная непосредственно в области вызовов, не может быть переопределена ». (при использовании mixins в качестве функций). Таким образом, для решения этой проблемы вам понадобятся два 'битна-svg-offset' mixins с разными настройками. Я не уверен, что это какая-то ошибка. @ seven-phase-max говорит: '& {...} по-прежнему является регулярным набором правил. Но я ожидаю, что '.mixin {& when() {}}' должен действовать как '.mixin {}', а затем '.mixin when() {}' –

Смежные вопросы