Rewish

ウェブデザイン、XHTML、CSS、PHP、WordPress、Movable Typeなど、Web制作で役立つかも知れないBlog.

包容要素にoverflow:hidden;を使う際の注意点メモ

カテゴリー
(X)HTML/CSS
タグ
Coding

高さの異なるカラムを揃えるスタイルシートで包容要素にoverflow:hidden;を指定する際、その中身に対してページ内リンクを使うと移動された部分より上が非表示になります。

具体的な内容は以下に記します。

HTMLサンプル

<div id="wrap">
	<div id="main">
		<div id="section1">
			<!-- 内容 -->
		</section>
		<div id="section2">
			<!-- 内容 -->
		</section>
	</section>

	<div id="navi">
		<p><a href="#section2">第二セクション</a></p>
	</section>
</section>

CSSサンプル

div#wrap {
	width: 750px;
	margin: 0 auto;
	overflow: hidden;
}

div#main {
	float: right;
	width: 550px;
}
	div#section1 {
		background: #FCC;
		height: 500px;	/* 消える領域表現の為の高さ */
	}
	div#section2 {
		background: #CCF;
		height: 500px;	/* デモなので中身無しで高さだけ */
	}

div#navi {
	float: left;
	width: 200px;
	margin-bottom: -32768px;	/* 高さを揃える */
	padding-bottom: 32768px;
	background: #CFC;
}

デモと補足

デモページ

ちょっとデモ用に要らない部分を付け足しすぎた感がありますが、そんなに難しい内容では無いので消えることだけ覚えておいて下さい。

Firefox2.0 , Safari3.1 , IE6 , IE7 で消える現象を確認。

※04/16 09:15 修正 : デモページのstyle内のコメントアウトが正しく無かったため、IEとOperaで表示出来ない不具合を修正しました。ご指摘感謝いたします。

原因

何故消えるのか、それは仕様(wuさんのコメント参照)だからです。

厳密に言うと、overflow:hidden;と言うより、下方向に指定されたパディングとネガティブマージンによる overflow:hiddenで隠れているけど存在する領域 の問題なので、包容要素にoverflow:hidden;を指定しただけでは消えることはありません。

※この問題に対する画期的な回避方法は特にありませんが、IEではdiv#mainとdiv#naviにzoom:1;を指定することで回避出来たりします。

まとめ

どうしてもページ内リンクを使いたい場合は、カラムの高さ合わせには包容要素に背景を指定する方法など、従来どおりのいわゆる正攻法を使う。

仕様を理解してても、横着するとたまにやってしまったりするかも。なメモ。

※04/17 16:47 修正 : 一部誤解を招く箇所があった為、加筆修正しました。