Rails
Autoprefixer
autoprefixer-rails

Autoprefixer RailsでCSSのベンダープレフィックスをsprocketsに任せよう

More than 1 year has passed since last update.

はじめに

CSS3のアニメーションなど新し目のものを使おうとするとベンダープレフィックス(-webkit-hogehoge)みたいなのをつけないといけない時があるよね?

ベンダープレフィックスをつけるとこんな感じで同じようなことを各ブラウザ向けに何度も書かなければならなくなってしまう。

  animation: spin 1s infinite linear;
  -webkit-animation: spin 1s infinite linear;

このベンダープレフィックスを意識していちいちこのプロジェクトで対応するブラウザにはこのCSSにはこのプレフィックスが必要なんて考えたりするのって生産性が悪いよね?

それにシンプルなコードにならない。

そこでベンダープレフィックスを自動でつけてくれるAutoprefixerなんだけど、基本的にGulpやWebpackなどフロントエンドのツールに組み込んで使うんだ。

そこで僕らのRailsでcssをminifyしてくれたりメッセージダイジェストをつけたりしてくれるSprocketsにAutoprefixerの機能をつけてくれたのがAutoprefixer Rails

検証環境

  • Rails: ver4.3.1
  • scssファイルをSprocketsでコンパイルしてcssへ変換

RailsにAutoprefixer Railsを組み込む方法

Gemfileに追記

Gemfileに下記を追記

gem 'autoprefixer-rails'

設定ファイルを追加

config/autoprefixer.yml

browsers:
  - "> 5%" #上位1%のブラウザを対象にする 
  - "last 2 versions" #下記以外は最新のメジャーブラウザ2バージョンのみサポート
  - "IE >= 11" # IEは11以上
  - "Android >= 4" # Androidは4系をサポート

上記の設定だと、上位5%以上のシェアのブラウザに対して、そのブラウザの過去2のバージョンをサポートするが、IEは11以上、Androidは4以上をサポートするということになる。
ここでIE >= 8と書くとIE8以上を対象にしてくれるというわけだ。(対象にしたくないけど)

パーセンテージ指定ところはどのブラウザ名なのか、各バージョンで見てるのか正直良くわからなかった
詳細は https://github.com/ai/browserslist を参考にしてもらいたい。

キャッシュの削除

キャッシュの削除が推奨されているので素直にクリアしといたほうが良さそう。
あまりトリッキーなことをしないでいるdevelopment環境のならたぶんやらなくても良さそう

bin/rake tmp:clear

コンパイル結果

asset:precimpile したり、development環境で逐次コンパイルした結果以下のようになる。

コンパイル前のSCSS

.sample {
  animation: spin 1s infinite linear;

  @keyframes spin {
    from { transform: rotate(0deg); }
    to { transform: rotate(360deg); }
  }
}

コンパイル後のCSS

-webkitのベンダープレフィックスがついているものが追加されているのがわかる

.sample {
  -webkit-animation: spin 1s infinite linear;
          animation: spin 1s infinite linear;
}
@-webkit-keyframes spin {
  from {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
  }
  to {
    -webkit-transform: rotate(360deg);
            transform: rotate(360deg);
  }
}
@keyframes spin {
  from {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
  }
  to {
    -webkit-transform: rotate(360deg);
            transform: rotate(360deg);
  }
}