LoginSignup
4
4

More than 5 years have passed since last update.

RailsでIE9以下のCSSセレクタの上限値4096対策

Last updated at Posted at 2015-06-22

IE9以下にはCSSファイルのセレクタ数に制限があって、制限値を超えた時にレイアウトが崩れてしまう。

セレクタ数のチェック

以下のスクリプトでセレクタ数をチェックできるが、厳密に4096を越えてなくても崩れるときがあった。

function countCSSRules() {
  var total_count = 0;
  var results = '', log = '';
  if (!document.styleSheets) {
    return;
  }
  for (var i = 0; i < document.styleSheets.length; i++) {
    countSheet(document.styleSheets[i]);
  }
  function countSheet(sheet) {
    var count = 0;
    if (sheet && sheet.cssRules) {
      for (var j = 0, l = sheet.cssRules.length; j < l; j++) {
        if( !sheet.cssRules[j].selectorText ) {
          continue;
        }
        count += sheet.cssRules[j].selectorText.split(',').length;
      }

      log += '\nFile: ' + (sheet.href ? sheet.href : 'inline <style> tag');
      log += '\nRules: ' + sheet.cssRules.length;
      log += '\nSelectors: ' + count;
      log += '\n--------------------------';
      total_count += count;
      if (count >= 4096) {
        results += '\n********************************\nWARNING:\n There are ' + count + ' CSS rules in the stylesheet ' + sheet.href + ' - IE will ignore the last ' + (count - 4096) + ' rules!\n';
      }
    }
  }
  console.log(log);
  console.log(results);
  console.log('CSS Selectors: ' + total_count);
}

Railsの場合gemで分割する

私の場合は、以下のようにしたら上手くいった。@import記法だと分割したファイルが空で作成されて上手くいかない。

/*
 *= require 'application'
 */

テストでチェックしたらCSSの肥大化防止を意識できる。けれど超えちゃう前提なら不要。

しかし不明なエラーがあります

場合によっては、以下の様なエラーがでるかもしれません。

Sass::SyntaxError: @charset may only be used at the root of a document.

このissueに書いてますが、
以下の条件でエラーが出るようです。

  • コメントにマルチバイト文字
  • CSSファイル内にコンパイル対象がある場合

これでCSSセレクタの数を気にせずに開発ができるようになりました。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4