かすみん日記

暇なときに何か喋ります

【まとめ】ブラウザごとに適用するCSSを切り替える方法【CSSハック】

各ブラウザのみで有効なCSSと記述するためのCSSハック方法のまとめ。

OS別の対応にはJavaScriptライブラリ使えばよさげ。

はじめに

以下のサイトで赤く表示されている方法が、現在開いているブラウザで有効な方法らしい:

browserstrangeness.github.io

以下に、ググって出てきた記事を20件ぐらいブラウズして方法をまとめたが、実際に効くのかはテストしていない。

いろいろな方法が出てくるし、情報が古かったりいろいろあるので、用いる際は各自テストしてほしい。

それで効かない方法があったらコメントで知らせてくれると、後で読む人が救われるかも知れない。

私の環境

テストしてないと言ったが、MacOSにおいてSafariGoogle ChromeFirefoxの対応方法が実際に機能するかは確認した。

Win機は持っていないのでIEやEdgeに関しては不明。

また、テストした際のバージョンは以下の通り:

あとmacのSimulatorアプリで、iPhone 13(iOS 15.0)のSafariでの表示も一応確認した。

特に断りがなければSafari対応というのはiOSSafariも含まれていると思って良い。

各ブラウザで有効な方法

無効らしい方法も一応記載した。ググって右往左往している人がいるかも知れないので、はっきり否定するため。

最初でも述べたがWindowsの環境では効くか確認していない。

IEやEgdeの情報は特に注意。

IE

IE10とIE11の両方で効く:

_:-ms-input-placeholder, :root .css-hack {
  color: gray;
}

以下のものは、WindowsでハイコントラストモードがnoneのときにはIE10で効くが、active, white-on-black, black-on-whiteのいずれかの場合には効かないので非推奨:

/* IE10でのみ効く場合もあるが、非推奨 */
@media all and (-ms-high-contrast: none) {
  body {
    background-color: gray;
  }
}

以下はIE11でのみ有効:

_:-ms-lang(x)::-ms-backdrop, body {
  background-color: gray;
}

その他バージョンのIEについては下記記事を参照:

spyweb.media

Edge

まず用語解説。

EdgeHTMLというのは旧バージョンのEdge(v12-18)のことで、現在ではChromiumベースのEdgeが新しいバージョンとなっている。

koneta.nifty.com

forest.watch.impress.co.jp

EdgeHTMLでのみ有効:

@supports (-ms-ime-align: auto) {
  body {
    background-color: pink;
  }
}

/* OR */

/* 多分? */
_:-ms-lang(x)::backdrop, body {
  background-color: pink;
}

Chromiumでのみ有効:

_:lang(x)::-ms-, body {
  background-color: pink;
}

全てのバージョンのEdgeで有効:

@supports (not (-webkit-hyphens: none)) and (not (-moz-appearance: none)) {
  body {
    background-color: pink;
  } 
}

以下の記事によると2021年6月時点では全てのEdgeに有効な方法はないと言及しているが...

netamame.com

Google Chrome

Google Chromeでのみ有効:

_:lang(x)::-internal-media-controls-overlay-cast-button, body {
  background-color: green;
}

Firefox

Firefoxでのみ有効:

_:lang(x)::-moz-placeholder, body {
  background-color: red;
}

/* OR */

@-moz-document url-prefix() {
  body {
    background-color: red;
  }
}

Safari

Safariでのみ有効。iOSSafariにも効く。

_:lang(x)+_:-webkit-full-screen-document, body {
  background-color: blue;
}

/* OR */

@media screen and (-webkit-min-device-pixel-ratio: 0) {
  _::-webkit-full-page-media, _:future, body {
    background-color: blue;
  }
}

以下の方法もSafariのみで有効だが、iOSChromeでも有効になるらしい:

/* Safari or iOS Chrome */
_::-webkit-full-page-media, _:future, :root body {
  background-color: blue;
}

以下の方法はSafariのバージョンが11以上(現在はv14が最新)では効かないので非推奨:

/* 非推奨 */
@media screen and (-webkit-min-device-pixel-ratio: 0) {
  ::i-block-chrome, body {
    background-color: blue;
  }
}

Google ChromeSafariOpera

これらのブラウザはwebkitを利用しているので、以下のような共通の指定方法がある。

@media screen and (-webkit-min-device-pixel-ratio: 0) {
  body {
    background-color: purple;
  }
}

以下の方法は効かないので注意:

/* 無効 */
_::content, _:future, body:not(*:root) {
  background-color: purple;
}

Google ChromeOperaFirefox

Google ChromeOperaFirefoxで有効。

Safari以外のwebkit系ブラウザでのみ有効と書いてあったが、実際確認してみるとForefoxでも有効であったので注意。

@media screen and (-webkit-min-device-pixel-ratio: 0) and (min-resolution: .001dpcm) {
  body {
    background-color: gold;
  }
}

OSごと

css_browser_selector.jsを使えば良いらしい。 以下のサイトのDOWNLOADというセクションからDLできる:

DLしたらhtmlファイルのheadタグ内とかで以下のように記述する:

<script src="css_browser_selector.js" type="text/javascript"></script>

すると、OSやデバイス判定ができる以下のようなCSSセレクタが使えるようになる:

.win {
  /* Windows(全バージョン) */
}

.mac {
  /* Mac OS */
}

.linux {
  /* Linux(x11とlinux)*/
}

.iphone {
  /* iPhone */
}

.ipad {
  /* iPad */
}

.android {
  /* Android */
}

.mobile {
  /* 全てのモバイルデバイス */
}

他にもいろいろ用意されている。

注意

上で書いたブラウザごとのCSS適用の方法をテストするには、実際のブラウザで試してみないと効くかわからない。

すなわち、Safariの開発タブのユーザエージェントを切り替えても本来あるべき動作にはならない。

Edgeの開発ツールでも同様のことができるらしいが、こちらでユーザエージェントを切り替えてもEdgeに有効なものしか適用されないとのこと。

でもIEの開発者ツールでIEのバージョン切り替えでは、IE10以前のブラウザ表示確認は有効らしい。

終わりに

最近のネットを最もよく象徴している『ググってもカス』という言葉があるが、やはり実際そうだと思う。

CMSで簡単にブログが書けて、自分専用のメモ代わりにしている人も多いが(私のことだが)、ググってヒットした人からすれば雑な記事は迷惑でしかないので、公開するならソースを明記したり、テストした環境の詳細(バージョン)とか日付とかはっきり明記してほしいものだ(どの口が言っている)。

あとクソブログに限ってコメント機能がないという世紀末。デマを一方的に垂れ流すのは最近流行りのSNS誹謗中傷より酷い。

蛇足のお気持ち表明もしたのでこれで終わります。

この記事の内容も全部引用(転載)ではあるが、一応テストしたということによる少しの信憑性の増加が付加価値ということにしておこう。

まああとは最初にも書いた通り、効かなかったり挙動がおかしい不明瞭な場合はコメントで議論してくれれば(他力本願)幸いです。

参考

現在開いているブラウザで有効か確認できる:

browserstrangeness.github.io

ググって出てきた日本語のまとめ記事。古いものが多い。

blanche-toile.com

dot-blog.jp

techmemo.biz

gray-code.com

下記記事は2021年更新なので新しい。

netamame.com

IECSSハックについて:

jeffreyfrancesco.org

Edgeのバージョンについて:

koneta.nifty.com

forest.watch.impress.co.jp