繁体   English   中英

SASS / SCSS:从字符串/名称插入变量

[英]SASS / SCSS: Interpolate variable from string / name

是否可以通过名称获取变量?

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

@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");
  }
}

当我想围绕此“变量查找”函数编写一堆特定于上下文的速记包装函数时,才有真正的威力。

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

尝试对#{$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; }

您的代码将颜色存储为变量,但我在maps中将这些名称用作keys

这允许使用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函数保持不变。

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM