だれかのなにかに役立てるウェブ制作者YoTaの趣味ブログ

SASS(SCSS)の@extendは@mediaの中では入れ子に使えない!

SASS(SCSS)の@extendは定義済スタイルを継承しますが、@mediaの中では継承ができません。「You may only @extend selectors within the same directive.」というエラーが出ます。以下、詳しく紹介します。

エラーについて

SASS(SCSS)の@extendは定義済スタイルを継承しますが、@mediaの中では継承ができません。そのため、@mediaを用いた、cssファイル一枚レスポンシブ構築をする際、@extendはけっこう使いにくい記述となります。

※出力されるエラー文

You may only @extend selectors within the same directive.

ソースで言うと、下記のような記述をするとエラーが出力されます。(@include mq()は@mediaのミックスイン記述です。)

@include mq(tablet) {
  display: block;
  @extend %test_code;
}

@mediaの中に、ミックスインだと、問題なく使えます。

@include mq(tablet) {
  display: block;
  @include test_code(test_num);
}

自分の感覚として、extendはスタイルをごそっと引用したい時には確かに使える印象ですが、しかし、継承したセレクタ名がグループ化されて冗長になる点で、イマイチです。一応、「%」のプレイスホルダーセレクタを使えば、グループ化は回避できますが、いちいち面倒です。それに、@mediaの中で使えないとなると、@mediaを使ったcssでは、もはや論外となります。

なので、個人的にはmixinで良いじゃんと感じます。最初の設計の段階で、mixinを準備してきちんと使った方が、最終的にソースが綺麗に仕上がる気がしますので。(一つに統一しておいたほうが、後から読み返しやすいですし。)

まあ、どっちも個人の好き好きになるかと思いますが、両方をごっちゃごちゃに使うと、後から改修する必要が出た時、しっちゃかめっちゃかになりそうなので、あんまりオススメしないです。

参考リンク

・Sass(SCSS)のmixin, extendなどまとめ
https://qiita.com/one-a/items/2758511326c09200fded

・Sassのextendが効かない?
http://webdesign-dackel.com/2014/09/30/sass-extend-notworks/

ページ上部に戻る