2012-01-31 90 views
3

我想創建像這樣薩斯:從一個變量

$multi: foo, bar, baz 

與類變量和多類選擇我要創建的組合選擇,像這樣:

.foo, .bar, .baz {} 

我用的縮進語法(不知道這是否重要)。我想要從變量生成的組合選擇器的原因:我需要根據在那裏定義的類數來進行計算。請不要提出像(使用擴展!)這樣的建議,因爲這將需要我再創建一個課程。我需要能夠接近或完全符合常規的組合選擇器輸出。

+1

這將是,如果更多的幫助你指定了你需要做的「計算」。請解釋爲什麼你需要「以接近或精確到正規的綜合選擇輸出」 – maxbeatty 2012-02-01 07:38:59

+0

的類是精靈....所以我有有富,酒吧和巴茲的圖像的一部分的精靈。我有一個循環,將第一個類設置爲特定的背景,然後最後一個循環繼續,第一個循環停止,基本上按順序處理精靈而不必手動管理它。現在我不得不定義變量設置,然後手動指定組合選擇器,只是因爲Sass不會讓我做我想做的事情。 – xckpd7 2012-02-02 15:33:23

回答

2

我有同樣的問題,因爲OP,這是第一個搜索結果我發現,所以現在我已經想通了,我會後我的解決方案,這些問題即使爲1.5歲。

下面是我發現的:爲了使用變量作爲選擇器,您使用SASS interpolation,它與逗號分隔的字符串完美配合。但是,如果你想保存你的選擇是一個list(這樣你可以在上面使用列表功能,例如length($multi))變量,插值將產生一個畸形的選擇。

所以,簡單的解決方法是先定義變量列表,那麼當你需要使用它作爲一個選擇,該列表轉換成一個逗號分隔的字符串:

$multi: ".foo", ".bar", ".baz" 
$multi-selector: "" 
@each $selector in $multi 
    @if $multi-selector != "" 
     $multi-selector: $multi-selector + ", " 
    $multi-selector: $multi-selector + $selector 

#{$multi-selector} 
    //CSS properties go here 

您可能希望抽象列表到逗號分隔字符串功能集成到一個功能(注:上海社會科學院的join功能無法做到這一點,它連接兩個列表成爲一個新的)。這裏是一個可能實現:

@function unite($list, $glue: ", ") 
    @if length($list) == 1 
     @return $list 

    $string: "" 
    @each $item in $list 
     @if $string != "" 
      $string: $string + $glue 
     $string: $string + $item 
    @return $string 

此時原代碼可以儘量精簡:

$multi: ".foo", ".bar", ".baz" 

#{unite($multi)} 
    //CSS properties go here 
+0

我很抱歉編輯你的答案,我認爲它會讓你的答案與我的更改副本。所以請否認這些變化,因爲我已經削減了您的答案的第一部分,這非常有用。 – Able 2014-06-22 08:02:20

0

(代碼前面的答案)酷的功能!有用。我只是想添加一些SCSS語法,給一個機會,人們使用它:

@function unite($list, $glue: ", ") { 
    @if length($list) == 1 { 
      @return $list; 
    } @else { 
     $string: ""; 
     @each $item in $list { 
      @if $string != "" { $string: $string + $glue; } 
       $string: $string + $item; 
    } 

    @return $string; 
    } 
} 

此時原代碼可以儘量精簡:

$multi: ".foo", ".bar", ".baz" 

#{unite($multi)} 
    //CSS properties go here