[1] [[HTML]] の [DFN[[CODE(HTMLe)[frameset]] 要素型]]の要素は、
[[UA]] の主要窓内の表示の配置を指定します。

* 代替

[19] 通常の [[HTML文書]]に [CODE(HTMLe)@en[iframe]] [[要素]]で[[フレーム]]を配置できます。
[CODE(HTMLe)@en[frameset]] [[要素]]を使う必要はありません。

* 仕様書

[REFS[
- [2] [[HTML 4]]
-- 16.2 Layout of frames <IW:HTML4:"present/frames.html#h-16.2">
-- 16.3 Note <IW:HTML4:"present/frames.html#idx-frame-5">
]REFS]



[3]
:[[開始タグ]]:必須
:[[終了タグ]]:必須
:出現できる文脈:[CODE(HTMLe)[[[html]]]] の子供で [CODE(HTMLe)[[[head]]]] の後
:[[内容模型]]:[CODE(SGML)[([CODE(HTMLe)[frameset]] | [CODE(HTMLe)[[[frame]]]])+, [CODE(HTMLe)[[[noframes]]]]?]]
:[[属性]]:
,属性名	,属性値	,既定値	,説明	,状態	,出典
,[CODE(HTMLa)[[[border]]]]	,	,	,境界線	,非標準
,[CODE(HTMLa)[[[bordercolor]]]]	,	,	,境界線色	,非標準
,[CODE(HTMLa)[[[class]]]]	,	,(なし)	,級	,[HTML 4] [CODE(SGML)[%[[coreattrs]]]]
,[CODE(HTMLa)[[[cols]]]]	,[CODE(SGML)[%[[MultiLengths]]]]	,[CODE(HTML)[100%]]	,横分割	,[HTML 4] 枠
,[CODE(HTMLa)[[[id]]]]	,[CODE(SGML)[[[ID]]]]	,(なし)	,固有識別子	,[HTML 4] [CODE(SGML)[%[[coreattrs]]]]
,[CODE(HTMLa)[[[frameborder]]]]	,	,	,境界線	,非標準
,[CODE(HTMLa)[[[framespacing]]]]	,	,	,枠間隔	,非標準
,[CODE(HTMLa)[[[layout]]]]	,	,	,	,非標準
,[CODE(HTMLa)[[[onload]]]]	,[CODE(SGML)[%[[Script]]]]	,(なし)	,読込み時	,[HTML 4] 枠
,[CODE(HTMLa)[[[onunload]]]]	,[CODE(SGML)[%[[Script]]]]	,(なし)	,Unload 時	,[HTML 4] 枠
,[CODE(HTMLa)[[[rows]]]]	,[CODE(SGML)[%[[MultiLengths]]]]	,[CODE(HTML)[100%]]	,縦分割	,[HTML 4] 枠
,[CODE(HTMLa)[[[style]]]]	,[CODE(SGML)[%[[StyleSheet]]]]	,(なし)	,スタイル	,[HTML 4] [CODE(SGML)[%[[coreattrs]]]]
,[CODE(HTMLa)[[[title]]]]	,[CODE(SGML)[%[[Text]]]]	,(なし)	,注釈的題	,[HTML 4] [CODE(SGML)[%[[coreattrs]]]]
,[CODE(XMLa)[[[xmlns]]]]	,[CODE(URI)[[[http://www.w3.org/1999/xhtml]]]] 固定	,==	,[[名前空間名]]	,W3C 勧告	,[[XHTML m12n]]


[CODE(HTMLa)[cols]] と [CODE(HTMLa)[rows]] は、
両方指定しても指定しなくても、一方だけ指定しても構いません。

[[#comment]]


** 出現できる文脈

[4] 通常 [CODE(HTMLe)[[[body]]]] 内に出現する要素は
([CODE(HTMLe)[head]] の弟の) [CODE(HTMLe)[frameset]] より前に現れてはなりません
[SRC[HTML 4 16.2]]。

といってもこれは内容模型的に当たり前のことです。

* 構文

** frameset-ok フラグ

[39] frameset-ok フラグを not ok に設定しない [CODE(HTMLe)@en[[[body]]]]
内の[[要素]]の[[開始タグ]]を使うことで、削除される [CODE(HTMLe)@en[[[body]]]]
[[要素]]に[[スクリプト]]からアクセスできます。

;;
[REFS[
- <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Ca%3E%3Cscript%3Eb%3Ddocument.body%3B%20window.onload%20%3D%20function%20()%20%7B%20document.body.appendChild%20(b)%20%7D%3C%2Fscript%3E%3Cframeset%3E%3C%2Fframeset%3E>
]REFS]

[40] [[IE9]] は frameset-ok フラグを正しく実装していないようで、
in body でどの[[開始タグ]]でも not ok が設定されるように動作します。

** 内容

[8] [CODE(HTMLe)[frameset]] 要素は枠の配置を定義しますが、
実際のその枠の名前や初期状態などは、 [CODE(HTMLe)[[[frame]]]]
要素を使って定義します。更に分割する際には [CODE(HTMLe)[noframes]]
を入れ子に使います。

[CODE(HTMLe)[frame]] や [CODE(HTMLe)[noframes]] は、
[CODE(HTMLa)[rows]] と [CODE(HTMLa)[cols]] によって定義した枠1つに対応します。
[[文書順]]に、1行1列, 1行2列, ..., 1行[VAR[n]]列,
2行1列, 2行2列, ..., 2行[VAR[n]] 列, ...,
[VAR[n]]行1列, [VAR[n]]行2列, ..., [VAR[n]]行[VAR[n]]列と対応します。
[SRC[HTML 4 16.2.1.1]]

[9]
また、枠に対応していない UA や枠を使わない設定の場合などのために、
[CODE(HTMLe)[[[noframes]]]] 要素で[[代替内容]]を記述しておくべきです。

[21]
[[内容]]中の [CODE(HTMLe)@en[[[noframes]]]] [[要素]]の位置については、
[CODE(HTMLe)@en[[[noframes]]]] の項を参照。
([[名無しさん]] [sage])

[[#comment]]


** フレーム集合の状態

[11] [CODE(HTMLe)[frameset]] 要素の内容や属性が定義するのは、
フレーム集合の初期状態に過ぎません。フレーム集合の内容は、
利用者の操作 (リンクを辿るとか、枠の大きさを変えるとか)
によって変更され得ます。 (但し、フレーム集合定義は不変です。)
[SRC[HTML 4 16.3 Note]]

[12] 
フレーム集合の初期状態は、フレーム集合定義文書そのものとして
[[URI]] で表現可能ですが、変更されたフレーム集合のある状態はそうではありません。
[SRC[HTML 4 16.3 Note]]

この URI で表現できないという問題は、フレームの大きな欠点の一つとしてしばしばとりあげられます。

[13]
この問題の解決策は幾つか提示されてきました。
著者側での解決方法の一つは、
想定される組合せだけフレーム集合文書を用意しておくというものですが、
これはフレームの利点を殺すようなものです。

また、 URI の [CODE(ABNF)[[[query]]]] などを利用して、
フレーム集合文書を機械的に用意するという方法も行われています。
(鯖側で [[CGI]] や同種の仕組みを使って実現する他に、
クライアント側スクリプトで [CODE(HTMLa)[[[src]]]]
を書き換えるなど強引な解決方法を採っていることもあります。)

[14] 比較的新しい UA の中には、[[栞]]を挟むときに、
URI とは別にフレームの状態の情報を保存できるものもあります。

また、[[素片識別子]]にフレームの状態を記述すればよいという提案もあります。
HTML のフレームの後継規格である [[XFrames]]
もその方向で策定が進められています。

[15] また、フレームを使うと履歴機能などによる利用者の操作が難しくなるという問題があります
[SRC[HTML 4 16.3 Note]]。

古い実装には、フレーム内でリンクを辿って一部のフレームの状態が変わっても履歴に反映されなかったようなものもありました。
実装・利用経験から少しずつ操作性は改善されていますが、
根本的な解決にはなっていません。

(そもそもは、フレームによって頁移動が非線形になったのに多くの UA
の履歴機能が線形なのが問題です。)

** 関連

[7] [CODE(HTMLe)[frameset]] 文書の [CODE(HTMLe)[head]]
で [CODE(HTMLe)[[[object]]]] 要素を使って、
子フレーム間でデータを共有することができます [SRC[HTML 4 16.2.1.3]]。
>>6 の例を参照してください。

[37] [[XFrames]] には [CODE(XMLe)@en[[[group]]]] [[要素]]があり、
[CODE(HTMLe)@en[[[frameset]]]] [[要素]]と似た役割を果たしています。

** 例

[5] 入れ子の例 [SRC[HTML 4 16.2.1.2]]
[PRE(HTML)[
<FRAMESET cols="33%, 33%, 34%">
     ...contents of first frame...
     <FRAMESET rows="40%, 50%">
        ...contents of second frame, first row...
        ...contents of second frame, second row...
     </FRAMESET>
     ...contents of third frame...
</FRAMESET>
]PRE]

この例では、窓全体を横3つにほぼ均等に分け、
左から2つ目をたてに2つに分けています。

[6] フレーム間データ共有の例 [SRC[HTML 4 16.2.1.3]]
[PRE(HTML)[
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
   "http://www.w3.org/TR/html4/frameset.dtd">
<HTML>
<HEAD>
<TITLE>This is a frameset with OBJECT in the HEAD</TITLE>
<!-- This OBJECT is not rendered! -->
<OBJECT id="myobject" data="data.bar"></OBJECT>
</HEAD>
<FRAMESET>
    <FRAME src="bianca.html" name="bianca">
</FRAMESET>
</HTML>
]PRE]

利用する側の例:
[PRE(HTML)[
<!-- In bianca.html -->
<HTML>
<HEAD>
<TITLE>Bianca's page</TITLE>
</HEAD>
<BODY>
...the beginning of the document...
<P>
<SCRIPT type="text/javascript">
parent.myobject.myproperty
</SCRIPT>
...the rest of the document...
</BODY>
</HTML>
]PRE]

実際の文書では、 [SAMP(URI)[bianca.html]] 
がフレーム無しで単独で読み込まれることが十二分にあり得ますから、
スクリプト内でその場合の対処を行う必要があります。

[10] フレーム集合文書の例 [SRC[HTML 4 16.1]]
[PRE(HTML)[
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
   "http://www.w3.org/TR/html4/frameset.dtd">
<HTML>
<HEAD>
<TITLE>A simple frameset document</TITLE>
</HEAD>
<FRAMESET cols="20%, 80%">
  <FRAMESET rows="100, 200">
      <FRAME src="contents_of_frame1.html">
      <FRAME src="contents_of_frame2.gif">
  </FRAMESET>
  <FRAME src="contents_of_frame3.html">
  <NOFRAMES>
      <P>This frameset document contains:
      <UL>
         <LI><A href="contents_of_frame1.html">Some neat contents</A>
         <LI><IMG src="contents_of_frame2.gif" alt="A neat image">
         <LI><A href="contents_of_frame3.html">Some other neat contents</A>
      </UL>
  </NOFRAMES>
</FRAMESET>
</HTML>
]PRE]

レンダリング例:
[PRE(HTML)[
 ---------------------------------------
|         |                             |
|         |                             |
| Frame 1 |                             |
|         |                             |
|         |                             |
|---------|                             |
|         |          Frame 3            |
|         |                             |
|         |                             |
|         |                             |
| Frame 2 |                             |
|         |                             |
|         |                             |
|         |                             |
|         |                             |
 ---------------------------------------
]PRE]

[16]
[CITE[NAP勉強会 -- フレームについて考える --]] <http://www.accessibility.org/workshops/Nov2002/frame.html>
([[名無しさん]] [sage])

[17]
[CITE[05/10/2003勉強会の記録]] <http://www.accessibility.org/workshops/May2003/minutes.html>

[20]
[CODE(HTMLe)@en[[[head]]]] 内に置いた例
[PRE(HTML example code invalid)[
<HTML DIR=LTR>
<HEAD> <!-- saved from url=(0014)about:internet -->
<TITLE>自宅でオフィスでネットワーク</TITLE><FRAMESET  ROWS="*,35">
    <FRAME NAME="body" SRC="connected_multiple.htm" MARGINWIDTH="0" MARGINHEIGHT="0" SCROLLING="auto" FRAMEBORDER="0">
    <FRAME NAME="footer" SRC="footer.htm" MARGINWIDTH="0" MARGINHEIGHT="0" SCROLLING="No" FRAMEBORDER="0">
</frameset></HEAD><BODY></BODY></HTML>
]PRE]

;; 
出典: [[Windows XP]] [[日本語版]]の
[CODE(file)@en[C:\windows\help\Tours\htmlTour\connected_fr.htm]]

([[名無しさん]])

[[#comment]]


** メモ

[22]
[CITE[Frame Implementation Notes]] ([CODE[2007-02-28 00:35:27 +09:00]] 版) <http://web.archive.org/web/19970613222258/www82.netscape.com/assist/net_sites/frame_implement.html>
([[名無しさん]])

[23]
[CITE[KOTOERI-HTML]] ([CODE[2006-11-05 06:29:16 +09:00]] 版) <http://www.tcp-ip.or.jp/~h-log/html/HTMLdic.html#frame>

> フレームを書くときは<BODY>を書かないことに注意!

あと、この文書は [CODE(HTMLe)@en[[[frameset]]]] の''最初''の[[子要素]]を
[CODE(HTMLe)@en[[[noframe]]]] (sic) にしている。
([[名無しさん]])

[25]
[CITE[こぶたのラッパ : HTML5でframeが使えなくなったらJavadocはどうなるの?]] ([[smilkobuta]] 著, [CODE[2008-03-09 21:55:17 +09:00]] 版) <http://smil.exblog.jp/8063796/>
([[名無しさん]])

[26]
[CITE[こぶたのラッパ : HTML5でもframeを使おう!<解決編>]] ([[smilkobuta]] 著, [CODE[2008-03-09 21:56:39 +09:00]] 版) <http://smil.exblog.jp/8079680/>
([[名無しさん]])

[27]
>>25 不適合化が何も解決しないといういい例ですね。
([[名無しさん]] [WEAK[2008-03-09 12:58:51 +00:00]])

[28]
[CITE['''['''JavaHouse-Brewers:6099''']''' # bye]] ([CODE[2001-11-24 19:25:59 +09:00]] 版) <http://java-house.jp/ml/archive/j-h-b/006099.html>
([[名無しさん]])


[29]
>>28
<http://suika.fam.cx/~wakaba/-temp/test/html/frame/flow-tag-then-frameset/demo-1.html>

[24]
[CITE[HTML5 IRC logs: freenode / #whatwg / 20070823]] ([CODE[2007-08-23 12:02:14 +09:00]] 版) <http://krijnhoetmer.nl/irc-logs/whatwg/20070823#l-181>

[[文書]]中に現れる[[要素型]]の数は[[正規分布]]に見えますが、数個のところに不自然な出っ張りがあります。単なるノイズではなく、複数の調査結果に現れています。

この出っ張りは、限られた数の[[要素型]]しか使用しない[[フレーム集合]][[文書]]に由来するもののようです。
([[名無しさん]] [WEAK[2007-08-23 03:06:02 +00:00]])

[30] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-09-06 21:28:03 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=2702&to=2703>

[44] >>28, >>29 を [[Hixie]] に報告したら >>30 で [[frameset-ok]] フラグが導入されました。

[31] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-09-06 21:28:44 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=2986&to=2987>

[32] [CITE@en[Web Applications 1.0 r5534     Make a second (bogus) <body> reset the frameset-ok flag.Fixing http://www.w3.org/Bugs/Public/show_bug.cgi?id=10630]]
( ([TIME[2010-09-29 06:57:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5533&to=5534>

[33] [CITE@en[Web Applications 1.0 r5730       Change how <input type=hidden> affects the frameset flag.]]
( ([TIME[2010-12-31 13:04:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5729&to=5730>

* フレーム集合

[34] 
>
The collection of frames in an XFrames document is referred to as a [DFN[frameset]].

** 仕様書

- [35] 
[CITE@en[XFrames]] ([TIME[2010-12-17 00:45:08 +09:00]] 版) <http://www.w3.org/TR/2010/NOTE-xframes-20101216/#s_frames-element>

** メモ

[36] この定義は [CODE(XMLe)@en[[[frames]]]] [[要素]]の説明に含まれていますが、
その説明文からは [CODE(XMLe)@en[[[frames]]]] [[要素]]と[[フレーム集合]]との関係は明確になっていません。
[[HTML]] の[[要素]]との関連では、むしろ [CODE(XMLe)@en[[[group]]]]
[[要素]]の方が [CODE(HTMLe)@en[[[frameset]]]] [[要素]]に近いように思えます。



[38] [CITE@en[Web Applications 1.0 r6663     Fix the <frameset> rendering rule to trigger when 'the body element' is frameset, not just when the second child of the root element is.]]
( ([TIME[2011-10-12 08:12:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=6662&to=6663>

[18] [CITE@en[ISSUE-697/ACTION-1658: Fix glossary entry for "Role". · w3c/aria@9fac811]]
([TIME[2015-06-19 18:37:01 +09:00]] 版)
<https://github.com/w3c/aria/commit/9fac811f75ad7ef33ef5a704ec06d508c79ba468>

[41] [CITE@en[Editorial: Cross-reference DOM "child" where appropriate in rendering]]
([[zcorpan]]著, [TIME[2016-09-20 20:16:41 +09:00]])
<https://github.com/whatwg/html/commit/e8c91c05edc8d6cdb33fdd5452e052359d40490b>

[FIG(quote)[
[FIGCAPTION[
[42] ( ([TIME[2017-01-27 11:15:29 +09:00]]))
<http://www.jspm.or.jp/>
]FIGCAPTION]

> 
> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
> <HTML>
> <HEAD>
> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
> <meta name="GENERATOR" content="JustSystems Homepage Builder Version 17.0.15.0 for Windows">
> <meta http-equiv="Content-Style-Type" content="text/css">
> <TITLE></TITLE>
> </HEAD>
> <frameset cols="273,*">
>   <frame name="left" src="2leftpage.html">
>   <frame name="right" src="2rightpage.html">
>   <NOFRAMES>
>   <BODY>
>   <P>このページを表示するには、フレームをサポートしているブラウザが必要です。</P>
>   </BODY>
>   </NOFRAMES>
> </frameset>
> </HTML>

]FIG]


[FIG(quote)[
[FIGCAPTION[
[43] [CITE['''['''JavaHouse-Brewers:51219''']''' 重要 メールアドレス 変更@java-house.etl.go.jp -> @java-house.jp]]
([TIME[2017-11-01 09:43:02 +09:00]])
<https://web.archive.org/web/20090210145446/http://java-house.jp/ml/archive/j-h-b/051219.html>
]FIGCAPTION]

> <title>[JavaHouse-Brewers:51219] 重要 メールアドレス
> 変更@java-house.etl.go.jp -&gt;
> @java-house.jp</title>
> <script language="JavaScript">
> <!--
> if (window.parent == window) {
>   document.write("<A NAME=_BODY>")
>   document.write("<FRAMESET rows='30%,70%'>")
>   document.write("<FRAME name=Subject src=threads-051200.html#051219>")
>   document.write("<FRAME name=Article src=051219.html?#_body>")
>   document.write("</FRAMESET>")
>   document.write("</A>")
>   document.write("<NOFRAMES>")
> }
> // -->
> </script>
> </head>
> <body>

]FIG]


[45] [CITE@en[Deprecations and removals in Chrome 69  |  Web  |  Google Developers]]
([TIME[2018-09-15 02:56:15 +09:00]])
<https://developers.google.com/web/updates/2018/09/chrome-70-deps-rems>