作成中のホームページで「ページトップへ戻る」リンクの下に、リンクを追加したところ、IE7、6でアンカーにhoverするとその親要素が伸び縮みするという不具合が起こりました。[サンプルページ1]

ソースは以下の通りです。(検証用のため、簡略化しています)

[htmlソース:sample1.htm]

<body>
	<div id="header" class="clearfix">
		<p>上のdiv要素</p>
		<p><a href="#header">上へ戻る</a></p>
		<p id="back"><a href="index.htm">戻る</a></p>
	</div>
	<div id="footer"><p>下のdiv要素</p></div>
</body>

[cssソース:sample1.css]

/*reset*/
* {margin: 0;padding: 0;}
div#header {
	background : #fee;
}
div#footer {
	background-color : #eef;
}
a:link , a:visited {
	background-color: #efe ;
}
a:hover {
	background-color: #eee ;
}
/*アンカー 前のページに戻る*/
p#back {
	margin-bottom :1em;
}
/* clearfix */
.clearfix:after {
	content: ".";
	display: block;
	height: 0;
	clear: both;
	visibility: hidden;
}
.clearfix {
	display: inline-table;
	min-height:1%;  /* for IE 7*/
}
/* Hides from IE-mac \*/
* html .clearfix { height: 1%; }
.clearfix { display: block; }
/* End hide from IE-mac */

googleで調べてみると、同じような不具合が見つかりました。アンカーを:hover状態にすると親ブロックの高さが変化する[『CSSバグ辞典スレッド』の要約](現在ページがなくなっているため、InternetArchiveへリンク)

しかし今回の不具合では、

  • ブロック要素の入れ子は2つ
  • 5番目の「内側から3番目のブロックに任意の幅を設定している。」という指定はない。(そもそも3番目のブロックが無い)

であるので条件に当てはまりません。

 

色々とためしてみたところ、clearfixを解除すると不具合は起こらなくなりました。

IEの場合clearfixは、hasLayout=tureにすることで実現しているので、hasLayoutが絡んでいるかもしれないと思い、検証用にサンプルファイルを作りました。[サンプルページ2]

[htmlソース:sample2.htm]

<body>
	<div id="header">
		<p>上のdiv要素</p>
		<p><a href="#header">上へ戻る</a></p>
		<p id="back"><a href="index.htm">戻る</a></p>
	</div>
	<div id="footer"><p>下のdiv要素</p></div>
</body>

[cssソース:sample2.css]

/*reset*/
* {margin: 0;padding: 0;}
div#header {
	background-color : #fee;
	zoom : 1;
}
div#footer {
	background-color : #eef;
}
a:link , a:visited {
	background-color: #efe ;
}
a:hover {
	background-color : #eee ;
}
/*アンカー 前のページに戻る*/
p#back {
	margin-bottom :1em;
}

上記の例でも、div要素が伸び縮みしました。
今回の不具合はhasLayout=tureにしたときの不具合だと思いますが、詳細は不明です。

対策

アンカー要素に指定しているmargin-bottom : 1empadding-bottom : 1emに変更して回避しました。