J'ai donc un système d'administrateur Rails qui permettra à un utilisateur de choisir un thème, essentiellement un ensemble de variables de couleur Sass qui recompilera les applications.css.scss avec les nouvelles couleurs. Quelle serait la meilleure façon de changer cela lorsque l'utilisateur sélectionne à partir d'une liste déroulante et soumise? J'ai lu quelque chose sur certains problèmes de mise en cache et de recompilation, mais je ne suis pas totalement claire comment la configurer.
Actuellement, j'ai ... P>
Application.css.scsss P>
$theme_sprite_path: '/images/sprite_theme_name.png'; $main_color:#009DDD; $secondary_color:#b3d929; $light_background:#f2f2f2; $border_line:#e6e6e6; $off_white:#f9f9f9; $white:#ffffff; $font_body:#565b59; $font_headers:#363a36;
4 Réponses :
Je crois que vous pouvez utiliser ERB sur des variables en ligne en sass. Je ne suis pas positif, mais je pense que cela ressemblerait à ce que ceci:
thèmes / _whatever_theme.sass.erb p> Ceux-ci doivent être créés de manière dynamique pour chaque charge de page . Je ne sais pas comment la mise en cache fonctionnerait ici. P> p>
Qui vaincre essentiellement le but de l'actif de l'actif :-)
Il pourrait tout aussi facilement être fait dans un fichier d'actifs / feuilles de style / style.sass.erb.
3 étapes faciles:
compiler tous les thèmes dans différents fichiers lors du déploiement. Cela s'occupera de l'horodatage, de la zippation, etc. p> li>
Render Page avec thème par défaut. p> li>
Utilisez JavaScript pour charger un thème alternatif CSS. P> LI> ol>
Pas besoin de déconner avec la compilation dynamique et de tout cela. P>
Pour charger un CSS Dynamiquement, vous pouvez utiliser quelque chose comme ceci: p>
function loadCSS(url) { var cssfile = document.createElement("link"); cssfile.setAttribute("rel", "stylesheet"); cssfile.setAttribute("type", "text/css"); cssfile.setAttribute("href", url); }
En y réfléchissant, cela semble le moyen le plus simple de la mettre en œuvre. Essentiellement, je pourrais avoir .. theme_one.css.scss theme_two.css.scssssSSS code> à l'intérieur comprenant ce que j'ai besoin ...
@import "thèmes / theme_one_colors"; @import "commun"; @ Import "RESET"; @import "base"; ' code> appeler simplement
<% = stylesheet_link_tag "# {nom_name}"%> code> et changer si nécessaire, je pense que je pense :)
En fonction de la quantité de chevauchement entre vos thèmes, ma suggestion pourrait être plus sèche
Une option consiste simplement à charger simplement un ensemble de règles CSS personnalisées (votre thème) après votre application.css et de laisser votre thème remplacer les couleurs par défaut de l'application.css. Vous pouvez simplement ajouter une colonne de base de données "Theme" et charger le CSS avec ce nom de manière dynamique. P>
Sass n'est pas conçu pour la compilation de données dynamiques à la volée. Si vous souhaitez un traitement dynamique du CSS, vous pouvez ajouter une méthode de contrôleur appelée "Custom_CSS" et faire cette réponse au format CSS et le charger de manière dynamique avec des variables en ligne, mais je ne pense pas que SASS est destiné à être utilisé pour le tout. p>
Oui, les suggestions de Sergio sont super. Je diviserais toujours le thème.css et l'application.css, il me semble tout simplement plus propre pour moi.
La base de données est également une bonne suggestion, même si cela n'a de sens que si vous devez prendre en charge les thèmes définis par l'utilisateur. Sinon, vous stockez / migration / gestion des détails de la présentation dans la couche de données de l'application. Cela semble être un mauvais flux de travail et un choix de performance.
Oh, j'ai compris cela comme si l'utilisateur doit choisir son thème qui doit être stocké et utilisé pour son profil. Dans ce cas, je ne connais aucun autre moyen de stocker le nom de thème dans la base de données.
Oui, l'utilisateur choisirait un thème qui serait ensuite stocké dans la base de données, j'ai baissé la déroute suggérée de Segio pour l'instant, mais merci pour toutes vos suggestions.
La réponse de Sergio est valide, mais omet les détails impertinents et j'avais utilisé une approche légèrement différente.
Vous utilisez Sass dans les rails - ne vous battez pas le courant, soyez rabais et laissez le pipeline d'actif avant tout votre CSS. Sauf si vous essayez de faire quelque chose d'extrême comme CSSZengarden avec Vous pouvez également changer la classe sur votre élément de niveau supérieur et faire une utilisation libérale de l'héritage et du Si vous pensez que vous pouvez gérer vos thèmes avec des classes plutôt que des fichiers, voici comment nous les générer avec SASS. Sass ne prend pas en charge les objets de style JSON, nous devons donc nous retrouver et mettre en place un tas de matrices parallèles avec les propriétés thématiques. Ensuite, nous iTerons sur chaque thème, remplacez les propriétés dynamiques dans la classe de thème générée automatiquement et vous êtes partis sur les courses: p> themes.css.scss. / strong> p> P> P>
$ (". thème thème"). Removeclass ([[tous vos thèmes]). addclass ("myLittlePonytheme"); Code> LI>
ThemedElement Code> Classe Li>
ul>
! Important code> Déclaration, bien que je trouve l'autre approche plus maintenue. P >
@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... */
}
Très bonne réponse! J'ai beaucoup aimé cette idée. En outre, des points de reconnaissance des pièges dans votre propre solution.
Au fait, si vous ne le saviez pas, vous êtes censé accepter une réponse si vous trouvez cela utile (s'il y en a plusieurs, choisissez le meilleur). De cette façon, vous remerciez vos pairs pour l'aide :-)
J'ai raté ça, trié maintenant. Merci.