質問
Javascript によって制御される非表示の div を持つ XHTML strict ページがあります。div はスクリプトによって透明に設定され、マウスオーバー時に div を不透明にするマウスオーバー イベントによって表示されます。
JavaScript を使用せずにブラウザ (またはスクリプトなしの Firefox) を使用している場合、div は単に非表示のままになります。これの問題は、コンテンツにアクセスできないようにしたくないことです。また、div を表示したままにしたくなく、スクリプトを使用して透明にします。これは、div がドキュメントの下部にあり、ページが読み込まれるたびに顕著なちらつきが発生するためです。
noscript タグを使用して、JavaScript を使用しない人にのみロードされる追加のスタイル シートを埋め込もうとしましたが、これは XHTML の厳密な検証に失敗します。XHTML が有効な noscript ブロック内に追加のスタイル情報を含める他の方法はありますか?
エド:
単純なテストケースでは、次の検証エラーが発生します。 ここでは、ドキュメント タイプでは要素「style」を使用できません。これは、noscript 要素内に style 要素を持つ空の XHTML Strict ドキュメントを使用しています。noscript はボディ内にあります。
解決
検証の問題を解決するには、noscript
はbody
要素でのみ、style
はhead
でのみ許可されます。したがって、前者では後者を使用できません。
一般的な問題については、デフォルトでdiv
要素を表示し、CSS + javascriptで非表示にする必要があります。これは「プログレッシブエンハンスメント」モデルです。 <!> quot;ちらつきのためにこれをやりたくない<!> quot;と言いますが、これが何を引き起こしているのか正確にはわかりません-修正できる可能性があるので、投稿する必要がある質問としてそれ。
他のヒント
noscriptは有効なHTML5です。以前は無効でした。試したところ、現在のFirefox、Safari、Chrome、Opera、IEで動作します。
<!doctype html>
<html>
<head>
<noscript>
<style>body{background:red}</style>
</noscript>
</head>
<body>
<p>is this red? it should <script>document.writeln("not");</script> be. <noscript>indeed.</noscript></p>
</body>
</html>
script
でhead
ブロックを使用して、style
でdocument.write
要素を追加します:
<head>
...
<script type="text/javascript">
//<![CDATA[
document.write('<style type="text/css">.noscript{display:none}</style>');
//]]>
</script>
...
</head>
私の回答についてのメモ
この記事が 2008 年のものであることに気づいてこの記事を書きました
私も同様の問題を抱えていたので、現在の回答で回答を続けようと思いました。
私の実際の答え
ボビー・ジャックが言ったように、 style
本文内にタグを含めることはできません。私自身、それに関してあなた(ジョシュア)と全く同じことをしました。しかし、ジャックの「漸進的強化」により、私は非抽象的な解決策を得ることができませんでしたが、その後、このスレッドで答えが見つからない解決策に気づきました。
それはすべてスタイリング構造に依存します。
私の提案は、次のようなものを単純に使用することです modernizr
を頭の最初に追加し、Paul Irish の HTML5Boilerplate 推奨事項を使用します。
長い話を短くすると
- HTMLタグには、
class
属性付きno-js
- head タグには、最初の modernizr JavaScript が最初に含まれています
- CSS には要素 (
.hide-me
) とdisplay:none
適切な場所に - それから
.no-js .hide-me { display:block }
詳細に
Paul Irish の HTML5 ボイラープレートを参照し、必要に応じて XHTML に適応させてください:)
1.HTML には次のクラス属性があります。 .no-js
<!doctype html>
<!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ -->
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
からの引用 html5boilerplate.com
2.head タグには、最初の modernizr JavaScript が最初に含まれています
Modernizr を実行するとビルドされます html
属性とサポートされている内容。
これに似たものを構築します。
<html class=" js flexbox canvas canvastext webgl no-touch geolocation postmessage websqldatabase indexeddb hashchange history draganddrop websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations csscolumns cssgradients cssreflections csstransforms csstransforms3d csstransitions fontface generatedcontent video audio localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths" lang="en">
注記 これはGoogle Chromeからのものです modernizr
テスト。
1つ目は js
ただし、Modernizr が実行されなかった場合 (JavaScript がない場合)、 no-js
そこに留まるだろう。
3.CSS には要素 (.hide-me
) と display:none
適切な場所に
...残りはご存知でしょう:)
どのような検証エラーが発生しますか? <noscript>
はXHTMLで許可されますが、ブロックレベルなので、<p>
、<span>
などに含まれないようにしてください
更新:
w3school から:
HTML 4.01とHTML5の違い
HTML 4.01では、
<noscript>
タグは<body>
内でのみ使用できます 要素。HTML5では、
<head>
タグはx_no_script.css
と <=>。HTMLとXHTMLの違い
XHTMLでは、<=>タグはサポートされていません。
メニュー(リストなど)を拡張するための私のソリューション
このようにヘッダーに入れました
<header>
<noscript>
<link rel="stylesheet" href="assets/css/x_no_script.css">
</noscript>
</header>
<=>で、必要なセレクタを設定します
max-height: 9999px;
overflow: visible;
このようにして、 JavaScript が無効であるか存在しない場合にメニューを展開しました。
XHTMLを使用する場合、2つのCSSファイルを使用するのがコツです。 1つのグローバルなものと1つのjs-oneは、JavaScript対応ブラウザー用にグローバルなものを調整します。
style.css:
.hidden {
visibility:hidden;
}
style-js.css:
.hidden {
visibility:visible;
}
test.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<title>Test page</title>
<link href='css/style.css' rel='stylesheet' type='text/css' />
<script type="text/javascript">
//<![CDATA[
//document.write("<link href='css/style-js.css' rel='styleSheet' type='text/css' />");
//is not legal in XHTML, we do the long way:
var l=document.createElementNS("http://www.w3.org/1999/xhtml","link");
l.setAttribute("rel", "stylesheet");
l.setAttribute("type", "text/css");
l.setAttribute("href", "/css/style-js.css");
document.getElementsByTagName("head")[0].appendChild(l);
//]]>
</script>
</head>
<body>
<div class="hidden">
<p>Only displayed at JavaScript enabled browsers</p>
</div>
</body>
</html>
tutorials.deによる主なアイデア。 Estelle WeylのブログによるXHTML妥当性のヒント。 CodingForums によるcreateElementNSのヒント。