在Sass中dynamic创build或引用variables

我想对我的variables使用string插值引用另一个variables:

// Set up variable and mixin $foo-baz: 20px; @mixin do-this($bar) { width: $foo-#{$bar}; } // Use mixin by passing 'baz' string as a param for use $foo-baz variable in the mixin @include do-this('baz'); 

但是当我这样做,我得到以下错误:

未定义的variables:“$ foo-”。

Sass是否支持PHP风格的variables?

Sass不允许dynamic创build或访问variables。 但是,您可以使用列表进行类似的行为。

SCSS:

 $medium: 2; $width: 20px 30px 40px; @mixin do-this($bar) { width: nth($width, $bar); } #smth { @include do-this($medium); } 

CSS:

 #smth { width: 30px; } 

这实际上可以使用SASS地图代替variables。 这里是一个简单的例子:

dynamic引用:

 $colors: ( blue: #007dc6, blue-hover: #3da1e0 ); @mixin colorSet($colorName) { color: map-get($colors, $colorName); &:hover { color: map-get($colors, $colorName#{-hover}); } } a { @include colorSet(blue); } 

输出为:

 a { color:#007dc6 } a:hover { color:#3da1e0 } 

dynamic创build:

 @function addColorSet($colorName, $colorValue, $colorHoverValue: null) { $colorHoverValue: if($colorHoverValue == null, darken( $colorValue, 10% ), $colorHoverValue); $colors: map-merge($colors, ( $colorName: $colorValue, $colorName#{-hover}: $colorHoverValue )); @return $colors; } @each $color in blue, red { @if not map-has-key($colors, $color) { $colors: addColorSet($color, $color); } a { &.#{$color} { @include colorSet($color); } } } 

输出为:

 a.blue { color: #007dc6; } a.blue:hover { color: #3da1e0; } a.red { color: red; } a.red:hover { color: #cc0000; } 

任何时候我需要使用一个条件值,我依靠function。 这是一个简单的例子。

 $foo: 2em; $bar: 1.5em; @function foo-or-bar($value) { @if $value == "foo" { @return $foo; } @else { @return $bar; } } @mixin do-this($thing) { width: foo-or-bar($thing); } 

如果您正在使用rails,以及可能在其他情况下使用另一个选项。

如果将.erb添加到文件扩展名的末尾,则Rails会在将文件发送给SASS解释器之前处理文件的erb。 这给了你一个机会去做你想要的Ruby。

例如:(File:foo.css.scss.erb)

 // Set up variable and mixin $foo-baz: 20px; // variable <% def do_this(bar) "width: $foo-#{bar};" end %> #target { <%= do_this('baz') %> } 

结果如下scss:

 // Set up variable and mixin $foo-baz: 20px; // variable #target { width: $foo-baz; } 

哪个粗糙,结果如下css:

 #target { width: 20px; } 

为了使dynamicvariables在SASS中是不可能的,因为当你运行sass命令时,你将会添加/连接另外一个需要被parsing的variables。

一旦命令运行,它会为无效的CSS抛出一个错误,因为所有你声明的variables都会跟着提升。

一旦运行,您将无法再次声明variables

要知道我已经理解了这一点,请说明以下内容是否正确:

你想声明variables的下一个部分(单词)是dynamic的

就像是

 $list: 100 200 300; @each $n in $list { $font-$n: normal $n 12px/1 Arial; } // should result in something like $font-100: normal 100 12px/1 Arial; $font-200: normal 200 12px/1 Arial; $font-300: normal 300 12px/1 Arial; // So that we can use it as follows when needed .span { font: $font-200; p { font: $font-100 } } 

如果这是你想要的,恐怕截至目前,这是不允许的