2014-02-21 3 views
1

Это первый раз I'mn создание сайта с помощью LESS и столкнулся с проблемой, лучше всего описываемую ниже код:Переменная интерполяции строк возвращает не стоимости единицы товара

@section-row-padding-size-xs: 30px; 
@section-row-padding-size-sm: 50px; 
@section-row-padding-size-md: 100px; 
@section-row-padding-size-lg: 140px; 

.section-row-padding(@size) { 
    @padding-size: ~"@{[email protected]{size}}"; 

    .section-row { 
     padding: @padding-size 0; 

     &.quarter-padding-top { 
      padding-top: @padding-size * 0.25; 
     } 

     &.quarter-padding-bottom { 
       padding-bottom: @padding-size * 0.25; 
     } 

     &.half-padding-top { 
      padding-top: @padding-size * 0.5; 
     } 

     &.half-padding-bottom { 
      padding-bottom: @padding-size * 0.5; 
     } 

     &.three-quarters-padding-top { 
      padding-top: @padding-size * 0.75; 
     } 

     &.three-quarters-padding-bottom { 
      padding-bottom: @padding-size * 0.75; 
     } 
    } 
} 

Все это делает код выводит правые размеры заполнения для использования в медиа-запросах.

Любой вызов .section-row-padding() либо с аргументом lg, md, sm и xs должен выдавать соответствующие размеры заполнения.

Проблема возникает из-за того, что размер @ padding не задан как единица px, а скорее как строка. Я пробовал несколько методов интерполяции, но никто из них не работает. isnumber(@padding-size) выходы false и istring(@padding-size) выходы true. @padding-size + 0px также не работает, он говорит об операции с недопустимым типом.

Есть ли что-нибудь, что я пропустил?

Спасибо за ваше время и ответ!

+0

'padding: @ padding-size 0;' работает, но любые математические операции терпят неудачу. –

+0

Почему бы вам просто не передать переменную в mixin? .section-рядная обивка (@ секция-рядная обивка размера-XS); –

+0

Это правда! Глупый я, я использовал другие mixins для определения размеров заголовков от h1 до h3, и этот метод был более удобным, но я не думал об этом более просто. Но все же, я хочу знать, как решить проблему выше :) –

ответ

0

Вложенная интерполяция, то есть ~"@{[email protected]{size}}" официально не поддерживается в Меньше. (Он работает в текущих версиях, но может прекратить работать в любой момент).

Правильный способ добиться того, что вы хотите:

.section-row-padding(@size) { 
    @var-name: "[email protected]{size}"; 
    @padding-size: @@var-name; 
    padding: (@padding-size * 2); 
} 

или короче:

.section-row-padding(@size) { 
    @padding-size: "[email protected]{size}"; 
    padding: (@@padding-size * 2); 
} 

См "variable references" для @@ смысла.

Проблема вызвана @padding-size, которая не интерпретируется как единица px, а скорее как строка.

Точно. Использование ~"" - это как сказать компилятору «не интерпретировать это значение, это всего лишь строка с любым значением, которое я хочу, чтобы вы проходили». Таким образом, тип значения, возвращаемого ~"@{[email protected]{size}}" в вашем примере, не является числом и не может использоваться с арифметическими операциями (отсюда: «Работа с недопустимым типом»).

(Несколько ссылок на «почему ~"" следует по возможности избегать»: 1, 2, 3, 4 и т.д.).

+0

Awesome! Спасибо за ответ :) –

+0

Я сделал замечание «по возможности» :) Если это неизбежно, то это неизбежно (предположим, почему он все еще существует вообще). в моем примере это нормально, так как позже оператор '@@' заставляет компилятор интерпретировать« неизвестную »экранированную строку как имя переменной, и все идет в безопасности. –

+0

Хорошо, понял. В конце концов я не использовал ~ "", и он все еще работает, спасибо! –