2017-05-24 185 views
1

我正在嘗試爲我們在企業標識中使用的所有顏色創建一個小概述。我們所有的顏色都已經在_settings-colors.scss中定義,我需要這一點的CSS的唯一原因是庫的顏色需要列出。在@each循環中使用sass變量

我現在有如下:

$colors-brand: color-brand, color-brand-40, color-brand-60, color-brand-70; 

.prfx-color { 
    display: block; 
    height: 5rem; 
    width: 100%; 

    @each $color in $colors-brand { 
     &--#{$color} { 
      background-color: #{'$'+$color}; 

      &::after { 
       content: '$'+$color; 
      } 
     } 
    } 
} 

這些顏色,品牌變量中,我包括在該文件SCSS另一個文件設置。

上面的代碼輸出這樣的:

.prfx-color { 
    display: block; 
    height: 5rem; 
    width: 100%; 
} 
.prfx-color--color-brand { 
    background: $color-brand; 
} 
.prfx-color--color-brand::after { 
    content: "$color-brand"; 
} [...etc] 

但是之後我什麼,是這樣的:

.prfx-color--color-brand { 
    background: #00ff11; // don't worry, brand is not actually this color 
} 

我遇到的問題是,$色品牌變量ISN」 t被解釋爲sass變量,但它是一個字面值。我需要這個變量引用的#hheexx!

到目前爲止我發現的所有解決方案都是使用兩個列表或一個鍵值對。在我的情況下,這些變量已經設置了一次,我想要一個解決方案,如果顏色改變,我不想手動編輯庫。

這是在所有possibe,或我是否太貪婪在這裏?

回答

1

我意識到我過於複雜。你不需要任何額外的功能,因爲@每個被設計爲與地圖一起工作並迭代多個值。

$cool: blue; 
$mad: red; 

$colors: (
    cool: $cool, 
    mad: $mad 
); 

.prfx-color { 
    @each $key, $val in $colors { 
    &--#{$key} { 
     background-color: $val; 

     &::after { content: "$#{$key}"; } 
    } 
    } 
} 
+0

這是如此漂亮,它是美麗的。謝謝:) – Kablam

1

您可以使用地圖。 這是你的一個sassmeister遊樂場。

$cool: blue; 
$mad: red; 

$colors: (
    cool: $cool, 
    mad: $mad 
); 

.prfx-color { 
    @each $color in map-keys($colors) { 
    &--#{$color} { 
     background-color: map-get($colors, $color); 

     &::after { content: "$#{$color}"; } 
    } 
    } 
} 
+0

那。是。真棒。謝謝! 我已經將這個解決方案剷除到「不得不重新定義所有顏色」的堆上,但這實際上效果非常好!你知道爲什麼Angular以這種方式解析變量,而不是使用我早期的技術?你能解釋一下嗎? – Kablam

+1

很高興幫助。這不是Angular,而是SASS。你試圖編譯SASS變量名,但是SASS並沒有這樣做。它只編譯變量值。 所以我做了一個映射,其中的鍵名與變量名相同,沒有$。 @each遍歷映射鍵來創建類名,map-get使用鍵來提取值,並且爲內容插入關鍵字(而不是變量)(在內容字符串中預先放置一個$所以它和變量名一樣 查看SASS函數:http://sass-lang.com/documentation/Sass/Script/Functions.html – Ari

+0

你說得對,對不起。項目,並得到了條件混合起來,我的壞! – Kablam