画像を右に配置して、左側にはテキストなり何なりを入れたりといったものを作る事が仕事上、よくあります。左画像、右テキストもしかり。仕事ごとに必ずこれは作る。さらに、この画像にはいろんなものが入るため、幅は常に変わる。

これを、divだけで作ることがなんとかできました。
こーいうものを作ろうとする時、CSSでやろうとすると、左右のブロックをfloat:right, leftとかやって配置しますが、これはあまり汎用性のある方法とはいえません。なんでかというと理由は3つ。
1つ目は、imgをfloatさせると、テキストがその下に回りこんでしまうというのが1点。回り込ませたいならいいですが、テキストを回り込ませないでやりたい場合が殆どなので。
2つ目は、回り込ませないでやるとしたら、左右のfloatさせたdivにwidthを指定しなければなりません。そうすると、例えば、画像の幅が200pxであれば、そのdivには200pxのwidthを、画像幅が300pxであれば、300pxのwidthをそのdivに指定しなければならなくなってしまう。これでは、画像の幅が異なるたびに左右に振り分けたのdivにwidthを指定しなければならなくなってしまうため、かなり面倒なことに・・・。
3つ目は、そもそもその種の方法では、リキッドレイアウトでは基本的にムリ。
やりたいのは、画像の横は10px空けて、残りをテキストの領域としたいといったようなこと。コレを実現する最も現実的な方法は、tableを使うこと。tableなら、伸びたり縮んだりするんで、画像じゃないセルのほうにwidth:100%なりを指定しておけば、テーブルレイアウトアルゴリズム上、画像の幅がどうだろうが関係ないはずですので。
<table>
<tr>
<td><img src="img.jpg" alt="" /></td>
<td width="100%">
<p>test test test test test</p>
</td>
</tr>
</table>
しかし、これは、マークアップ上、あまりやりたくないことです。
表でもないのにtableを使っているからです。本当であれば、tableは、表としてマークアップしたいものに使うべきです。画像ブロックは表ではないです。
<div class="ImgBlk R">
<div class="Img"><img src="img.jpg" alt="" /></div>
<div class="Txts">
<p>test test test test test </p>
</div>
</div>
<div class="ImgBlk L">
<div class="Img"><img src="img.jpg" alt="" /></div>
<div class="Txts">
<p>test test test test test </p>
</div>
</div>
これだけで実現できたらいいのに・・・と思ってたら、滅茶苦茶悩んだ末、なんとかできた。
CSSはとび先参照ですが、軽く解説すると、まず、display:table関係に対応しているSafari,firefox,Operaにはdisplay:tableを使って、divをtableだのtable-cellにして、テーブルと同様の効果を実現。しかし、IEは、7になってすらdisplay:table関係に対応していないため、IE8未満に対し、条件分岐コメントでfloatやhasLayoutの特性を利用し、同様の効果をどうにかこうにか実現させる。
これならIE8が出た場合、そいつらは当然、display:table関係に対応していないなんて馬鹿なことはありえないハズですので、現状のSafari, Firefox, Operaと同様の解釈がされるはずなので問題ないでしょうということです。
Safari2, Opera8.54, IE5.5、IE6, IE7, Firefox2で動作を確認。
ただ、expression()を使っているので、IE5.5, IE6, IE7でjavascriptがoffの環境では、キャプションが長くなると、その分、画像エリアの幅がでかくなってしまいます。Mac IEではだめでした。でも、ブロックが左右に分かれず、連続して並ぶ形になるので、情報の取得上問題は無いです。
hasLayoutって何?意味わかんないという場合はMSDNや以下のエントリを参照
条件分岐コメントって何?という場合は以下のエントリを参照
参考
かず 2007/11/10 (05:04)
はじめまして。
:first-child の対応状況などに関して検索していて
こちらにたどり着きました。
これまで、まさに導入部分で書かれていたように
いくつかの幅のボックスをあらかじめ作っておいて
画像に合わせて近いものを選択するという形で制作していたのですが
フレキシブルに追従してくれるのはやっぱりいいですね。
時間があいたときに色々と格闘してはいたのですが
結局主要ブラウザ全てで動作するモデルの制作は無理で
半ば諦めていました。
こちらの CSS を自分のテンプレートで
モジュールとして使用しても良いでしょうか。
#テンプレートそのものを配布するといった
用途ではありません
Takazudo 2007/11/10 (12:52)
かずさん、はじめまして。
もちろん使用可能です。というか、テンプレ配布でも可です。
ただ、気をつけて欲しいのは、これは100%動作を保障できるわけではないです。
会社で使ってみた人がいたのですが、expressionがたまーに動かないことがあって、javascriptエラーとしてでてしまうことがあるみたいです。このexpressionで書かれている内容は、onloadで行われるべき内容なので、たぶん、IE6が、ページ全体を読み込む前にexpressionを実行してしまい、エラーが起こることがあるっぽいです。
そもそもexpressionが実行されるタイミングっていつなんだろう・・・。
あと、このページで書かれているクラス名と、実際のテスト用のページのclassは、ちょっと違います。ちょっと書き換えました。
使用時にはご注意ください~
かず 2007/11/10 (04:17)
Takazudo さん、ありがとうございます。
動作とクラス名に関して了解いたしました。
自分なりに手をくわえつつ、
動作チェックしながら使っていきたいと思います。
(X)HTML / CSS はブラウザ対応も考えると、まるでパズルですね。
余裕がある時は、それが楽しくもありますが
差し迫ったときに「!?」となると泣きそうです。
bibo 2008/5/17 (10:40)
はじめまして。
幅可変ブロックを作りたいと思った時、こちらのソースがたいへん参考になりました。私のHPに自分なりに作ってみたソースを掲載しています。
これからも、いろいろ参考になる記事を楽しみにしています!
bibo 2008/5/17 (02:16)
はじめまして。
幅可変ブロックを作りたいと思った時、こちらのソースがたいへん参考になりました。私のHPに自分なりに作ってみたソースを掲載しています。
これからも、いろいろ参考になる記事を楽しみにしています!
Takazudo 2008/5/22 (02:27)
biboさんはじめまして。
このソースですが、もしかしたらIE8ではダメかもしれません。
IE8 beta1で見てみたら崩れていたので、また何か分かり次第エントリーポストいたします~
bibo 2008/5/26 (02:36)
IE Testerを使ってIE8 beta1で見たら、どうもdirection: rtl;が利いてないみたいですね。それよりIE8 beta1で自サイトを見たら、崩れている部分がありました。直した方がいいのか、正式なIE8が出るまで見なかったことにするのか。。。私みたいな人他にもたくさん出てくるんでしょうね。
Takazudo 2008/5/26 (11:25)
私のサイトもくずれまくりですよ~
今まで仕事で作ったのもかなり。ちとショックだなぁ~
とりあえず待ちかなって感じがしてます