P-0028 フレームを使うときの注意点
- 2000/11/5
フレーム指定でミスをする人が多いようなので、間違いがちなポイントをいくつか解説します。
DOCTYPE の指定について
HTML 4.01 と XHTML 1.0 においては「フレーム専用」の DTD として「 HTML 4.01 Frameset/XHTML 1.0 Frameset 」が用意されていますが、この「フレーム専用」の意味を勘違いしている人が時々います。
フレームを使ったページは、まず「<frameset>を指定したファイル」を読み込んで、その指示に従って「各フレーム内のページ」を読み込み、表示します。 Frameset DTD はこの「<frameset>を指定するファイル」専用で、「フレーム内に表示される各ページ」に Frameset DTD を使用するわけではありません。
フレーム内にはフレーム割りを記述したファイルを指定する(さらに細かくフレームを分ける)こともできますが、基本的には Strict DTD 又は Transitional DTD を使った HTML 文書を指定することになります。尚、 target
は Strict DTD では破棄されているので、インデックス用の HTML 文書は Transitional DTD で記述しなければなりません。
noframe"S"
間違えられることが多いですが、フレーム非対応ブラウザ用の要素は<noframe>ではなく<noframes>(複数形)です。
なお、 noframes 内に記述する内容は「警告メッセージ」ではなく、フレーム非対応環境用の代替内容です。単に「アナタのブラウザはフレーム非対応です。フレーム対応ブラウザで見て下さい。」とだけ書いたりせずに、例えば目次と本文でフレームを分けている場合、本文ページへのリンクを記述するなどのほうが望ましいです。
frameset 内の書き方
frameset 内の記述の順番(入れ子関係)は解説書によってバラバラですが、 W3C の定める仕様では、(全てのタグを省略せずに書いた場合)以下のようにするのが正しいことになっています。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head><title>正しい例</title></head>
<frameset>
<frame>
<frame>
<noframes>
<body>
</body>
</noframes>
</frameset>
</html>
以下は間違いの例です。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head><title>誤用の例</title></head>
<body>
<frameset>
</frameset>
<noframes>
ほげほげ
</noframes>
</body>
</html>
frameset は body の代わりに書きます。 body 内に frameset を書いてはいけません。また、 noframes は frameset の中に入れなければなりません。 frameset の後に書くのは間違いです。
ちなみに、 noframes 内には代替内容の body が入ります。 HTML 4.01 では body の開始/終了タグを省略できるので noframes 直下に<p>などを書くのが正しいと思いがちですが、 XHTML ではタグの省略が許されないので、 noframes 内にはきちんと body タグを書いておく必要があります。
XHTML 1.0 Frameset での正しい記述例
<frameset>
<frame>
<frame>
<noframes>
<body>
<h1>代替内容の見出し</h1>
<p>代替内容</p>
</body>
</noframes>
</frameset>