Autoprefixer を使って CSS Grid の IE 対応をやっていく -『CSS』

table of contents
ー

Autoprefixer 9.7.1 を使って CSS Grid の IE 対応をします。いろいろ制限や要件ことに応じて書き方や癖があるので、気になる範囲をまとめていきます。

Autoprefixer の設定

Autoprefixer の引数に grid: 'autoplace' を渡します。いくつかの例を書いておきます。

webpack

postcss.config.js


module.exports = {
  plugins: [
    require('autoprefixer')({ grid: 'autoplace' })
  ],
};

Gulp

gulpfile.js


gulp.task("default", () => {
  return gulp.src("src/style.css")
    .pipe(autoprefixer({ grid: 'autoplace' }))
    .pipe(gulp.dest("dist"));
});

nuxt

nuxt.config.js


export default {
  build: {
    postcss: {
      preset: {
        autoprefixer: {
          grid: "autoplace"
        }
      }
    }
  }
};

環境構築しない場合はオンラインツールがあります。簡単に試したり、以降のコードの変換結果を確認したい場合は利用するといいとおもいます。

ここでは変換結果はあまり解説しません。。。せっかく auto に対応していこうというモチベーションでいるのに、流石にそこまで過去の遺産を理解して … というようなことは省いていきたいという、おきもちですね。

grid-template

grid-template はグリッドのエリア名、列と行の幅をまとめて指定できる便利なプロパティです。

html


<div class="area">
  <div class="area__item area__item--head">...</div>
  <div class="area__item area__item--side">...</div>
  <div class="area__item area__item--main">...</div>
  <div class="area__item area__item--foot">...</div>
</div>

scss


.area {
  display: grid;
  gap: 10px 0;
  grid-template:
    "head head" 1fr
    "side main" minmax(100px, 2fr)
    "foot foot" 1fr /
    1fr 250px;
}

.area__item {
  //
  &--head {
    grid-area: head;
    background-color: salmon;
  }
  //
  &--side {
    grid-area: side;
    background-color: darkorange;
  }
  //
  &--main {
    grid-area: main;
    background-color: orangered;
  }
  //
  &--foot {
    grid-area: foot;
    background-color: indianred;
  }
}

gap のメディアクエリ

gap は grid-template-columns や grid-template-rows を併記しないとポリフィルが出力されません。これは sass の入れ子記法でメディアクエリを記述する場合でも、重複してしまいますが再度書く必要があります。

grid-template-areas を指定しないパターンだと、次のように書くとよいです。

html


<div class="area">
  <div class="area__item">...</div>
  <div class="area__item">...</div>
</div>

scss


.area {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: auto;
  gap: 20px;
  //
  @media (min-width: 768px) {
    grid-template-columns: 1fr 1fr;
    grid-template-rows: auto;
    gap: 10px;
  }
}

自動配置

行と列が固定値になりますが repeat() 関数で折り返しのある自動配置を実現できます。また他の条件として、repeat() の auto-fit と auto-fill は使えません。

これはカードやカレンダー型の UI を作るときによく出てくるレイアウトに使えるパターンですね。

html


<ul class="list">
  <li class="list__item"> ... </li>
  ... items ...
</ul>

scss


.list {
  display: grid;
  gap: 2px;
  grid-template-columns: repeat(7, 1fr);
  grid-template-rows: repeat(5, 1fr);
}

すると .list に指定した columns x rows の数だけ次のような css を出力します。

css


.list > *:nth-child(1) {
  -ms-grid-row: 1;
  -ms-grid-column: 1;
}

アイテム数が多い場合はここが大量のポリフィルコードになってしまうので、注意しておくポイントかもしれません。

Autoprefixer の優秀さ

もとい Autoprefixer はベンダープリフィクスを付与するためのツールでした。それが grid の機能を IE のために擬似的に出力してくれるわけなので、その恩恵に預からないわけにはいかないなあとおもいます。

ただ、それでも実現できない機能もあるので、プログレッシブエンハンスメント的な対応だったり flex に寄せるなど、柔軟に解決していきたいとおもいます。悲しいことに IE のない世界はまだ遠い環境の方もおおいと聞きますが、積極的な grid の採用を Autoprefixer に甘えてよい DX で導入していきたいです。

おわります。

share
ー

related
ー