• 締切済み

インラインフレームのページ内リンク

似たような質問が多々ありましたが、どれも解決に至る内容ではなかったので質問させて頂きました。 【環境】 親ページをindex.html、iframeで表示するページをpage.htmlとします。 page.htmlは縦長で、heightを調整してスクロールバーが出ない状態になっています。 【望む動作】 page.htmlにあるリンクをクリックすると、page.html内の特定の場所にジャンプ 但し、index.htmlとpage.htmlの位置関係(表示状態)はそのままで、フレームを使わないときの普通のページ内ジャンプと同じような動作をする 【現時点の問題点】 targetを変えても、iframe内に親ページごと表示される(合わせ鏡の世界のようになる)か、フレームが解除されてpage.htmlだけが表示されるのどちらかになってしまう(http://からのフルパスでも同じ) 提供されたスペースの為、index.htmlのheadはいじれない 現状はこのようになっていますが、レイアウトを崩さずページ内でジャンプさせることは可能でしょうか。 色々試してみたいので、「index.htmlのheadはいじれない」の縛りがある場合とない場合でご回答頂けましたら幸いです(Javascriptでも構いません)。 宜しくお願いします。

みんなの回答

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.5

ORUKA1951です。 なぜ、ページがスクロールしてくれないのかを、どうしたら説明できるかを考えていました。  まず、通常のページでページ内アンカーがある場合を考えて見ましょう。視覚系ブラウザでは、表示領域の高さをウィンドウの高さとしています。そのため、 ・ウィンドウ内にすべて表示されている場合はページはスクロールしません。してはなりません。 ・ページの高さがウィンドウ幅より高く、それが表示されていない場合は、リンクでスクロールされます。そのときページの最下段はウィンドウ内に収まるようにスクロールされます。  これが、狭いウィンドウで長いページを表示させる仕組みです。  frame/iframe/objectを使って外部ファイルを表示させたときは、ウィンドウの高さではなく、指定された高さを表示領域として動作します。これは、その指定されたサイズを表示可能領域としないと、レンダリングそのものができないからです。  すなわち、「page.htmlは縦長で、heightを調整してスクロールバーが出ない状態に」しているために、当然あるべき姿なのです。埋め込まれたページは、それを埋め込んだページが表示されている区画を知ることができないのですからね。  したがって、子供であるHTMLが、その親であるHTMLを引き上げることは不可能ですし、そうあってはならないのです。  対処としては、先に述べましたようにSSIを使って、そのHTML(<HEAD><BODY>わ含まない)ソースを本体HTML内にサーバー側で組み込むか、javascriptを使って---基本的にSSIと仕組みは同じでHTML全体を埋め込むことはできない----を使って埋め込むしか方法はありません。  先の例で言うと <div class="article"> <!--#include file="page.html" --> </div> として、page.htmlは  <div class="header">   <h1>タイトル</h1>   <p>このページでは・・・・</p>  </div>  <div class="section">   <div class="section" id="A1">    <h2>一章見出し</h2>    <p>・・・</p>   </div>   <div class="section" id="A2">    <h2>二章見出し</h2>    <p>・・・</p>   </div>   <div class="section" id="A3">    <h2>三章見出し</h2>    <p>・・・</p>   </div>   <div class="section" id="A4">    <h2>四章見出し</h2>    <p>・・・</p>    <p>・・・</p>    <p>・・・</p>   </div>   <div class="contentTable">    <ol>     <li><a href="#A1">A1</a></li>     <li><a href="#A2">A2</a></li>     <li><a href="#A3">A3</a></li>     <li><a href="#A4">A4</a></li>    </ol>   </div>  </div>  <div class="footer">   <h2>文書情報</h2>  </div> ということです。こうすると、includeの部分がすっかり置き換わります。 [補足] articleというclass名は、完結したひとつの記事と言う意味を示します。 →DIV要素とSPAN要素は、id属性及び class属性と併用することで、文書に構造を付加するための一般機構を提供する。 ( http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html401j/struct/global.html#h-7.5.4 ) →article 要素はブログのエントリや新聞記事など、文書内で自己完結可能な箇所を示します。 ( http://standards.mitsue.co.jp/resources/w3c/TR/html5-diff/#new-elements ) あなたの利用しているサーバーの種類や設定がわかりませんが、可能ならファイル名を index.shtml として、テストすると良いかもしれません。

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.4

訂正 [HTML4.01transitinal/HTML4.01frameset]非推奨 <div class="section">  <h2>見出し</h2>  <p>   <iframe src="./page.html" style="display:block;width:600px;height:400px;overflow:hidden;border:none;">  </p> </div>

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.3

>targetを指定しないのは_selfと同じですよね?  そうです。  リンクの場合、あくまで参照できる親要素の高さ内に表示できないから、リンクでページがスクロールされるのですから、ページのすべてがすでに表示されている場合は、親になるページはスクロールしません。なぜなら、高さはこれだけだよと設定してしまっているからです。  表示領域の指定がない場合はウィンドウの高さになります。 ★この場合は、本来はSSIなどで該当HTMLの本文部分だけを読み込むべきですが、それができないならpage.htmlの内容をコピーペーストするしかないでしょう。 ★下記ソースはタブを全角スペース に置換してあります。 [HTML4.01strict]推奨 <div class="section">  <h2>見出し</h2>  <p><object data="./page.html" type="text/html" style="display:block;width:600px;height:400px;overflow:hidden;">  </object></p> </div> [HTML4.01transitinal/HTML4.01frameset]非推奨 <div class="section">  <h2>見出し</h2>  <p><iframe src="./page.html" style="display:block;width:600px;height:400px;overflow:hidden;border:none;">  </object></p> </div> [index.html]HTML4.01strict <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="ja"> <head>  <meta http-equiv="content-type" content="text/html; charset=Shift_JIS">  <title>サンプル</title>  <meta name="author" content="ORUKA1951">  <meta http-equiv="Content-Style-Type" content="text/css">  <link rev="made" href="mailto:oruka1951@hoge.com" title="send a mail" >  <link rel="START" href="../index.html">  <style type="text/css"> <!-- body{background-color:silver;} div.header{height:100px;} div.section{position:relative;} div.section div.section{margin-left:20%;background-color:white;height:300px;} div.section div.contentTable{width:19%;position:fixed;top:110px;background-color:yellow;} div.section div.section+div.section{background-color:aqua;} div.section div.section+div.section+div.section{background-color:fuchsia;} div.section div.section+div.section+div.section+div.section{background-color:lime;} -->  </style> </head> <body>  <div class="header">   <h1>タイトル</h1>   <p>このページでは・・・・</p>  </div>  <div class="section">   <div class="section" id="A1">    <h2>一章見出し</h2>    <p>・・・</p>   </div>   <div class="section" id="A2">    <h2>二章見出し</h2>    <p>・・・</p>   </div>   <div class="section" id="A3">    <h2>三章見出し</h2>    <p>・・・</p>   </div>   <div class="section" id="A4">    <h2>四章見出し</h2>    <p>・・・</p>    <p>・・・</p>    <p>・・・</p>   </div>   <div class="contentTable">    <ol>     <li><a href="#A1">A1</a></li>     <li><a href="#A2">A2</a></li>     <li><a href="#A3">A3</a></li>     <li><a href="#A4">A4</a></li>    </ol>   </div>  </div>  <div class="footer">   <h2>文書情報</h2>  </div> </body> </html>

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.2

targetは一切記述する必要がありません。

Mentho
質問者

補足

targetを書かなくても動作しないんですが…。つーかtargetを指定しないのは_selfと同じですよね?

  • cma3atgoo
  • ベストアンサー率35% (32/90)
回答No.1

もう試されているかも知れませんが、 ラベルへのジャンプではダメだということですかね? <a href="#ジャンプ先">ジャンプ</a> <a name="ジャンプ先">ジャンプ先</a>

Mentho
質問者

補足

ご回答ありがとうございます。 真っ先に試しましたが、target属性をどれにしても駄目でした。 page.htmlが単独で開いてしまったり、iframeの中にindex.htmlが開かれてしまったり。 色々調べたところ、Javascriptを使わないと駄目みたいですが、しっくりくるソースが見つかりませんでした。

関連するQ&A