同じマークアップで結果が違う

[新着] Webテンプレートを仮オープンしました



0   名前: ひな : 2007/02/17(土) 08:50  ID:n9X14Bjg sub-gZ
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML lang="ja-JP">
<head>
<link rel=stylesheet href="style.css" type="text/css" media="all">
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>たいとる</title>
</head>
<body>
<h1>大見出し</h1>

<h2>1.中見出し</h2>
<div class="text"><h3>小見出し</h3><p>あああああ</p></div>
<div class="text"><h3>小見出し</h3><p>あああああ</p></div>

<h2>2.中見出し</h2>
<div class="text"><h3>小見出し</h3><p>あああああ</p></div>
<div class="text"><h3>小見出し</h3><p>あああああ</p></div>
</body>
</html>

style.css
h1{
color:#d62418;
padding:20px;
}

.text{
float:left;
margin:20px 5px 0;
width:40%;
border:#dbdbdb solid 2px;
}

h2{
clear:both;
background:url(e.gif) no-repeat 50% 0;
padding:80px 0 10px 0;
margin-top:30px;
}

IEは6で確認するとh2 中見出しが最初と2度目と表示が異なります。
OperaとFireFoxは問題ありません。

e.gifの間が間延びします。
実験の結果、floatを外すと同じ表示になるようですが、段組したいので、困っています。
IEでも他のブラウザと同じ用になる方法を教えて下さい。
よろしくお願いします。

1   名前: key-child : 2007/02/17(土) 08:50  ID:8GUFlW2K sub-DR
構造を少々変更しましたが、よかったかな?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja" dir="ltr">

<head>
 <meta http-equiv="content-type" content="text/html;charset=shift_jis">
 <title>Test HTML</title>

 <meta http-equiv="content-style-type" content="text/css;charset=shift_jis">
 <style>
<!--

h1{
 color: #d62418;
 padding: 20px;
}

.text {
 width: 100%;    /* textクラス確保の為 */
 overflow: auto; /* textクラス確保の為 */
 clear: both;    /* 移動 */
}
.text div{       /* 旧textクラス */
 width: 40%;
 float: left;
 margin: 20px 5px 0;
 overflow: auto;
 border: #dbdbdb solid 2px;
}

h2{
 margin-top: 30px;
 padding: 80px 0 10px 0;
 background: url(e.gif) no-repeat 50% 0;
}

-->
 </style>

</head>

<body>

<h1>大見出し</h1>

<div class="text">
 <h2>1.中見出し</h2>
 <div><h3>小見出し</h3><p>あああああ</p></div>
 <div><h3>小見出し</h3><p>あああああ</p></div>
</div>

<div class="text">
 <h2>2.中見出し</h2>
 <div><h3>小見出し</h3><p>あああああ</p></div>
 <div><h3>小見出し</h3><p>あああああ</p></div>
</div>

</body>

</html>

2   名前: ひな : 2007/02/17(土) 08:50  ID:n9X14Bjg sub-gZ
構造変えられません。リニューアルで、htmlには手を着けられないからです。ハックでも何でもいいから……、か、このデザイン諦めるか、IEユーザー無視かになる。

問題を最小限に切るとるために、出していませんが、大見出しより下は、全体をdivクラスで囲んでいます。それとは別に参考文献クラスが全く違うデザインで、その下に入っています。既存のクラスの利用は可です。

せっかく教えてくれたのにごめんね。ありがとう。
引き続きよろしくお願いします。

3   名前: K+S : 2007/02/17(土) 08:50  ID:nROqylMa sub-YS
問題と理想形が把握できません。
質問内容が理解できれば回答できるかもしれません。

4   名前: ひな : 2007/02/17(土) 08:50  ID:n9X14Bjg sub-gZ
>>3
K+S さん へ
h2の中見出しが 1. と2. では同じマークアップにしているつもりですが、
1.では、問題ないのですが、2.では e.gifの後に、妙な空間が入り、変に間延びしています。

FireFoxやOperaでは問題なく表示されています。
問題は、IEでのみ、妙な空間が入り込みます。
理想は、それを1.で表示されるのと同じにする事です。

よろしくお願いします。

5   名前: Z ◆XTzyosZXcL : 2007/02/17(土) 08:50  ID:wMpJdqee sub-Cl
>>4
 文書型宣言をシステム識別子ありにしたら、レンダリングが統一できそうな気がするのですがいかがでしょうか。

参考・BOXモデルとDOCTYPEスイッチ:
http://www.geocities.jp/multi_column/float/02.html

参考・複数のレンダリングモード(Mozilla):
http://www.mozilla.gr.jp/standards/webtips0014.html

参考・システム識別子について:
http://www.kanzaki.com/docs/html/doctype.html#systemid

6   名前: K+S : 2007/02/17(土) 08:50  ID:nROqylMa sub-YS
>>4
問題は把握しました。

ただ、相変わらず理想形が把握できません。
ここでいう理想形とは、問題に関わらずあなたが実現したいレイアウト等のことです。
理想形さえ分かればCSSを抜本的に改編することで改善(実現)するという手もあります。
問題を解消することで実現するのも手ですが…。

>>4-5
ということで検証してみたのですが、
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja" dir="ltr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
	<meta http-equiv="Content-Language" content="ja">
	<meta http-equiv="Content-Style-Type" content="text/css">
	<meta http-equiv="Content-Script-Type" content="text/javascript">
	<title>タイトル</title>
	<style type="text/css">
* {
	margin:0;
	padding:0
}
#second{
	float:left;
	width:99%;
	background-color:#ccf;
}
#first,
#third {
	clear:both;
	padding-top:30px;
	border:2px solid #fcc;
	background-color:#cfc;
}
	</style>
</head>
<body>
<div id="first">first</div>
<div id="second">second</div>
<div id="third">third</div>
</body>
</html>
計算結果が100%未満となる幅を持つボックスのフロート(直下ではなく)直後のボックスで clear を行い、
そのボックスの padding-top が正の値のときに、そのボックスに背景(background, background-color)が指定されていると発生するバグのようです。
DTDは特に関係ないようです。
WinIE6.0で確認しました。

これについては私は扱ったことがないので更に検証してみたのですが、具体的な解消法は今のところ分かりませんでした。
この症状について検索して調べていないので、もしかしたら簡単に詳細な条件と解消法見つかるかもしれませんが…。

7   名前: key-child : 2007/02/17(土) 08:50  ID:cFiaDnvJ sub-bK
> リニューアルで、htmlには手を着けられないからです。
だと無理だと思います。

textクラスをfloatしていると、「2.のh2」のmargin-topは「1.のh2」に対して取ります。
textクラスに対してではありません。
なので、「OperaとFireFoxは問題ありません。」と書いてますが、「2.のh2」のmargin-topは取られて無いように見えます。
(h1, h2に背景色を付けてみるとわかる)

h2のmargin-topを増やすことにより間延びはなくなりました。
(上のtextクラスのheightよりmargin-topを高くする)
つまり、領域をそれぞれきちんと確保できれば解消すると思われます。

まったくhtmlに手を入れられないなら、現在の構造で考えると、
新たにfloatするのはほぼ無理だと思った方がいい気がします。
そもそも、まったくhtmlに手を入れずにデザインをリニューアルするには限界があるような気がする・・・

8   名前: Z ◆XTzyosZXcL : 2007/02/17(土) 08:50  ID:wMpJdqee sub-Cl
>>6
 なるほど。では下記が関連資料となりそうですね。

CSS対応状況表(ボックス):
http://hp.vector.co.jp/authors/VA022006/css/corrbrwser/box.html

#全称セレクタやスターハックを使ったほうがよさそうな気がしてきました(^^;

関連スレッド:http://www.tagindex.com/cgi-lib/q3bbs/patio.cgi?mode=view&no=508

9   名前: 匿名 : 2007/02/17(土) 08:50  ID:rEkc4Z1y sub-kJ
>>8
その資料と今回の件との関連は、あまりないような気が。


確認してみた。結論から言えば、>>6 も >>7 も正しいと思う。

まず前置きだが、{ float: left; } の動作を確認しよう。

・浮動ボックスは、まず通常フローで配置された上で、左に移動する。
・浮動ボックスの右に余白があれば、インラインボックスは回り込み配置される。
・浮動ボックスの前後のブロックボックスは、浮動ボックスが存在しないかのように垂直配置される。

重要なのは最後の項目。つまり、>>0 のソースでは、div.text が存在しないかのように、h2 が垂直配置される。その結果、h2〜h2 の間には h2 { margin-top: 30px; } 分の余白のみ残される。

ところが、h2 は { clear: left; } も持つ。これは何をするものかと言えば、

・そのボックスの左側に、浮動ボックスが配置されないようにする。
・このとき、そのボックスの margin-top が浮動ボックスのはみ出し分を埋められない場合、必要な分だけ margin-top を埋める。

ゆえに、div.text の高さが、h2 の margin-top(= 30px)よりも大きい場合(以下、これを【状況 A】と呼ぶ)、h2 は div.text の真下に余白 0 で置かれる。


さて、前置きが長かったが、IE6 は【状況 A】で、かつ >>6 の条件を満たしたときに、margin-top だけでなく padding-top まで加算している気がする(2 倍?)。一方、【状況 A】ではない場合(つまり、div.text の高さよりも h2 の margin-top の方が大きい場合)、>>7 の言うようにこの現象は生じない。

従って、

(i). 常に【状況 A】を避ける(>>7)。
(ii). >>6 の条件のどれかを避ける。

どちらかが可能なら何とかなる。

(i) に関して補足すると、CSS2 および各種ハックの範囲内で対処するなら、div.text の高さを決め打ちするしかないと思う。もしスクリプトを使って良いなら、IE 独自拡張の expression() や behavior などを使って、div.text の offsetHeight を監視し、h2 の margin-top を動的に変更してやれば良い。かなり重いが。

10   名前: ひな : 2007/02/17(土) 08:50  ID:n9X14Bjg sub-gZ
みなさん、ありがとうございます。
ちょっと、消化不良です。floatを何か根本的に勘違いしているようです。これまでも、縦方向の空間調整が苦手でした。

で、最終的に9さんの解説をヒントに、h2にwidth:100%を与えてみたら、上手くいきました。背景に色を与えて見ると、IE以外は思ったようになっていませんがhtmlは弄れないので、背景は与えないデザインでOKと言うことにします。

抜本的な解決ではありませんが、floatをもう少し勉強して、このもやもやを何とかしたら、背景色も与えた上で縦方向の空間も思い通りにできる道がおぼろげながら見えてきた気がします。floatの正体と現実を正しくわかりやすく説明されている資料がありましたら、教えて下さい。

よろしくお願いします。

11   名前: Z ◆XTzyosZXcL : 2007/02/17(土) 08:50  ID:wMpJdqee sub-Cl
>>9
>その資料と今回の件との関連は、あまりないような気が。
 失礼しました。こちらですよね(自信がなくなっちゃいましたが)(^^;。

CSS対応状況表(視覚整形):
http://hp.vector.co.jp/authors/VA022006/css/corrbrwser/visualren.html

>>10
>floatの正体と現実を正しくわかりやすく説明されている資料
 神崎正英氏の「セオリー・オブ・スタイルシート」(技術評論社)がよろしいのではないかと思います。

スタイルの設計とCSS 2.1:詳細目次(神崎氏Webサイトにおける公開資料))
http://www.kanzaki.com/book/css/toc-detail.html

12   名前: Z ◆XTzyosZXcL : 2007/02/17(土) 08:50  ID:wMpJdqee sub-Cl
 あと、>>5の資料で言うなら「基礎編」の5.(フロートの性質)〜7.(段組が崩れるのを防ぐ)が該当するかと思います。

CSSによる段組(マルチカラム)レイアウト講座:
http://www.geocities.jp/multi_column/index.html

13   名前: 匿名 : 2007/02/17(土) 08:50  ID:rEkc4Z1y sub-kJ
>>10
抜本的な解決策でなくても良いなら、h2 の height を決め打ちすれば、IE6 の症状は生じない。ただ、おそらく意図するデザインとは微妙に異なると思うので、>>9 では触れなかった。

症状は症状と割り切って、IE6 のみ「広がった方」に合わせてデザインして良いかもしれない。おそらく、大部分の利用者は h2 の高さの違いなど気付かないと思う。

なお、>>9 に書いた規則は、>>11 の資料の中の
http://www.kanzaki.com/book/css/3-2.html
特に「3.2.2.2 浮動化の整形規則」、「3.2.4.2 clearとmargin」に図入りで解説されている。

14   名前: ひな : 2007/02/17(土) 08:50  ID:n9X14Bjg sub-gZ
Zさん
資料、ありがとうございました。勉強してみます。

皆さん
いろいろ、ヒントを有難うございました。おかげで、一応のことができました。

15   名前: 匿名 : 2007/02/17(土) 08:50  ID:rEkc4Z1y sub-kJ
書き忘れ。

>>10
> h2にwidth:100%を与えてみたら、上手くいきました。

こちらも確認した。なるほど感謝。なお、この対処法ついては >>12 の中の http://www.geocities.jp/multi_column/float/07.html でも触れられていた。
WinIE では float や clear を指定したボックスのマージンやボーダー、ボックス内の文字や背景色に関するバグがいくつもあります。対処法のひとつは、ボックスに width を指定することです。
そろそろ、IE6 のサポートも打ち切りたい所だ(暴言)。

16   名前: ひな : 2007/02/17(土) 08:50  ID:n9X14Bjg sub-gZ
>>13
入れ違いでしたね。
今回は、お世話になりました。heightはリキッドで、2行になる可能性があるので、控えてます。でも、そんな感じになればいいので、heightもやってみて直感で判る方を採用しますね。そのうち、サイト構造を弄る事になりそうな、1から組んだ方が早いような。そんな、量じゃないような……。

>>11の資料見たら、症状は症状として割り切るしかないです。現実のサイトも、それぞれのブラウザで微妙に違うのですが、ブラウザごとに意味の破綻はしていないので、まぁ、いいかって感じでこだわっていません。今回はちょっと空き過ぎて困ったので相談しました。

また、勉強して、煮詰まったら質問します。そのときはよろしくお願いします。

一覧へ戻る