Firefoxのテーブル印刷バグ(?)

FirefoxはおおむねきちんとしたCSS解釈をしてくれるのだが、印刷エンジンがかなり頑固だ。Fx2の頃からある問題のようだが、現象としては
・巨大なテーブルを印刷する際ページをまたいで印刷されない(次のページにまたがる部分は消える)
・position:relative;やoverflow:auto;の要素がページをまたいで印刷されない
というもの。
(※テーブルを入れ子にしていても同様の症状が出るらしい)
“Firefoxのテーブル印刷バグ(?)” の続きを読む

Thickbox3.1 + IE でInline Contentが上にズレてしまう

jQuery上で動くLightbox風プラグインであるところのThickbox(軽くて高機能で好き。このブログでも使用中)なんですが、画像だけでなく外部htmlなんかもLightbox風に表示できます。大変便利。(ただし呼ぶhtmlはUTF-8が推奨のようです。)

jQuery上で動くのでだいたいどのブラウザでも問題なく動いていたんですが、インラインコンテンツに適用しIE7でクリックしたら上の方に残ってしまっていました。position指定がバッティングでもしたかと思ったんですが、こちらの記述を見るとthickboxリンクを設置したhtmlの先頭で正しくxml宣言とDOCTYPE宣言をしないといけないらしい。よく見ると、HTML 4.01になってた。

実際にはXML宣言ではなくDOCTYPE宣言のほうが大事みたい。
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
ではだめで、
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
で正常動作します。

IEのCSSバグ:floatさせた画像の左側に空白ができる

IE7になってマシになったと思っていたんだけど、ちょっとコーディングするとまだバグにぶつかるなあ。
今回ぶつかったのは画像をフロートさせた場合に左側に3pxのマージンが発生するというもの。フロート要素のマージンが倍で計算されるというのはよく出会うがこれは初めてなのか、今まで気づかなかったのか。
InternetExplorerWinBugsにある、”IE may add unwanted space in several circumstances” の亜種と思われる。

リストに関しては対処法として margin-left:-3px とするとあるが、これだとimgごとfloatさせてギチギチに詰めている場合などに不具合がある。
たとえば
<img src="./images/gazou.jpg" style="float:left;width:200px;height:230px;_margin-left:-3px" />
などとするのはフロートしているブロックが実質203pxになってしまう。かといって _width:197px; などとすると画像のwidthが変わってしまって都合が悪い。(アンダーバーはIEのみに通るhack CSS表記)

要するにCSSをimgに使わなければいいことなので、imgをdivで囲い、そちらにCSS指定を移すことで回避できる。

<div style="float:left;width:200px;height:230px;">
<img src="./images/gazou.jpg" width="200" height="230" />
</div>

IE6でflashの下にある要素が上に出てしまう

flashのembedとかselectにはz-indexが作用しなくて、flashが上に出てきてしまうという話はよく目にするのですが、今回はその逆でembedしたflashが上にでないで困ったという話

<div id="bigdiv">
<div id="leftdiv">画像</div>
<div id="rightdiv">画像</div>
<div id="flashdiv">flash</div>
</div>

おおざっぱに書くとこんな感じで、bigdivは画像二つを横に並べた大きさで、
position=relative
が設定してあり
leftdivとrightdivはそのままなりゆきでfloat、その後にflashをposition=absoluteでbigdivを基準に(bigdivと同じサイズで)top leftを0 0で描画する。flashにはtransparentで透過処理をしてあるので下にある写真二枚をカバーするようなflashだ。MozillaやIE7では正しく出るのだが、IE6では出ない。IE6っていまだにシェアトップを譲らないので無視できないのが悲しいところ。みんなはやく騙されてIE7にしてほしい。
結果から言うとこのバグにひっかかっていただけなんだけど、まさかfloatが原因とは思わず(ずっとz-index問題だと思っていた)ひさびさにハマりました。あ、このときもう一回IEでレイヤーの透過処理をfilter:opacityでやったときに黒が部分的に抜ける(opacityが問答無用で0になってしまう)という恐ろしいバグにも出会った。IE6と7で出て、海外のサイトで似たような症例を見たが報告例は少ないようだ。これはimage::magickで生成している画像にガンマ値補正を1.5ずつかけるという後ろ向きの対処でなんとかなった。
話がそれました。冒頭のバグの対処法は「下に入っているleftdiv、rightdivもabsoluteで配置」でした。これならfloatを指定したままでも問題ないです。そのfloatに意味があるのはさておき。

あ、あとこの仕事では、liタグの高さがある一定のheight以下では制御できず、liの中身に何も入っていなくてもline-heightを指定しないと無駄なマージン(実際はliのheightが下がっていないだけ)が出るというのもあったな・・・
しかしこうして見てみると今回IEバグ引きすぎ。これはこれと関係ありそうだけどIE7でも出た。こういうあからさまな間違いをいつまで経っても直さないで放置するから、CSSを書く人はIEを嫌いにもなります。Firefoxにももちろんバグはあるけれど、間違いを正そうという努力が見てとれるだけマシというもの。

’08 7 20追記
photoshuffler.jsを上記のleftdiv・rightdivと画像部で使っているとき、以下のような処理が行われているのだが
1・最初に配置されている画像読む
2・divのバックグラウンドに次の画像を読む
3・前面のimgをフェードアウト
4・0になったらバックグラウンドをimgに置き換えてopacity100%
・・・以下2以降を繰り返し
どうもこのときにIE6と7ではimgが1ドット下にずれて表示される。Photoshufflerはスライドショーのjsなので、3から4の処理に入るときにガクっとずれることになる。原因は不明。floatにしなくても出るので上記のバグとは関係ないか、バグの原因がさらに深い部分にあるのか。原因はわからないながらimgに縦横の値を設定し、display:blockを指定するとこのバグは解消した。