cssnext という新しい CSS の構文を、古い構文に変化してくれるトランスパイラがあったので試してみます。 JavaScript でいうところの Babel ですね。

インストール

npm でインストールできます。

$ npm install -g cssnext

変数

複数の場所で同じ値を使う場合変数を使うことができます。

/* a.css */

:root {
    --width: 200px;
}

body {
    width: var(--width);
    margin: auto;
}

--width が変数です。 :root で変数を定義すると var(...) で値を取り出せます。

これを b.css に変換するには $ cssnext a.css b.css とします。変換結果は以下のようになります。

/* b.css */

body {
    width: 200px;
    margin: auto;
}

var(--width)200px に展開されました。 calc(...) と組み合わせることもできます。

body > section {
    width: calc(var(--width) * 0.9);
    margin: auto;
}

これは以下のようになります。

body > section {
    width: 180px;
    margin: auto;
}

計算が展開されました。 calc(var(--width) + 1em) のように事前に計算出来ない場合、 calc(200px + 1em) のように calc が残ります。

カスタムセレクタ

同じセレクタを複数使う場合に自分でセレクタを定義できます。

@custom-selector :--button button, .btn;

:--button {
    margin: 1px;
}

:--button::after {
    content: "!";
}

:--button が自分で定義したセレクタでこの場合 button, .btn です。これは以下の用になります。

button,
.btn {
    margin: 1px;
}

button:after,
.btn:after {
    content: "!";
}

:--button::after はちゃんと button:after, .btn:after にしてくれるみたいです。

色の指定の仕方が増えます。

p {
    color: #FFCC8844;
    background-color: color(blue alpha(-10%) blackness(10%));
}

これは以下のようになります。

p {
    color: #FFCC88;
    color: rgba(255, 204, 136, 0.26667);
    background-color: #0000E6;
    background-color: rgba(0, 0, 230, 0.9);
}

#FFCC8844 は alpha も一緒に指定します。これまでは rgba(...) を使わないとできなかったので #FFF のような指定と見た目の一貫性がなくなってしまっていました。

color(...) は色を変化させる関数で、ここでは alpha(-10%) を指定して10%透明に blackness(10%) を指定して10%暗くしています。

#FFCC88#0000E6rgba(...) に対応しない古いブラウザのための指定だと思われます。

まとめ

変数や色指定は、これまで Less や Sass なんかが使われることが多かったと思います。

cssnext は未来の CSS をそのまま書けるので、将来そのまま動くかもしれないのが利点でしょうか。機能は Less や Sass のほうが強力ですが、複雑なことができない分メンテナンスが楽になるかもしれません。