P-0028 フレームを使うときの注意点

フレーム指定でミスをする人が多いようなので、間違いがちなポイントをいくつか解説します。

DOCTYPE の指定について

HTML 4.01 と XHTML 1.0 においては「フレーム専用」の DTD として「 HTML 4.01 Frameset/XHTML 1.0 Frameset 」が用意されていますが、この「フレーム専用」の意味を勘違いしている人が時々います。

<!DOCTYPE "Frameset">
<frameset>
   <frame name="A" ...>
   <frame name="B" ...>
</frameset>
↓
name="A" | name="B" フレームを使ったページは、まず「<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>