古いブラウザでもCSS3セレクタを使ってWebページをデザインできるようにしてみた(2日目)
若干修正しました。
コンディショナルセレクタ搭載してみました。
function autoexec() { var node = _query.tag("html")[0], cn = [node.className, "js"]; _ie && cn.push("ie ie" + _uaver); _mm.opera && cn.push("opera opera" + _uaver); _mm.gecko && cn.push("gecko"); _mm.firefox && cn.push("fx fx" + _uaver); _mm.webkit && cn.push("webkit"); _mm.safari && cn.push("safari safari" + _uaver); _mm.chrome && cn.push("chrome chrome" + _uaver); _mm.iphone && cn.push("iphone"); _mm.slver && cn.push("sl sl" + _mm.slver); _mm.flashver&& cn.push("flash flash" + _mm.flashver); node.className += cn.join(" ").replace(TRIM, "").replace(/\./g, ""); }
コンディショナルセレクタは、document.body.className に【どんなブラウザか】【jsが使えるか】【Silverlightが使えるか】【Flashが使えるか】といった情報を設定します。
これで何がうれしいかというと、
<style> html div { color: green } html.ie6 div { color: red } </style>
としておくと、IE6 なら赤くなり、それ以外の環境では緑になります。
html は省略可能なので、以下のようにしても同じ結果になります。
<style> div { color: green } .ie6 div { color: red } </style>
識別子の一覧
利用可能な識別子の一覧です。
class | 条件 |
ie | IE なら |
ie6 | IE6 なら |
ie7 | IE7 なら |
ie8 | IE8 なら |
chrome | Google Chrome なら |
chrome1 | Google Chrome1 なら |
chrome2 | Google Chrome2 なら |
chrome3 | Google Chrome3 なら |
gecko | Gecko 搭載ブラウザなら |
fx | Firefox なら |
fx2 | Firefox2.0 なら |
fx3 | Firefox3.0 なら |
fx35 | Firefox3.5 なら |
webkit | WebKit 搭載ブラウザなら(Safari, iPhone, iPod, Google Chrome等を含む) |
safari | Safari 系ブラウザなら(Google Chromeは含まない) |
safari3 | Safari3 なら |
safari32 | Safari3.2 なら |
safari4 | Safari4 なら |
opera | Opera なら |
opera92 | Opera9.20〜9.29 なら |
opera95 | Opera9.50〜9.59 なら |
opera96 | Opera9.60〜9.69 なら |
opera10 | Opera10.00〜10.09 なら |
iphone | iPhone または iPod なら |
js | JavaScript が利用可能なら |
sl | Silverlight がインストールされているなら |
sl1 | Sliverlight1 がインストールされているなら |
sl2 | Sliverlight2 がインストールされているなら |
sl3 | Sliverlight3 がインストールされているなら |
flash | Flash の ver 7.0 以上がインストールされているなら |
flash7 | Flash7 がインストールされているなら |
flash8 | Flash8 がインストールされているなら |
flash9 | Flash9 がインストールされているなら |
flash10 | Flash10 がインストールされているなら |
ブラウザ名 + バージョン番号は自動生成なので、上記以外のバージョンのものについても使用できます。
# Safari2 をサポートしたければ "safari2" が使える
具体的にはこうなります。
各ブラウザで実行すると、document.body.className が以下のように設定されます。
IE6 | js ie ie6 sl sl3 flash flash10 |
IE8 | js ie ie8 sl sl3 flash flash10 |
Opera9.27 | js opera opera92 sl sl3 flash flash10 |
Opera10.00β | js opera opera10 sl sl3 flash flash10 |
Google Chrome3β | js webkit chrome chrome3 sl sl3 flash flash10 |
Safari4 | js webkit safari safari4 sl sl3 flash flash10 |
iPhone OS 3.0 | js webkit safari safari4 iphone |
反省会
- コンディショナルセレクタを実装したあとに、「既にありそうだ…」と、ぐぐってみたらやはりありました。http://youmos.com/news/css_browser_selector
- ほぼ同じことを2年前にやってる人がいたってことは、誰でも思いつくレベルのアイデアってことですね。
- コンディショナルセレクタのほかに、バグを2つほど修正してます。