Sassで@useと@forwardを使ったサイト設計 - @importから切り替える手順
今回はSassの@useと@forwardを使ったサイト設計について説明します。
前提条件
- 非推奨予定の@importは使わない
- @useと@forwardを使ったDart Sassを採用
説明環境は以下
- macOS Catalina v10.15.5
- Visual Studio Code v1.57.0
Sassで@useと@forwardを使ったサイト設計
今後は@importを使ったファイルの読み込みが非推奨になるため、@useと@forwardを使ったDart Sassに切り替える必要があります。
- @importは遅くとも2021年10月1日には非推奨
- @importは遅くとも2022年10月1日にサポート終了
さっそくFLOCSSのファイル構成を使って@useと@forwardの使い方を説明していきます。FLOCSS構造やサイト設計については以下を参考にしてみてください。
ファイルとフォルダ構成について
自分なりのFLOCSSでは以下のようにファイルとフォルダを配置しています。
|_sass/
|- global
| |- setting/(変数$を管理する)
| | |- _font-family.scss
| | |- _color.scss
| | |- _index.scss
| | |- …
| |
| |- mixin/(mixinの管理)
| | |- _breakpoint.scss
| | |- _animate.scss
| | |- _index.scss
| | |- …
| |
| |- _index.scss
|
|- foundation/(基本の設定)
| |- _base.scss
| |- _ress.scss(リセットCSS)
| |- _custom-property.scss(カスタムプロパティをまとめている)
| |- _index.scss
| |- …
|
|- layout/(レイアウト部分の管理)
| |- _l-header.scss
| |- _l-main.scss
| |- _l-footer.scss
| |- _l-sidebar.scss
| |- _index.scss
| |- …
|
|- component/(最小単位のパーツ)
| |- _c-btn.scss
| |- _c-link.scss
| |- _c-flex.scss
| |- _index.scss
| |- …
|
|- javascript/(JavaScriptによって操作するもの)
| |-_js-trigger.scss
| |-_js-target.scss
| |- _index.scss
| |- …
|
|- project/(各ページのモジュール管理)
| |- _p-home-block.scss
| |- _p-main-visual.scss
| |- _index.scss
| |- …
|
|- utility/(調整用)
| |- _u-invisible-sp.scss
| |- _index.scss
| |- …
|
|- style.scss
大きなポイントとしては以下。
- それぞれのフォルダにはすべて_index.scssを配置
- style.scssでそれぞれのフォルダを一括して読み込む
- globalフォルダの中に、変数とmixin用のフォルダを配置する
それぞれのフォルダに_index.scssを配置する
_index.scssはそれぞれのフォルダの中にあるSassファイル(パーシャル)を読み込んでいます。例えばfoundationのフォルダの中には以下のSassファイルがあるとします。
- _base.scss
- _ress.scss
- _custom-property.scss
このSassファイルはfoundationの中にある_index.scssで読み込みます。foundationの中で新しくSassファイルを作成した場合は、_index.scssに追記していきます。
/*-- foundationフォルダの中の_index.scss --*/
@use "ress";
@use "custom-property";
@use "base";
//新しくパーシャルを作れば、ここに追記していく
このように_index.scssを使うことで、style.scssでそれぞれのフォルダを一括して読み込むことができます。
style.scssはフォルダごと一括して読み込む
style.scssには今後ファイルが増えても書き加える必要がないように、@useを使ってフォルダごと読み込みます。
フォルダ構成が変わったり、フォルダの数が増えない限り、変更する必要はありません。
@use "foundation";
@use "layout";
@use "component";
@use "javascript";
@use "project";
@use "utility";
globalフォルダの中だけは@forwardで読み込み
globalフォルダの中には変数を管理するsettingフォルダと、mixinを管理するmixinフォルダを配置しています。
|_sass/
|- global
| |- setting/(変数$を管理する)
| | |- _font-family.scss
| | |- _color.scss
| | |- _index.scss
| | |- …
| |
| |- mixin/(mixinの管理)
| | |- _breakpoint.scss
| | |- _animate.scss
| | |- _index.scss
| | |- …
| |
| |- _index.scss (settingとmixinフォルダを読み込む用)
|
globalの中にあるファイルは、他のファイルから参照されるため、@forwardを使って読み込む必要があります。
例えば変数をまとめているsettingフォルダについて、以下のファイルがあるとします。
- _font-family.scss
- _color.scss
settingフォルダの中にある_index.scssでは以下のように読み込みます。
/*-- settingフォルダの中の_index.scss --*/
@forward "font-family";
@forward "color";
そしてglobalフォルダの直下にある_index.scssではsettingフォルダとmixinフォルダの2つを@forwardを使って読み込みます。
/*-- globalフォルダの直下の_index.scss --*/
@forward "setting";
@forward "mixin";
このように@forwardを使うことで、他のファイルからこのglobalフォルダへアクセスできるようになります。
globalフォルダにある変数やmixinを使うには?
たとえばfoundationの中にある_base.scssで、globalフォルダにある変数やmixinを使う場合は以下のように書きます。
@use "../global" as g;
body {
@include g.font-normal; //font-normalというmixin
background-color: g.$color-base; //$color-baseという変数
}
1行目では、どのフォルダにある変数やmixinを使うのか宣言しています。そして使う場合にはgという文字を使って呼び出します。
gを使って呼び出すとは以下のg.の部分になります。
/*-- gを使って呼び出す新しい書き方 --*/
@include g.font-normal;
background-color: g.$color-base;
/*-- いままでの書き方 --*/
@include font-normal;
background-color: $color-base;
gの部分は好きな名前にすることができます。たとえばhogeという名前で呼び出したいのであれば、以下のように書くことができます。
@use "../global" as hoge;
body {
@include hoge.font-normal;
background-color: hoge.$color-base;
}
g.の部分を省略する方法もあります。
アスタリスクを使うことで、変数を呼び出すときにg.などつける必要がありません。
@use "../global" as *; //アスタリスクをつける
body {
@include font-normal; //g.がいらない
background-color: $color-base; //g.がいらない
}
mixinフォルダからsettingフォルダを参照する場合は?
globalフォルダの中に位置している、mixinフォルダからsettingフォルダを参照する場合も考えられます。
たとえばsettingフォルダにある_font-family.scssには以下が書かれているとします。
$font-family:"Noto Sans JP", "Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif;
mixinフォルダの_font.scssから、settingフォルダの_font-family.scssの変数を参照する場合は以下です。
@use "../setting" as s;
@mixin font-normal {
font-family: s.$font-family;
font-weight: 400;
}
s.の部分を省略する方法もあります。
アスタリスクを使うことで、変数を呼び出すときにs.などつける必要がありません。
@use "../setting" as *;
@mixin font-normal {
font-family: $font-family;
font-weight: 400;
}
除算処理(割り算)には / ではなくmath.divを使う
いままで/(スラッシュ)を使っていた除算処理はコンパイルするときにエラーになります。以下は例です。
.div{
width: (100% / 4); //エラーになる
}
今後は/(スラッシュ)の代わりにmath.divを使います。必ず最初に@use "sass:math";と書くことを忘れないようにしましょう。
@use "sass:math"; //math.divを使う上で必要
.div{
width: math.div(100%, 4);
}
calcを使うなら/(スラッシュ)を使ってもエラーにならないので、通常はこちらを使ったほうが楽です。
.div{
width: calc(100% / 4); //エラーにならない
}
mixinでも除算を使っている場合でも同じようにmath.divを使います。
以下のように書いているとエラーになります。
@mixin font-size($size, $base: 16) { //@includeで呼び出したときにエラーになる
font-size: ($size / $base) + rem;
}
math.divを使って以下のように書き換えることができます。
@use "sass:math"; //math.divを使う上で必要
@mixin font-size($size, $base: 16) {
font-size: math.div($size, $base) + rem;
}
おわりに
今回はSassで@useと@forwardを使ったサイト設計について説明しました。いままでgulpのglobを使ってSassファイル(パーシャル)を一括で読み込んでいた方にとっては、少々手間になった印象です。
カスタムプロパティを使うのであればsettingフォルダを使わないフォルダ構成も考えられます。@importが非推奨になる前に、Dart Sassを使ったSassの書き方に慣れておきましょう。