あーだこーだ、なんちゅーかほんちゅーか、すっとこどっこい....
左にあるちいさい枠部分はスクロールしても固定していると思ってね。
あれれれ、これれれ、
やっしょー
まかしょ
左が空いちゃってもうもったいないったらありゃしない。もったいないオバケが
出るぞぉぉぅ
position特性などを用いて、同じ座票に複数の要素が重なったときの z軸方向(厚み方向)の位置を z-index特性 を用いて制御できる。
その要素の重ね合わせの位置を整数または auto で指定する。 数値が大きいものほど上、つまり手前に見える。
たとえば、以下に示す画像があったとする。
この画像と、別のパラグラフ(p要素)を同じ座標で重ねると、 通常はHTML的にあとに書いた方が上に来る。
<!-- absoluteボックスを包むためのrelativeボックスを作る --> <div style="position: relative; height: 200px; border: 1px solid;"> <!-- 1つ目の画像用パラグラフ --> <p style="position: absolute; top: 0; left: 0; width: 230px;"> <img src="nin-tp.png" alt="Image of Nintaro" width="230" height="170"> </p> <!-- 2つ目の文章用パラグラフ --> <p style="position: absolute; top: 0; left: 0; width: 230px;"> この物語は、正義の味方忍太郎が難事件をばっさばっさと 解決するのを諦めていく様子を描いたものである。 </p> </div>
この物語は、正義の味方忍太郎が難事件をばっさばっさと 解決するのを諦めていく様子を描いたものである。
1つ目のp要素のz-index特性値を2にすると、 2つ目のp要素よりも手前に来る。
<!-- absoluteボックスを包むためのrelativeボックスを作る -->
<div style="position: relative; height: 200px; border: 1px solid;">
<!-- 1つ目の画像用パラグラフ -->
<p style="position: absolute; top: 0; left: 0; width: 230px;
z-index: 2">
<img src="nin-tp.png" alt="Image of Nintaro" width="230" height="170">
</p>
<!-- 2つ目の文章用パラグラフ -->
<p style="position: absolute; top: 0; left: 0; width: 230px;">
この物語は、正義の味方忍太郎が難事件をばっさばっさと
解決するのを諦めていく様子を描いたものである。
</p>
</div>
この物語は、正義の味方忍太郎が難事件をばっさばっさと 解決するのを諦めていく様子を描いたものである。
pngのアルファチャンネルを解釈できないブラウザ(IE6以下)では、 画像だけしか見えない。
これを利用すると、position: fixed で固定させた要素ボックスを 回り込んで避けるようなレイアウトが作れる。たとえば、ユーザエージェントの ウィンドウの左上に5em×5emの大きさの固定要素を置いたとする。
div#menu { position: fixed; left: 0; top: 0; width: 5em; height: 5em; border: 1px solid; }
<body> <div id="menu"> <ul> <li> 玄関 <li> 趣味 <li> 勉強 </ul> </div> <div id="main"> <p>あーだこーだ、なんちゅーかほんちゅーか、すっとこどっこい....</p> </div> </body>
id="main"
のdivには、つぎつぎと本文を書いて行くことを想定
している。ただし、このまま本文を書くと、id="menu"
の
divと同じ位置から本文が始まるので重なって見えなくなってしまう。
あーだこーだ、なんちゅーかほんちゅーか、すっとこどっこい....
通常は、menuと重なるのを回避するために div#main の左マージンを div#menu の幅より大きくする。
div#main {margin-left: 6em;}
こうすることで、以下のように重ならなくなるのだが、
あーだこーだ、なんちゅーかほんちゅーか、すっとこどっこい....
左にあるちいさい枠部分はスクロールしても固定していると思ってね。
あれれれ、これれれ、
やっしょー
まかしょ
左が空いちゃってもうもったいないったらありゃしない。もったいないオバケが
出るぞぉぉぅ
左側に空いた6emの隙間は文書末まで続き、スペースの無駄となる。
これを float と階層化表示を使って、上手に div#menu だけ 回り込みで避けるようにしてみる。div#menu は position: absolute で あるから、通常のフローとは独立してしまう。したがって、これを回り込みで 避けるには div#main の中に div#menu と同じ大きさのブロックを 重ねて配置し、それを float: left にしておくとよい。ただし、重なり (z-index)を調整して div#menu の方が手前に来て読めるようにする。
div#menu {
position: fixed; left: 0; top: 0; width: 5em; height: 5em;
border: 1px solid; z-index: 2;
}
div#main div#uramenu {
/* div#menu のleft: 0; top: 0; に相当 */
margin-left: 0; margin-top: 0;
/* div#menu の大きさと揃える */
width: 5em; height: 5em;
/* 右と下のマージンは文章と接するので広めに取る */
margin-right: 1em; margin-bottom: 1em;
/* 次の本文が右に避けて行くよう、このフロートを 左に */
float: left;
}
こうしておいて、div#main の内部にからっぽの div#uramenu を配置する(該当部分のみ示す)。
<div id="main">
<div id="uramenu"></div>
<p>あーだこーだ、なんちゅーかほんちゅーか、すっとこどっこい....
〜〜中略〜〜
</p>
あーだこーだ、なんちゅーかほんちゅーか、すっとこどっこい....
あれれれ
これれれ
やっしょー
まかしょ
左が空いちゃってもうもったいないったらありゃしない。もったいないオバケが
出るぞぉぉぅ
実際に position: fixed; を用いて記述したページの
例を示す: ffz.html