SCSSのファイル設計について Vol.2
前回の記事の続きです、SCSSファイル設計について解説していきます。
必要なディレクトリ構成は次になります。
- scss
- base
- mixin
- module
- page
- pulgins
- setting
style.scss
前回の記事で、baseディレクトリ、mixinディレクトリ、moduleディレクトリについて解説しました。
baseディレクトリに関しては、リセットCSS用の_reset.scssとサイト全体のベースとなる_base.scssが格納されます。
mixinディレクトリには、別Blockで同じスタイルが必要になった場合にmixinを定義するというルールで、mixinファイルを作成します。
moduleディレクトリには、サイト共通で使用するモジュール単位(Block単位)で定義されます。
また、吉本式BEM設計(BEM設計ベース)では、1つのBlockに必ず対になるSCSSファイルが存在するような設計にします。
それでは、続けて、settingディレクトリから解説していきます。
settingディレクトリ
初期設定で必要なパラメータなどが定義されているSCSSファイルを格納するディレクトリです。
- scss
- base
_base.scss
_reset.scss
- mixin
_btn.scss
_font.scss
_animation.scss
_over.scss
_etc.scss(その他)
- module
_header.scss
_gnav.scss
_main.scss
_content.scss
_snav.scss
_side.scss
_footer.scss
_fnav.scss
_share.scss
_etc.scss(その他)
- page
- pulgins
- setting
_config.scss
_function.scss
style.scss
基本的には上のように_config.scssと_function.scssの2つのSCSSファイルが必要となります。
_config.scssは、ファイル名通り「設定」ファイルになります。
サイト共通で必要になる設定値を変数で定義しておくファイルです。
よく使用する変数として、次のような変数があります。
//ブレイクポイント
$breakPointList: 767px, 768px;
//メディアクエリ
$mq: (
'sp': 'screen and (max-width: #{nth($breakPointList, 1)})',
'pc': 'print,screen and (min-width: #{nth($breakPointList, 2)})'
) !default;
//画像格納ディレクトリ
$imgDir: '/img/';
//PCレイアウト時の最小横幅
$minPcContentWidth: 1000px;
//サイトで使用するカラー
$colors: #027744, #e43d60;
その他、案件によって必要になる変数はこの_config.scssに定義します。
続いて、_function.scssですが、ファイル名から想像できると思いますが、functionを定義するSCSSファイルになります。
ここでは例を挙げませんが、案件によっては、多く利用することになります。
pulginsディレクトリ
外部プラグインのスタイルを格納するディレクトリです。
jQueryのプラグインでcssファイルも付随してくることがあります。
そのような場合、html側で直接指定してしまっても良いのですが、もしimportしたい場合は、ここにCSSファイルを格納します。
- scss
- base
_base.scss
_reset.scss
- mixin
_btn.scss
_font.scss
_animation.scss
_over.scss
_etc.scss(その他)
- module
_header.scss
_gnav.scss
_main.scss
_content.scss
_snav.scss
_side.scss
_footer.scss
_fnav.scss
_share.scss
_etc.scss(その他)
- page
- pulgins
slick.css
- setting
_config.scss
_function.scss
style.scss
上の例では、jQueryのプラグインslickスライダーを使用した場合、付随してくるslick.cssをpulginsディレクトリに格納し、該当のSCSSファイルからimportします。
ただ、pulginsディレクトリに格納せず、slick.cssをカスタマイズする目的で、mixinディレクトリに_slick.scssを作成し、定義するというやり方もあります。
pageディレクトリ
ページ単位で使用するスタイルが定義さているSCSSファイルを格納するディレクトリです。
このディレクトリが、最もボリュームが出てくるディレクトリになります。
CSSファイルを分割する場合、次のような分け方が一般的かと思います。
1. サイト共通で使用するCSSファイル
2. そのページ単体で使用するCSSファイル
「サイト共通で使用するCSSファイル」に該当するSCSSは、scssディレクトリ直下に格納しているstyle.scssとなります。
- scss
- base
_base.scss
_reset.scss
- mixin
_btn.scss
_font.scss
_animation.scss
_over.scss
_etc.scss(その他)
- module
_header.scss
_gnav.scss
_main.scss
_content.scss
_snav.scss
_side.scss
_footer.scss
_fnav.scss
_share.scss
_etc.scss(その他)
- page
- pulgins
slick.css
- setting
_config.scss
_function.scss
style.scss
上の赤字になっているstyle.scssファイルです。
このSCSSファイルを、ルート直下にあるcssディレクトリにstyle.cssというファイル名で出力し、全ページのHTMLに読み込ませます。
出力元:/scss/style.scss
↓
出力先:/css/style.css
このSCSSファイルに定義する内容としては、サイト共通で使用するスタイルですので、baseディレクトリ、moduleディレクトリに格納されているSCSSファイルをimportすることになります。
また、それに必要なmixinディレクトリのSCSSファイル、settingディレクトリやpulginsディレクトリのSCSSファイルになります。
具体的には次のようになります。
@import './setting/config';
@import './setting/function';
@import '../../mixin/xxx'; //必要なmixinファイル
@import './base/reset';
@import './base/base';
@import './module/header'; //必要なmoduleファイル
・・・
@import './module/footer';
続いて「そのページ単体で使用するCSSファイル」に該当するSCSSファイルが、pageディレクトリに格納されるSCSSファイルになります。
例えば「株式会社xxxとは」というページがあったとします。
このページのディレクトリは、
/about/index.html
だとします。
このindex.htmlに必要なCSSファイルは次の2つになります。
■サイト共通で使用するCSSファイル
/css/style.css
■そのページ単体で使用するCSSファイル
/css/about/style.css
上の「サイト共通で使用するCSSファイル」に該当するSCSSファイルは、先ほど述べたscssディレクトリ直下に格納されているstyle.scssになります。
「そのページ単体で使用するCSSファイル」は、pageディレクトリに、該当htmlファイルと同じディレクトリで、style.scssを作成します。
//サイト共通で使用するCSS/SCSSファイル
/css/style.css
/scss/style.scss
//そのページ単体で使用するCSS/SCSSファイル
/css/about/style.css
/scss/page/about/style.scss
例えば、次のようなページディレクトリがあった場合
/about/greeting/index.html
/about/history/index.html
/product/index.html
この場合、SCSSのファイル設計は次のようになります。
/scss/page/about/greeting/style.scss → 出力先 /css/about/greeting/style.css
/scss/page/about/history/style.scss → 出力先 /css/about/history/style.css
/scss/page/product/style.scss → 出力先 /css/product/style.css
- scss
- base
_base.scss
_reset.scss
- mixin
_btn.scss
_font.scss
_animation.scss
_over.scss
_etc.scss(その他)
- module
_header.scss
_gnav.scss
_main.scss
_content.scss
_snav.scss
_side.scss
_footer.scss
_fnav.scss
_share.scss
_etc.scss(その他)
- page
- about
-block
style.scss
- pulgins
slick.css
- setting
_config.scss
_function.scss
style.scss
上のディレクトの赤字になっている箇所は、
/about/index.html
このページの「そのページ単体で使用するCSSファイル」に必要なSCSSファイルです。
style.scss以外に、blockディレクトリを用意します。
このblockディレクトリには、ページのコンテンツ部分のBlock要素と対になるSCSSファイルが格納されます。
例えば、このページの大枠のアウトライン要素が次のようなソースコードだとします。
<body>
<!-- header -->
<header class="header"></header><!-- /header -->
<!-- main -->
<main class="main">
<!-- content -->
<div class="content">
///about/index.htmlのコンテンツエリア
</div><!-- /content -->
</main><!-- /main -->
<!-- footer -->
<footer class="footer"></footer><!-- /footer -->
</body>
赤字のコンテンツ部分がこのページ特有のコンテンツになります。
そのほかに出てくるheader要素、footer要素、main要素、content要素は、サイト共通の要素になりますので、これらの要素に対応するSCSSファイルは全てmoduleディレクトリに格納されます。
それ以外の赤字部分のコンテンツのBlock要素に対応するSCSSが、
/scss/page/about/block/
こちらのディレクトリに格納されます。
もう少し具体的にこちらの部分を見て行きます。
例えば、次のようなソースコードになったとします。(content要素の中のソースコードのみを抜粋します。)
<!-- content -->
<div class="content">
<!-- sec -->
<section class="sec">
<h1 class="sec-tit">株式会社xxxとは</h1>
<p class="sec-txt">テキストテキストテキスト</p>
<!-- message -->
<section class="message">
<h2 class="message-tit">挨拶タイトル</h2>
<p class="message-txt">テキストテキストテキスト</p>
</section><!-- /message -->
<!-- history -->
<section class="history">
<h2 class="history-tit">沿革</h2>
<p class="history-txt">テキストテキストテキスト</p>
</section><!-- /history -->
</section><!-- /sec -->
</div><!-- /content -->
上のようなソースコードになった場合、Blockはsec、message、historyの3つあり、それぞれ対応するSCSSファイルは、次のようになります。
/scss/page/about/block/_sec.scss
/scss/page/about/block/_message.scss
/scss/page/about/block/_history.scss
- scss
- base
_base.scss
_reset.scss
- mixin
_btn.scss
_font.scss
_animation.scss
_over.scss
_etc.scss(その他)
- module
_header.scss
_gnav.scss
_main.scss
_content.scss
_snav.scss
_side.scss
_footer.scss
_fnav.scss
_share.scss
_etc.scss(その他)
- page
- about
-block
_sec.scss
_message.scss
_history.scss
style.scss
- pulgins
slick.css
- setting
_config.scss
_function.scss
style.scss
これが吉本式BEM設計(BEM設計ベース)のSCSSファイル設計になります。
このようなSCSSファイル設計になった理由は、要素に設定されているスタイルがどのSCSSファイルで設定しているかが迷わない。
これを追求した結果になります。
例えば、上のソースコードで、message-txtのクラスに対して、スタイルの修正が入った場合、
1. ページ特有のコンテンツ部分 → /scss/page/
2. ページのディレクトリが/about/ → /scss/page/about/
3. messageというBlockの中のElement → /scss/page/about/message.scss
4. txtというElement ↓
message{
&-txt{
//修正対応箇所
}
}
という流れで、該当のスタイル箇所に迷わずに見つけることができます。
SCSSファイルを細かく分けることに抵抗があるかもしれませんが、細かく分け、ルールに基づいて設計することで、見やすいSCSSファイル設計になります。
これが吉本式BEM設計(BEM設計ベース)のSCSSファイル設計です。