CSS使ってる時、ブロック要素を右寄せにしたいときはfloat:rightとかすると思います。
この時、imgとかをfloatさせたら、imgの幅分の幅が取られるのは当たり前なんですけど、divとかをfloatさせた時、その幅が、どのように決まるのかが、いまいちよく分かんなかった。そのdivにwidthが明確に指定されている場合は、その幅になるのは理解できるけど、何も指定していない時って、デフォルトだと、autoとして計算されますよね、divは。ふつーにdiv配置したら、幅一杯になるのと同じで。
例えばこー言うもののことです
em style="background:#b6dfa6;float:right"
ほらやっぱり幅一杯にはならない
しかし、floatさせた時は、明らかに、width:autoの働きをしてない。autoだったら幅一杯になるはずなのに、その要素の幅ギリギリにwidthが計算されているように見える。っていうかされている。いってみればテーブルのセルみたいな計算のされ方になっているでしょう明らかに。
コーディングする時は、floatさせた要素にはwidthも指定しないと危険だ!という認識がなんとなく自分の中であったけど、よく考えたら、なんで?って思ってきた。width無しにfloat:rightすると、右によって、頭についてる矢印をbackgroundで指定したりしていると、ちゃんと表示されているけど(例えばこのブログの下のほうにある、ページトップに戻る的なものです)、これって危なくねーか?幅一杯になっちゃう可能性あるんじゃないの?だってwidth:autoだし。という。
色々探してた結果、CSS2.1の仕様書にこんな風に載ってた。赤字のところ。
10.3.5 Floating, non-replaced elements
If 'margin-left', or 'margin-right' are computed as 'auto', their used value is '0'.
If 'width' is computed as 'auto', the used value is the "shrink-to-fit" width.
Calculation of the shrink-to-fit width is similar to calculating the width of a table cell using the automatic table layout algorithm. Roughly: calculate the preferred width by formatting the content without breaking lines other than where explicit line breaks occur, and also calculate the preferred minimum width, e.g., by trying all possible line breaks. CSS 2.1 does not define the exact algorithm. Thirdly, find the available width: in this case, this is the width of the containing block minus the used values of 'margin-left', 'border-left-width', 'padding-left', 'padding-right', 'border-right-width', 'margin-right', and the widths of any relevant scroll bars.
要するにどういうことかというと、floatにleft/rightが指定されており、なおかつwidthがautoであった場合、shrink-to-fit(フィットするように縮む)ということです。改行などが入らない限り、内包する要素の幅により、自動的に算出される、テーブルのセルのような幅になると、仕様書をみてたら見つけました。なるほどーではCSS2.1をちゃんと実装するであろう(まだWorkingDraft)ブラウザは何の考えもなしにfloatしても、その幅によって縮んでくれるというわけですな。だから、floatさせたやつの幅は自動的に縮むってことなのだ。
ちなみに、CSS2の仕様書には、この記述は無いため、実際あやふやぽい。こんだけしか書いてない。width:autoについては書いてない。
10.3.5 Floating, non-replaced elements
If 'left', 'right', 'width', 'margin-left', or 'margin-right' are specified as 'auto', their computed value is '0'.
ので、ちゃんと定義されているのはCSS2.1からなので、ちと怖くはあるけど、今後はそんなかんじで大丈夫ってことでしょう。たぶん。別に今使っても各ブラウザの動きは、CSS2.1で書かれてるみたいに振舞ってる気がします。というか、ブラウザの実装が先行してこんなかんじになったのかもしんないけど。ちなみに、position:absoluteで配置した要素も、この、shrink-to-fitされたものであるとCSS2.1にはかかれておりますなー。まーたしかにそんな感じになってる。ただ、おばかなMacIEでは、width指定してないfloatされた要素は、幅100%になり、びろーんと幅一杯に伸びる。