-
ID:n2rrCa さんの質問

CSSを学習中のものです。1点、よく理解出来ないところがありましたので、どなたか理解を深める為にお力を貸して頂けないでしょうか?

以下の#no2のwidthがfloatがついた#no1のwidth以下であった場合、#no2は#no1の下にブラウザー上で表示されます。

---------
| no1 |
| no2 |
---------

#no2のwidthが#no1のwidthよりも大きい場合は#no2の右側に#no2のコンテンツが回り込みますが、逆の場合は回り込みが起こらず、そのまま、下に表示されるようでした。

この時なのですが、no2にはclearを設定しておりませんが、no1とno2を囲っている#wrapperの高さもno1とno2の高さを含んだ高さに自動で調整されています。

no2にclear:bothを設定していれば、#wapperの高さがno1とno2の両方をふくむ高さになると思うのですが、なぜ、no2にclear:bothをかけてないのに、両方の高さを自動でふくんでくれるのでしょうか?

これは、floatをかけた要素の横幅よりもその後続のfloatをかけてない要素の横幅が小さい時は、その後続の要素にclear:both(or left or right)が自動でかかっているようなものだと解釈しておけば良いのでしょうか?

#wrapper {
background: orange;
border:1px solid gray;
}
#no1 {
float: left;
width:100px;
background: yellow;
}
#no2 {
width:100px; // 1以上100以下の値
background:red;
}

<div id="wrapper">
<div id="no1">1あああああああああああああ2</div>
<div id="no2">1あああああああああああああ2</div>
</div>

-----
追記1
-----
ブラウザーはmacのchrome最新バージョンとなります。

-----
追記2
-----

#no2にmargin-topを例えば20pxのような小さい値を入れても、#no1との間にマージンは生まれません。ただし、#no2のmargin-topに100pxくらいの大きめな値を入れてあげると、#no1との間にマージンが生まれます。

上記の表現は適切ではないですが、この現象は#no2にclear:bothのような回り込み解除の処理を行なった時に起こるものと同じです。
※no2のmargin-topがwrapperの包含ブロック上辺を起点に生まれていることは理解しております。

なので、floatを設定した要素の後続要素の幅が回り込みが行なわれないような小さい幅の場合は、clear:bothのような回り込み解除の処理がされているのと同じ状態になるのかなと感じたのですが、どういうことになるのでしょうか?

みんなの回答 5 件

ID:u306nr さんの回答

wrapperに関して言えばheightとoverflow指定しない限り高さは可変じゃ?

ところでno2の背景色が出ない理由とかは調べた?

ID:n2rrCa

no2の背景色は問題なく表示されていますね。

ID:n2rrCa

> wrapperに関して言えばheightとoverflow指定しない限り高さは可変じゃ?

そうですね。wrapperは可変となりますね。ただ#no1の方はfloat:leftがかかっているので、本来であれば#wrapperは#no1の高さを#wrapperの高さに含めないはずです。でも、#no2に今回、clear:bothのようなことをしていないのに#no1の高さを#wrapperの高さに含めているので、どういうことなのだろうという疑問があります。

ID:P0/7VH

どのブラウザで見てるんだろう。no2の背景色ってbackground: red;だよね。

ID:n2rrCa

chromeの最新版です。

ID:RoZpE6

「// 1以上100以下の値」がコメントアウトになってないんじゃないの?

ID:/KMCth

Mac10.9.4のSafariとFirefox、Chromeだと背景レッドは表示されないよ。
wrapperの背景オレンジが表示されてる。
width:100px;を外すと背景レッドが表示される。

ID:Zu9MdP さんの回答

clear:bothのような回り込み解除の処理はされてなくて
widthの関係で見た目上floatが効いてないように見えるだけでしょ
=ではないでしょ

ID:3HHmd0 さんの回答

まー、細かなことは気にしない方が良いよ。ここにいる人らも細かい仕様まで理解してないはずだし、説明出来ないと思うよ。

ID:RoZpE6 さんの回答

>>#no2のwidthが#no1のwidthよりも大きい場合は#no2の右側に#no2の・・・
これ「#no1の右側に#no2の・・・」の間違いだよね。

clear:bothを指定してない時は両方の高さで表示してるのではなく、#no2の高さで表示してるんだよ。
#no1のbackgroundを消した状態で、#no2のwidth:50px;ぐらいでclear:bothを指定したときと、指定を外した時を見比べてごらん。背景が伸びてる位置が違うだろ。
clear:bothが無い時は、wrapperの上辺が起点。途中にある#no1が邪魔だから、仕方なく下に伸びて表示されてるだけで、要素自体はwrapperの上辺からある。
clear:bothがある時は、あくまで#no1の下が起点。

ちゃんとclear:bothを指定しないと背景写真の上が#no1に隠れて見えなくなったり、#no2をリンクにしたら#no1をクリックしたのに#no2に飛んだり、色々おかしなことになるよ。

ID:RoZpE6

あ、clear:bothして#no1の下にある起点は#no2の「要素内」の起点だからね。marginじゃなくてpaddingで試して、marginとpadding違いを考えれば理解できるんじゃないかな。

ID:n2rrCa

ありがとうございます。実際にご指摘頂いたようにいじってみて理解が深まりました!ありがとうございました〜!!

ID:k06r.8 さんの回答

> #no2のwidthが#no1のwidthよりも大きい場合は#no2の右側に#no2のコンテンツが回り込みますが、逆の場合は回り込みが起こらず、そのまま、下に表示されるようでした。

下に表示されているのではなく回り込んでいるけど、#no1のほうが幅が大きくて上が見えない状態。
試しに#no2にposition:relativeとz-index:100とか指定すると回り込んでるのがわかる

> この時なのですが、no2にはclearを設定しておりませんが、no1とno2を囲っている#wrapperの高さもno1とno2の高さを含んだ高さに自動で調整されています。

#no1と#no2に文字が入っているから、文字の高さを出してるだけだと思う。
margin-topもその関係では。
試しに文字を消して、#no1も#no2もheight:50pxとかにすると、#no1を無視して#no2が左詰めになる(#wrapperの高さは50pxになる)はず

関係ないけどCSS Lintによるとセレクタの指定はidじゃなくてclassのほうがいいと思う

最終更新日:2014-08-22 (2,333 views)

関連するトピックス

ページ上部に戻る