16
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ブラウザが CSS トランジションに対応しているかどうか判定する方法

Posted at

シンプルな解決策

Modernizr http://modernizr.com 使え。

JS ファイル増やさず自力で何とかしたい

Modernizr のソース読めばわかるんですが、適当な HTML 要素にトランジション系の CSS プロパティをセットしておいて、そのプロパティを JavaScript から参照し undefined でなければ対応しています、的なやり方で判定できます。

JavaScript をごりごり書くのもできますけど、こういうケースではだいたい jQuery が使われているはずですので jQuery で書きます。そのほうが楽だし。

たぶんこんな感じ。

style.css
.test-transition {
  -webkit-transition: none 0;
  -moz-transition: none 0;
  -o-transition: none 0;
  transition: none 0;
}
test.html
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>トランジションに対応してるかな?</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="test-transition"></div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="./test.js"></script>
</body>
test.js
!function(w,d) {
  w.jQuery(d).ready(function($) {
    // チェックする CSS プロパティ名の配列
    // このうちひとつでも取得できれば対応とする
    var transition_props = [
        'transition',
        '-webkit-transition',
        '-moz-transition',
        '-o-transition'
    ];

    // テスト用の要素
    var $target = $('.test-transition');

    // トランジション対応の可否フラグ
    var transision_enabled = false;

    // ループ用
    var i, len;
    for (i = 0, len = transition_props.length; i < len; ++i) {
      if ($target.css(transition_props[i])) {
        // ここで指定の CSS プロパティ値が有効なら
        // CSS 3 トランジション対応ブラウザ
        transision_enabled = true;
        break;
      }
    }

    // jQuery 1.9 以降ならこうも書ける
    var values = $target.css(transition_props);
    for (i = 0, len = values.length; i < len; ++i) {
      if (values[i]) {
        transision_enabled = true;
        break;
      }
    }

    $target.text(transision_enabled ? 'トランジション対応してる!' : '対応してないし…。')
  });
}(window,document);

ここでは CSS トランジション対応の判定だけしていますが、 box-sizingopacity とかの CSS プロパティでも同じやり方でできるっぽいです。

HTML 要素は JavaScriptから動的に追加してもいいんですが、HTML ソースまで手を入れられるなら最初から HTML ソースに DIV タグとか置いといたほうが早いです。
汎用ライブラリ的なものを書く場合なら動的生成するしかないですが、JavaScript 中に HTML ソースが紛れてしまうのがネック。

JavaScript と CSS の両方がなんとかできるなら、

style.css
body {
  -webkit-transition: none 0;
  -moz-transition: none 0;
  -o-transition: none 0;
  transition: none 0;
}

としてしまって BODY 要素から調べるのもいいかもしれません。
もちろんこうすると BODY タグにトランジションを設定したい場合に困った事態になるおそれもあるので CSS の読み込み順に要注意といったところ。

調べたい内容が 1 - 2 件程度でその用途もしょぼい、というケースなら自力でやってしまうのもアリだと思いますが、おおむね Modernizr 使ったほうが手間かからずに JavaScript からも CSS からも判定できるし便利ですね。

16
16
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
16
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?