2017-01-22 7 views
0

テーマ設定ファイルを使用してWordPressテーマ用に異なるCSSテーマを作成したいとします。セットアップ(簡体字)は以下のようになります:SCSSのテーマ変数ファイルを反復する

/themes/_theme1.scss 
/themes/_theme2.scss 
/components/_file1.scss 
/components/_file2.scss 
/theme.scss 

アイデアは.theme-theme1または.theme-theme2のような文書のボディにクラスを追加することで簡単にテーマ設定を有効にすることです。ファイル内で_theme#.scss私はテキストの色、フォントのサイズなどのような変数を定義したいと思います。 _file#.scssには、実際のスタイルが定義されています。

私の質問は、files.scssを埋めている間、テーマ設定ファイルを繰り返し処理する方法です。

サンプルアイデア、背景色:

body { 

###foreach themefile### 
&.theme# { 
    background-color: $background-color; 
} 
###/foreach### 

} 

私は結果のCSSファイルで利用可能な唯一のテーマでこれを行う方法を知っているが、私は結果のCSSにすべてのテーマを利用できるようにしたいです。私が私に正しいことを説明しているかどうかわからないので、詳細を聞いてみてください。

テーマファイルの変数を通してforeachループを使用してこのスタイルシートを作成する方法はありますか、テーマファイルごとに追加のscss-ルールを使用して行う必要がありますか?

答えて

2

の組み合わせを使用して@import@mixinのコンボを使用してスタイルを生成することは可能です。このメソッドは、最小限の繰り返しコードを生成する必要があります。

ファイルの設定方法は次のとおりです。ファイルの一部に

- scss 
    - themes 
    - _theme1.scss 
    - _theme2.scss 
    - _theme.scss 
    - styles.scss 

_プレフィックスがきれい私たちのビルドを維持するためにCSSにコンパイルされてからそれらを防ぎます。今度は、ファイルの内容を見ていきましょう:

_theme1.scss

$theme-name: 'theme1'; 

$primary-color: red; 
$primary-font-size: 24px; 

_theme2.scss

$theme-name: 'theme2'; 

$primary-color: blue; 
$primary-font-size: 12px; 

これは単純化しすぎの例であるが、基本的なアイデアを与える必要があります。各テーマファイルには変数のみが含まれます。

_theme.scss

@mixin themestyle() { 
    body.#{$theme-name} { 
    p { 
     color: $primary-color; 
     font-size: $primary-font-size; 
    } 

    .bordered { 
     border: 3px solid $primary-color; 
    } 
    } 
} 

themestyleミックスインは/themes/_theme*.scssファイルから変数を使用して、テーマごとにすべてのスタイルが含まれています。 body.#{$theme-name}は、変数の現在の値に応じて、body.theme1またはbody.theme2のようなセレクタを作成します。

このデモでは、pタグでスタイリングしていますが、これはサイトのすべての要素/セレクタに簡単に拡張できます。重要なことは、すべてのスタイルがbody.#{$theme-name}セレクタの内側にある必要があることです。

最終的には、DRY部分です。styles.scssファイルは各テーマファイルをインポートし、mixinを呼び出して各テーマのスタイルを生成します。それはループまたはミックスイン内@importすることはできませんので

styles.scss

@import 'themes/theme'; 

/* Theme 1 Styles */ 
@import 'themes/theme1'; 
@include themestyles(); 

/* Theme 2 Styles */ 
@import 'themes/theme2'; 
@include themestyles(); 

繰り返し@import/@includeが必要とされる、またはこれがもう少し最適化することができます。

/* Theme 1 Styles */ 
body.theme1 p { 
    color: red; 
    font-size: 24px; } 
body.theme1 .bordered { 
    border: 3px solid red; } 

/* Theme 2 Styles */ 
body.theme2 p { 
    color: blue; 
    font-size: 12px; } 
body.theme2 .bordered { 
    border: 3px solid blue; } 

これらのテーマは、今<body class="theme1">または<body class="theme1">のように、bodyタグにクラスを追加することで実現することができます:styles.scss一度

は出力がされるコンパイルされます。

セットアップを示すCloud9 projectです。

関連する問題