多くのテンプレートエンジン、 HTML5 Boilerplate 、さまざまなフレームワークそして普通のphpサイトではno-js
クラスに<HTML>
クラスが追加されています。
なぜこれが行われるのですか?このクラスに反応する、ある種のデフォルトのブラウザ動作はありますか?なぜそれを常に含めるのですか? no-"no-js"のケースがなくhtmlに直接対処できる場合は、それによってクラス自体が廃止されることはありませんか?
これはHTML5 Boilerplate index.htmlからの例です:
<!--[if lt IE 7 ]> <html lang="en" class="no-js ie6"> <![endif]-->
<!--[if IE 7 ]> <html lang="en" class="no-js ie7"> <![endif]-->
<!--[if IE 8 ]> <html lang="en" class="no-js ie8"> <![endif]-->
<!--[if IE 9 ]> <html lang="en" class="no-js ie9"> <![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--> <html lang="en" class="no-js"> <!--<![endif]-->
ご覧のとおり、<html>
要素には常にこのクラスがあります。なぜこれが頻繁に行われるのか、誰かが説明できますか?
Modernizrが実行されると、 "no-js"クラスを削除し、それを "js"に置き換えます。これは、Javascriptサポートが有効になっているかどうかに応じて異なるCSSルールを適用する方法です。
モダナイザのソースコード を参照してください。
no-js
クラスは Modernizr 機能検出ライブラリによって使用されます。 Modernizrがロードされると、no-js
をjs
に置き換えます。 JavaScriptが無効になっている場合、クラスは残ります。これにより、どちらかの条件を簡単にターゲットとするCSSを書くことができます。
ModernizrsのAnotated Sourceから (もはやメンテナンスされていない) :
存在する場合は、要素から "no-js"クラスを削除します。
docElement.className=docElement.className.replace(/\bno-js\b/,'') + ' js';
これはこのアプローチを説明しているPaul Irishによるブログ投稿です: http://www.paulirish.com/2009/avoiding-the-fouc-v3/
私はこれと同じことをするのが好きですが、Modernizrがありません。 JavaScriptが有効になっている場合は、クラスをjs
に変更するために、次の<script>
を<head>
に入れます。私は正規表現版より.replace("no-js","js")
を使うことを好みます。なぜならそれは少し難解で、私のニーズに合うからです。
<script>
document.documentElement.className =
document.documentElement.className.replace("no-js","js");
</script>
このテクニックの前は、JavaScriptで直接js依存のスタイルを直接適用するのが一般的でした。例えば:
$('#someSelector').hide();
$('.otherStuff').css({'color' : 'blue'});
no-js
トリックを使えば、これをcss
で実行できます。
.js #someSelector {display: none;}
.otherStuff { color: blue; }
.no-js .otherStuff { color: green }
これは以下の理由で好ましい方法です。
Modernizr.jsはno-js
クラスを削除します。
これにより、Javascriptが無効になっている場合にのみ.no-js something
のCSSルールを適用することができます。
no-js
クラスはjavascriptスクリプトによって削除されるので、jsが無効になっている場合はcssを使用して変更/表示/非表示にできます。
これはモダナイザにのみ適用されるわけではありません。私はそれがjavascriptをサポートしているかどうかをチェックするために以下のように実装しているサイトを見ます。
<body class="no-js">
<script>document.body.classList.remove('no-js');</script>
...
</body>
JavaScriptサポートがある場合、それはno-js
クラスを削除します。そうでなければno-js
はbodyタグに残ります。 JavaScriptがサポートされていない場合は、CSSのスタイルを制御します。
.no-js .some-class-name {
}
Modernizer、このセクションのソースコードを見てください。
// Change `no-js` to `js` (independently of the `enableClasses` option)
// Handle classPrefix on this too
if (Modernizr._config.enableJSClass) {
var reJS = new RegExp('(^|\\s)' + classPrefix + 'no-js(\\s|$)');
className = className.replace(reJS, '$1' + classPrefix + 'js$2');
}
そのため、基本的にはclassPrefix + no-js
クラスを検索し、それをclassPrefix + js
に置き換えます。
JavaScriptをブラウザで実行していない場合、それを使用してもスタイルが異なります。
ユーザーがブラウザでJSを無効にしているか有効にしているかに応じて、no-jsクラスがWebページのスタイル設定に使用されます。
no-js
デフォルトでは、Modernizrは
<html class="no-js"> to <html class="js">
を書き換えます。これにより、JavaScriptを実行する環境でのみ公開されるべき特定の要素を隠すことができます。この変更を無効にしたい場合は、設定でenableJSClassをfalseに設定できます。