LoginSignup
35
22

More than 5 years have passed since last update.

SassのExtendはなぜオススメされないのか

Last updated at Posted at 2017-04-22

今回はSassの書き方の一つであるExtendについて、使いどころを調べてみたので紹介します。

scssのコンパイルはVisual Studioの拡張機能であるWebCompiler 1.11.326を使用しています。

Extendとは

定義済みのスタイルを継承して新しいスタイルを作れる書き方です。
当然ですがこの書き方はコンパイルするとcssに出力されます。

コンパイル前

.input-row {
    display: flex;

    span {
        width: 100px;
    }
}


.sample1 {
    @extend .input-row;
}

コンパイル後

.input-row, .sample1 {
    display: flex;
}

    .input-row span, .sample1 span {
        width: 100px;
    }

プレースホルダセレクタ

extendしたいスタイルの先頭に%を付与します。
この書き方をするとextendする元の定義はcssへは出力されません。
extendのためだけに宣言する場合などは便利ですね。

コンパイル前

%input-row {
    display: flex;

    span {
        width: 100px;
    }
}


.sample1 {
    @extend %input-row;
}

コンパイル後

.sample1 {
    display: flex;
}

    .sample1 span {
        width: 100px;
    }

なぜオススメされないのか

これだけを見ると非常に便利に見えるextendですが、いろいろなサイトではMixInとの使い分けで、Extendはあまり推奨されない記載を拝見します。

それはなぜか。
以下の%input-rowを10回Extendした場合

%input-row {
    display: flex;

    span {
        width: 100px;
    }
}

.sample1 {
    @extend %input-row;
}

.sample2 {
    @extend %input-row;
}

// sample10まで続く

出力されるcssは以下のようになります。

.sample1, .sample2, .sample3, .sample4, .sample5, .sample6, .sample7, .sample8 {
    display: flex;
}

    .sample1 span, .sample2 span, .sample3 span, .sample4 span, .sample5 span, .sample6 span, .sample7 span, .sample8 span {
        width: 100px;
    }

上記の通り、大量のセレクタがグルーピングされます。
今回の例はExtend元が2段階のネストですが、ネストが深くなると何倍ものセレクタが生成されることになります。

これではとてもデバッグできませんし、出力されたcssの解析など不可能です。
これが一番の要因かなと思います。

Extendの使いどころ

それではExtendは使いどころがないのか?
個人的には安全で、より多機能なMixInを使いますがあえて使うなら
同一コンポーネント内など限られたスコープで使用するのが良いのでしょう。
以下はコンポーネントに絞って使用した例で、良い例と言えます。

.button,
%button {
    display: inline-block;
    padding: 1em;
}

.button-warning {
    @extend %button;
    background-color: yellow;
    color: black;
}

.button-error {
    @extend %button;
    background-color: red;
    color: white;
}

.button-gray {
    @extend %button;
    background-color: lightgray;
    color: black;
}

コンパイル後

.button,
.button-warning,
.button-error,
.button-gray {
    display: inline-block;
    padding: 1em;
}

.button-warning {
    background-color: yellow;
    color: black;
}

.button-error {
    background-color: red;
    color: white;
}

.button-gray {
    background-color: lightgray;
    color: black;
}
35
22
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
22