Ответ Серджио действителен, но опускает нахальные детали, и я использовал немного другой подход.
Вы используете SASS в Rails - не боритесь с текущим, будьте Railsy и дайте активТрубопровод прекомпилирует все ваши CSS.Если вы не пытаетесь сделать что-то экстремальное, как CSSZenGarden с сотнями тем , или каждая тема имеет тысячи строк Я бы рекомендовал установить каждую тему, так каксобственный класс CSS, а не его собственный файл.
- 1 КБ дополнительного CSS в отображаемом файле application.css не затмит ваших пользователей
- Переключать классы тем с помощью JQuery просто:
$(".ThemedElement").removeClass([all your themes]).addClass("MyLittlePonyTheme");
- Как и следовало ожидать, вы должны пометить элементы, которые вы хотите обновить, с помощью
ThemedElement
class
Вы можете в качестве альтернативы просто изменить класс вашего элемента верхнего уровня и свободно использовать наследование и!important
декларация, хотя я нахожу другой подход более понятным.
Если вы думаете, что можете управлять своими темами с помощью классов, а не файлов, вот как мы генерируем их с помощью SASS.SASS не поддерживает объекты в стиле json, поэтому мы должны вернуться назад и установить несколько параллельных массивов со свойствами темы.Затем мы перебираем каждую тему, подставляем динамические свойства в автоматически сгенерированный класс темы, и вы отправляетесь в гонки:
themes.css.scss
@import "global.css.scss";
/* iterate over each theme and create a CSS class with the theme's properties */
@for $i from 1 through 4{
/* here are the names and dynamic properties for each theme class */
$name: nth(("DefaultTheme",
"MyLittlePonyTheme",
"BaconTheme",
"MySpaceTheme"
), $i);
$image: nth(("/assets/themes/bg_1.png",
"/assets/themes/bg_2.png",
"/assets/themes/bg_3.png",
"/assets/themes/bg_4.png"
), $i);
$primary: nth((#7ca8cb,
#3c6911,
#d25d3a,
#c20d2c
), $i);
$font: nth((Rosario,
Helvetica,
Comic Sans,
WingDings
), $i);
/* Now we write our Theme CSS and substitute our properties when desired */
.#{$name}{
&.Picker{
background-image:url($image);
}
color: $primary;
.BigInput, h1{
color: $primary;
font-family: $font, sans-serif !important;
}
.Frame{
background-image:url($image);
}
.Blank:hover{
background-color:mix('#FFF', $primary, 90%) !important;
}
.BigButton{
background-color:$primary;
@include box-shadow(0,0,10px, $primary);
}
/* and so on... */
}
Это что-то вроде хака, но оно нам очень хорошо помогло.Если ваши темы очень сложны или у вас их слишком много, поддерживать их становится более болезненным.