ネットソリューション

【Sass(SCSS)】PC版とSP版のCSSファイルを分ける方法

今ではレスポンシブが当たり前でPC版とSP版(スマホ)のデザインはメディアクエリで切り替えるのが主体ですが、場合によってはPC版とSP版のCSSファイルを全く別にしたいという要望があるかもしれません。
style_pc.cssstyle_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.scssstyle_sp.scssに分けます。
style.scssをコピーしてリネームします。

style_pc.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というファイルを追加してみましょう。

_device.scss
$pc: true !default;

入れる内容はこれだけです。
何に使うのかというと、これが デバイス判定用の変数 の定義となります。
やりたいことは、この変数$pcをPC版とSP版で値を変えて、各パーシャルファイル内でSassの@ifを使い、スタイルを分岐させたいのです。

ただ、これだけ定義しただけでは、仮に各パーシャルファイルから読み込んだとしても分岐には使えません。
PC版のときは$pc: trueとしたいし、SP版のときは$pc: falseとしたいわけです。
そこで使用するのが@forwordです。

変数の上書き

styles/settingsにもう一つ、_index.scssというファイルを追加してみましょう。

_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する必要があります。

_button.scss
@use '../settings/index' as *;

スタイルを見ていきます。

_button.scss
.btn {
    background-color: blue;
    color: white;
    font-size: 2.0rem;
    padding: 2px 10px;
}

というようなスタイルがあったとします。
このうち、font-sizepaddingをPC版とSP版で分岐させたいので、Sassの@ifを使用します。

_button.scss
.btn {
    background-color: blue;
    color: white;
    @if $pc {
        font-size: 2.0rem;
        padding: 6px 10px;
    }
    @else {
        font-size: 1.6rem;
        padding: 2px 5px;
    }
}

これをコンパイルすると、、

style_pc.css
.btn {
    background-color: blue;
    color: white;
    font-size: 2.0rem;
    padding: 2px 10px;
}
style_sp.css
.btn {
    background-color: blue;
    color: white;
    font-size: 1.6rem;
    padding: 2px 5px;
}

共通部分はそのままに、変えたい部分だけを出力させることができるようになります!
やったね!!!!


……正直あまり使いどころはないかもしれませんが、
使用用途はデバイス判定以外にもあるかと思いますので、
似たようなことをやりたいときに頭の片隅にでも置いておいていただけますと幸いです。

Youtubeのオススメがいつの間にかうどん/そばの仕込み動画で埋め尽くされている

粕谷 X@Frencel_ns

リーダー/Webエンジニア

好きな麺類

ラーメン

mail お問い合わせ

ご覧いただきありがとうございます。
当メディアへのご質問や各事業部へのお仕事のご相談がありましたら、お気軽にお問い合わせください。

article 過去記事