0

我想做的是

  • 循环遍历地图 $breakpoints,
  • 拉出每个断点的最小值,
  • 根据每个计算一个 em 值,
  • 然后将这些用于全局地图 $ms-range

此代码需要生成一个如下所示的变量:

$ms-range:
1.2      20em,
1.333    30em,
1.618    40em,
1.8      50em,
2        60em;

我无法获得返回我想要的格式的函数。也许是地图扩展?!我不知道。我需要一个SASS大师!

萨斯:

$breakpoints: ( s: (320, 479), sm: (480, 767), m: (768, 1023), l: (1024, 1439), xl: (1440, null));


@function returnThatMap() {
    @each $name, $values in $breakpoints {
        @for $i from 1 through length($name) {
          $min: nth($values, 1);
          // if the last one
          @if ($i == length($name))  {
            @return 'calc($i * 1.2)  $min / 16 * 1em'
          }
          // if not the last one
          @else {
            @return 'calc($i * 1.2)  $min / 16 * 1em',
          }
        }
    }
}

$ms-range : returnThatMap() ;


// OUTPUT FORMAT NEEDED below!! (dummy numbers, but correct syntax - ie. number ' ' [number]em,number ' ' [number]em, number ' ' [number]em;)

// $ms-range:
//   1.2      20em,
//   1.333    30em,
//   1.618    40em,
//   1.8      50em,
//   2        60em;

SASSMEISTER 链接: http: //www.sassmeister.com/gist/700f0721fd7940c84435cb1b5210f5d7

4

1 回答 1

1

我注意到的几件事可以通过一些修复来完成

  • 如果您希望函数返回一个列表,$ms-range那么您不应该在每次迭代中返回,而是返回在循环结束时生成的列表

  • 这部分代码'calc($i * 1.2) $min / 16 * 1em'将始终返回一个字符串并且不会执行任何计算,因此最好只执行必要的计算

  • 当您length($name)在代码中使用时,我假设代码的一部分是指length(s)length(sm)依此类推。这将始终返回1,因为它将被解释为只有一项的列表。相反,您应该使用str-lengthwhich 将返回字符串字符的长度

我也没有完全理解您的@if-@else语句的目的,因为它们在它们的块中都包含相同的代码@return 'calc($i * 1.2) $min / 16 * 1em'

根据我对您要完成的工作的理解,代码应如下所示

breakpoints: (  s: (320, 479),
                sm: (480, 767),
                 m: (768, 1023),
                 l: (1024, 1439),
                xl: (1440, null));

@function returnThatMap() {
  $map: ();
  @each $name, $values in $breakpoints {
    $min: nth($values, 1); //This assumes that the first value is always the minimum
    // $min: min($values...); //This in built function can find the minimum between two values as long as they are both integers and might be a better option
    $key: str-length($name) * 1.2;
    $value: ($min / 16) * 1em;
    $map: append($map, ($key $value), comma);
  }
  @return $map;
}

$ms-range : returnThatMap() ;

@debug $ms-range; // 1.2 20em, 2.4 30em, 1.2 48em, 1.2 64em, 2.4 90em}

希望这可以帮助

于 2016-11-17T22:33:37.860 回答