2011-05-15 3 views
11

У меня есть список категорий, из которых я бы хотел установить фоновый цвет. Я хотел бы сохранить значения цветов фона в качестве переменных. Можно ли ссылаться на переменную с помощью строковой интерполяции? Сасс бросает на меня ошибку «Недопустимый CSS», используя этот код:Можно ли ссылаться на переменную с интерполированной строкой?

/* Category Colors */ 
$family_wellness_color: #c1d72e; 
$lifestyle_color: #f4eb97; 
$food_color: #f78f1e; 
... 

/* Categories */ 
@each $cat in family_wellness, lifestyle, food 
{ 
    .#{$cat} 
    { 
     .swatch, .bar 
     { 
      background-color: $#{$cat}_color; 
     } 
    } 
} 

Возможно ли? Я бы очень признателен за совет!

+0

Хотя я не пробовал это раньше, я уверен, что это не поддерживается. Я не могу найти его под [интерполяцией] (http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#interpolation_) или другими применимыми разделами. Счастливое кодирование. –

+0

Да, я не прихожу с очень элегантным решением. Я бы предпочел не создавать класс для каждого категориального цвета, но я склоняюсь к этому, поэтому я могу использовать @extend. # {$ Cat} _background_color (или что-то еще) внутри цикла. – Brandon

+0

Возможно, можно использовать @функцию или написать расширение, возможно (я достаточно уверен, что переменные должны быть доступны в этих контекстах). –

ответ

4

Ну, ближе всего я мог добраться до того, что я хотел:

#_variables.scss 
/* Categories */ 
$family_wellness_color: #c1d72e; 
$lifestyle_color: #f4eb97; 
$food_color: #f78f1e; 
$media_entertainment_color: #db3535; 
$travel_recreation_color: #e30e61; 
$education_color: #92278f; 
$sports_color: #0070bb; 
$technology_color: #00b5cc; 
$products_shopping_color: #028e99; 
$companies_businesses_color: #56BA42; 

#_mixins.scss 
@import 'variables'; 

@mixin get_category_bkgd_color($category_name) 
{ 
    @if $category_name == family_wellness 
    { 
     @include bkgd_color($family_wellness_color); 
    } 
    @else if $category_name == lifestyle 
    { 
     @include bkgd_color($lifestyle_color); 
    } 
    @else if $category_name == food 
    { 
     @include bkgd_color($food_color); 
    } 
    @else if $category_name == media_entertainment 
    { 
     @include bkgd_color($media_entertainment_color); 
    } 
    @else if $category_name == travel_recreation 
    { 
     @include bkgd_color($travel_recreation_color); 
    } 
    @else if $category_name == education 
    { 
     @include bkgd_color($education_color); 
    } 
    @else if $category_name == sports 
    { 
     @include bkgd_color($sports_color); 
    } 
    @else if $category_name == technology 
    { 
     @include bkgd_color($technology_color); 
    } 
    @else if $category_name == products_shopping 
    { 
     @include bkgd_color($products_shopping_color); 
    } 
    @else if $category_name == companies_businesses 
    { 
     @include bkgd_color($companies_businesses_color); 
    } 
} 

#dashboard.scss 
@import 'variables', 'mixins'; 

@each $cat in family_wellness, lifestyle, food, media_entertainment, travel_recreation, education, sports, technology, products_shopping, companies_businesses 
{ 
    .#{$cat} 
    { 
     .swatch, .bar 
     { 
      @include get_category_bkgd_color($cat); 
     } 
    } 
} 

Не самое элегантное решение, но это получить мне подмешать я могу повторно использовать в ряде других областей. Кто-нибудь видит способ сделать это более эффективным?

3

С Rails 3.1 вы можете создавать шаблоны, подобные этому: screen.css.scss.erb - он поставляется со всей добротой scss и erb.

<% [...].each do |category_name| %> 
    @include bkgd_color($<%= category_name %>_color); 
<% end %> 
+0

Спасибо за ответ. Я использую sass standalone для проектов Django и .NET MVC, но мне придется попробовать это. – Brandon

2

.html:

<ul> 
    <li class="family"></li> 
    <li class="life"></li> 
    <li class="food"></li> 
</ul> 

.scss:

$family_color: #c1d72e; 
$life_color: #f4eb97; 
$food_color: #f78f1e; 

// solution 1 - using direct (key, value) pair 
@each $cat, $cat_var in (family, $family_color), (life, $life_color), (food, $food_color) { 
    .#{$cat} { 
     background-color: $cat_var; 
    } 
} 

// solution 2 - using nth function 
@each $cat in (
    family $family_color, 
    life $life_color, 
    food $food_color) { 
     .#{nth($cat, 1)} { 
      background-color: nth($cat, 2); 
     } 
} 

// solution 3 - using sass map 
$colors: (
    family_color: #c1d72e, 
    life_color: #f4eb97, 
    food_color: #f78f1e 
); 

@function color($key){ 
    @if map-has-key($colors, $key){ 
     @return map-get($colors, $key); 
    } 
} 

@each $color in family, life, food{ 
    .#{$color}{ 
     background-color: color(#{$color}_color); 
    } 
} 
Смежные вопросы