SASS / SCSS:从字符串/名称

时间:2016-10-12 18:36:01

标签: variables sass concatenation string-interpolation

是否可以按名称获取变量?

我尝试构建以下功能,但它没有按预期工作......

@function variable-lookup($variable, $suffix: "") {
  $value: null;
  @if ($suffix != "" and global-variable-exists($variable+"-"+$suffix)) {
    $value: #{$variable+"-"+$suffix};
  }
  @else if (global-variable-exists($variable)) {
    $value: #{$variable};
  }
  @return $value;
}

以下是如何使用它的示例:

$primary: #000;
$primary-hover: blue;

a {
  color: variable-lookup("primary", "base");

  &:hover {
    color: variable-lookup("primary", "hover");
  }
}

当我想在这个"变量查找"周围写一堆特定于上下文的速记包装函数时,真正的力量就会出现。功能

任何想法如何实现这一目标?

1 个答案:

答案 0 :(得分:3)

尝试插入#{$variable+"-"+$suffix}以提供值primary-base并进一步尝试获取相同变量名的值不可能primary-base已经是一个值,并且无法解释为变量名称。这种事情可能导致很多混乱。

对于您想要完成的任务,您最好使用map并检查该地图中的key

$colours: (
  'primary': red,
  'primary-base': blue
);

@function variable_lookup($colour, $suffix: '') {
  $value: null;
  @if ( $suffix != '' and map-has-key($colours, unquote($colour+'-'+$suffix)) ) {
    $value: map-get($colours, unquote($colour+'-'+$suffix));
  } @else if ( map-has-key($colours, unquote($colour)) ) {
    $value: map-get($colours, unquote($colour));
  }
  @return $value;
}

div {
  color: variable-lookup(primary, base);
}

p {
  color: variable-lookup(primary);
}

这将编译为以下css

div {
  color: blue; }

p {
  color: red; }

您的代码将颜色存储为变量,但我在keys

中将这些名称用作maps

这允许使用map-has-key方法模拟代码中变量的检查。如果返回true,则key存在,我们可以使用map-get

获取在这种情况下为颜色的值

更新的答案
解决您在评论中提出的问题的一种方法是定义变量并将其作为地图中的值使用

$primary: #fff;
$warning: yellow; 

$colours: ( primary: $primary, 
            primary-hover: darken($primary, 5%), 
            secondary: $warning, 
            secondary-hover: darken($warning, 5%) );

另一种方法是迭代两个列表并将颜色映射到样式

$colours: ();

$list: primary success warning; //map primary to blue, success to green and so on
$shades: blue green yellow;

@for $i from 1 through length($list) {
  $key: nth($list, $i);
  $value: nth($shades, $i);
  $colours: map-merge($colours, ($key: $value));
  $colours: map-merge($colours, (unquote($key+'-hover'): darken($value, 5% )) );
}

@debug $colours // (primary: blue, primary-hover: #0000e6, success: green, success-hover: #006700, warning: yellow, warning-hover: #e6e600)

variable_lookup功能保持不变。

希望能够提供帮助