【Sass(SCSS)】PC版とSP版のCSSファイルを分ける方法
今ではレスポンシブが当たり前でPC版とSP版(スマホ)のデザインはメディアクエリで切り替えるのが主体ですが、場合によってはPC版とSP版のCSSファイルを全く別にしたいという要望があるかもしれません。
style_pc.css
、style_sp.css
というように。
Dart-sass環境のSass(SCSS)でこれをやるとなると意外と面倒です。
@import
が廃止されているので、グローバル変数が簡単に使用できないためです。
もとからパーシャルファイルもPC用とSP用で分けてしまえば問題ないですが、それだとSassの意味がない。。
ということで、パーシャルファイルは共通のものを使用しつつ、PC版とSP版でスタイルを分ける方法をご紹介します。
ニッチすぎるかもしれないので半分備忘録的なものです。
下準備
たとえば以下のような構造のSassがあるとします。
※必要なものだけ抜き出しています
styles
├── components
│ ├── _box.scss
│ └── _button.scss
├── layouts
│ ├── _header.scss
│ └── _footer.scss
├── settings
│ ├── _variables.scss
│ ├── _base.scss
│ └── _mixins.scss
└── style.scss
今はstyle.scssしかないので、コンパイル後のファイルはPC、SP共通のCSSです。
これをstyle_pc.scss
、style_sp.scss
に分けます。
style.scss
をコピーしてリネームします。
@use "./settings/base";
(省略)
/* layouts */
@use "./layouts/header";
@use "./layouts/footer";
(省略)
/* components */
@use "./components/box";
@use "./components/button";
(省略)
現状はこんな感じで、各ディレクトリから他のSCSSファイルを@use
で読み込んでいます。
今はstyle_sp.scss
も全く同じファイルなので差異はありませんが、ここに 分岐を追加 して、このSCSSファイルがPC専用であることを示してあげる必要があります。
デバイス判定用の変数を用意する
styles/settings
に_device.scss
というファイルを追加してみましょう。
$pc: true !default;
入れる内容はこれだけです。
何に使うのかというと、これが デバイス判定用の変数 の定義となります。
やりたいことは、この変数$pc
をPC版とSP版で値を変えて、各パーシャルファイル内でSassの@if
を使い、スタイルを分岐させたいのです。
ただ、これだけ定義しただけでは、仮に各パーシャルファイルから読み込んだとしても分岐には使えません。
PC版のときは$pc: true
としたいし、SP版のときは$pc: false
としたいわけです。
そこで使用するのが@forword
です。
変数の上書き
styles/settings
にもう一つ、_index.scss
というファイルを追加してみましょう。
@forward 'device';
入れる内容はこれだけです。
前項で作成した_device.scss
を@forword
で読み込んでいます。
ここで@use
としない理由は、この_device.scss
で定義した変数$pc
を他のパーシャルファイルでも参照したいためです。
(@use
はメンバーのカプセルの都合上、多段構造的に変数を呼び出すことができません)
style_pc.scss
に戻りましょう。
冒頭に下記の記述を追加します。
@use "./settings/index" with (
$pc: true
);
※厳密には、PC版にはこの記述は必要ないのですが、一応わかりやすくするためにあえて入れています。
これは何をやっているのかというと、@use
で_index.scss
を参照する際に、withで$pc: true !default;
の値を上書きしています。
こうすることによって、このstyle_pc.scss
から@use
で読み込まれている各パーシャルファイルからも、 上書きされた値 で参照することができるようになります。
style_sp.scss
のほうは$pc: false
としたいので、冒頭に以下の記述を追加します。
@use "./settings/index" with (
$pc: false
);
各パーシャルファイルでのスタイルの分岐
では、さっそく_button.scss
でスタイルの分岐を行ってみましょう。
まずは冒頭で_index.scss
を@use
する必要があります。
@use '../settings/index' as *;
スタイルを見ていきます。
.btn {
background-color: blue;
color: white;
font-size: 2.0rem;
padding: 2px 10px;
}
というようなスタイルがあったとします。
このうち、font-size
とpadding
をPC版とSP版で分岐させたいので、Sassの@if
を使用します。
.btn {
background-color: blue;
color: white;
@if $pc {
font-size: 2.0rem;
padding: 6px 10px;
}
@else {
font-size: 1.6rem;
padding: 2px 5px;
}
}
これをコンパイルすると、、
.btn {
background-color: blue;
color: white;
font-size: 2.0rem;
padding: 2px 10px;
}
.btn {
background-color: blue;
color: white;
font-size: 1.6rem;
padding: 2px 5px;
}
共通部分はそのままに、変えたい部分だけを出力させることができるようになります!
やったね!!!!
……正直あまり使いどころはないかもしれませんが、
使用用途はデバイス判定以外にもあるかと思いますので、
似たようなことをやりたいときに頭の片隅にでも置いておいていただけますと幸いです。
お問い合わせ
ご覧いただきありがとうございます。
当メディアへのご質問や各事業部へのお仕事のご相談がありましたら、お気軽にお問い合わせください。
Youtubeのオススメがいつの間にかうどん/そばの仕込み動画で埋め尽くされている