
PostCSSのネスト(入れ子)プラグインいろいろ
PostCSSにはネストが使えるようになるプラグインがいくつかあるので比較してみました。
PostCSSの導入記事はこちら
gulpでPostCSSまでインストールしたらgulpfile.jsに以下のコードを書いておきます。
var gulp = require('gulp'); var postcss = require('gulp-postcss'); gulp.task("css", function() { return gulp.src('./src/css/*.css') .pipe(postcss([])) .pipe(gulp.dest('./src/')) });
postcss-nested
Sassのような入れ子構造が使えるようになるプラグイン。
インストール
npm i postcss-nested -D
これが
.phone { &_title { width: 500px; @media (max-width: 500px) { width: auto; } body.is_dark & { color: white; } } img { display: block; } }
こう
.phone_title { width: 500px; } @media (max-width: 500px) { .phone_title { width: auto; } } body.is_dark .phone_title { color: white; } .phone img { display: block; }
postcss-nesting
こちらはW3Cの仕様に近い形でネストを使うことができます。
CSS Nesting Module Level 3
インストール
npm i postcss-nested -D
これが
.list { width: 100%; &__item { color: red; font-size: 24px; } & a { color: #333; &:hover { color: blue; } } }
こう
.list { width: 100% } .list__item { color: red; font-size: 24px } .list a { color: #333 } .list a:hover { color: blue }
セレクタの最後はセミコロンが省かれるようになっています。最後には必ずしも必要というわけではないんですね。知らなかった。
とはいえこのプラグインで省くのまで必要なのかGitHubでissueが立てられてました。
nested rules miss final semicolon
また、入れ子でプロパティの指定がない場合は、空ができちゃうんですよね。これもissueありました。
An empty rule is created if If there’s no property before a nested rule
@nestを使うルールでもいけます。
.list { width: 100%; &__item { color: red; font-size: 24px; } @nest & a { color: #333; &:hover { color: blue; } } }
結果は先ほどと同じです。
さいごに
Sassを使っていた場合はPostCSS Nestedの方が移行は楽そうです。ただ、どうせならCSSの仕様に添いたいという場合はCSS Nestingがいいかと思います。セミコロンも最後がなくても大丈夫ですし、空指定は圧縮時に消すこともできます。
どちらを使うかはお好みで!