Можете ли вы использовать цикл для нулевых аргументов в sass-микшировании?

#validation #sass #maps

#проверка #sass #Карты

Вопрос:

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

 // main mixin

@mixin fontSettings(
    $font-size: null,
    $line-height: null,
    ) 
{
 // if null, get the default value
   @if not $font-size {
       $font-size: -get-font-defaults(font-size);
   }
 // if null get, default value
   @if not $line-height {
    $line-height: -get-font-defaults(line-height);
    }
  // calculate font stuff
    $font-size: $font-size * 1rem;
    $line-height: $line-height * 1rem;
 //output
    font-size: $font-size;
    line-height: $line-height;

}

// map merge mixin
@mixin -set-font-defaults() {
    $-font-defaults: map-merge($-font-defaults, keywords($defaults)) !global;
}

// function to get map values
@function -get-font-defaults($key){
    @return map-get($-font-defaults, $key);
}

//  default settings config map
$-font-defaults: (
    'font-size': 1.2,
    'line-height': 2,
);
  

и использование было бы

 p {
 //output sets fontsize to 12px and line height to 20px
 @include fontSettings;
}
  

мой вопрос в том, есть ли какой-либо способ сократить это без необходимости выполнять проверку @if для каждого аргумента? например, использовать цикл @each для перебора аргументов? Я продолжаю получать недопустимые операции с нулем, если не выполню проверку для каждого аргумента отдельно. если нет способа сократить это с помощью цикла, то я соглашусь с этим, поскольку я новичок, но если есть способ сократить это, я был бы признателен за совет о том, как это сделать. Я планирую добавить больше аргументов к микшированию, это всего лишь тест с двумя. заранее спасибо за любую помощь.

Комментарии:

1. Интересно, ваш код даже компилируется, вы можете вставить его в правильном порядке.

Ответ №1:

Есть более простой способ, вам нужно использовать необязательные параметры миксина в свою пользу. Использование необязательных параметров без их определения позволяет использовать значения по умолчанию, установленные в объявлении, как в примере ниже.

 @mixin fontSettings($font-size: 1.2, $line-height: 2) {
    font-size: $font-size * 1rem;
    line-height: $line-height * 1rem;
}
  

Комментарии:

1. итак, если бы я сделал ` p { @include fontSettings; } h2 { @include fontSettings( $font-size: 1.8; ); } `, это не переопределило бы значение в p и не установило бы для них обоих значение 1.8?

2. Правильно, ваши <p> элементы будут иметь размер шрифта 1,2 rem, а ваши <h2> элементы будут размером 1,8rem. Также в вашем примере для правила h2 вам нужно будет только определить значение, подобное @include fontSettings(1.8)