如何知道我使用 SCSS 在函数中传递了多少变量参数

Posted

技术标签:

【中文标题】如何知道我使用 SCSS 在函数中传递了多少变量参数【英文标题】:How to know how many Variable Arguments I passed in my function using SCSS 【发布时间】:2019-05-07 02:52:12 【问题描述】:

我很难理解 SCSS 变量参数。 如here 所示,很容易理解您可以添加多个参数。

但我不明白如何使用地图来做到这一点。

例如:

我有这张地图:

$spacing: (
    none: 0px,
    micro: 2px,
    tiny: 4px,
);

我正在编写一个函数来控制间距: (很可能是大错特错)

@function spacing($value...) 
   $chosen-spacing: null;
   @if length($value) == 1 
        @if map-has-key($spacing, $value) 
            @return map-get($spacing, $value);
        @else 
            @error "'#$value' doesn't exist in 'spacing map'";
            @return null;
        
    @else 
        @each $v in $value 
            @if map-has-key($spacing, $value) 
                $chosen-spacing: map-get($spacing, $value);
            @else 
                @error "'#$value' doesn't exist in 'spacing map'";
                @return null;
            
        
        @return $chosen-spacing;
       

我想要的是能够将函数调用为:

.blabla 
  padding: spacing(none);
  margin: spacing (micro, tiny);

输出是:

.blabla 
  padding: 0px; 
  margin: 2px 4px; 

没有地图也可以轻松搞定,但有了地图怎么办?

谢谢

【问题讨论】:

【参考方案1】:

你可以这样做:

@function spacing($value...) 
  $chosen-spacing: null;

  @each $v in $value 
     @if($chosen-spacing) 
        $chosen-spacing: #$chosen-spacing + ' '
     ;

     @if map-has-key($spacing, $v) 
        $chosen-spacing: #$chosen-spacing + map-get($spacing, $v);
      @else 
        @error "'#$v' doesn't exist in 'spacing map'";
        @return null;
     
  

  @return $chosen-spacing;

你不需要检查长度,一个简单的循环就足够了。

循环将读取每个参数并将从映射中获取的值添加到$chosen-spacing 变量中。第一个@if检查变量是否已经有值,如果是的话,就意味着我们需要在添加下一个值之前添加一个空格(所以我们没有得到2px4px)。

【讨论】:

【参考方案2】:

您可以将append 与单个循环一起使用。

$spacing: (
    none: 0px,
    micro: 2px,
    tiny: 4px,
);

@function spacing($value...) 
  $chosen-spacing: null;

  @each $v in $value 
      @if map-has-key($spacing, $v) 
          $chosen-spacing: append($chosen-spacing , map-get($spacing, $v));
      @else 
          @error "'#$value' doesn't exist in 'spacing map'";
          @return null;
      
  
  @return $chosen-spacing;


.blabla 
  padding: spacing(none);
  margin: spacing(micro, tiny);

这是输出:

.blabla 
  padding: 0px; 
  margin: 2px 4px; 

【讨论】:

我不知道append,太好了! 也不知道!喜欢它,谢谢。

以上是关于如何知道我使用 SCSS 在函数中传递了多少变量参数的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中,定义一个函数的形参和实参之间具体是如何进行参数传递的?

如何从 Django 视图将变量传递给 SCSS

什么是形参和实参?参数传递的方式都有哪些?

Nativescript-Vue 将数组的长度传递给 SCSS 变量

JS 函数中arguments的使用

传递对 fft 函数的引用时,输出数组的大小应该是多少?图像处理