TAMA Networks 8BIT
OPERATOR

INDEPENDENT CREATIVE ARCHIVE / DARK TAMA AREA

TAMANetworks

多魔ネットワークス とあるエロゲ・ライターの自己満足サイト

PRIVATE NODE
amatsukami.jp

TAMA / TOKYO
NODE 042

ARCHIVE / NETWORK LOG

タグ: Javascript

FULL TEXT MODE

Webkit オンリーで組んでも……

スマフォの開発を相変わらずしているんだけど、今回の案件は別に PC で動作する必要はない。で、スマフォというと iOSAndroid が主流で、他のプラットフォームに関しては、ほぼ無視して良い(ゲームの場合の話ね)。となると、ボクが思ったのは「じゃぁ、Webkit に対応して作ればいっか」であった。
iOS に搭載されている Safari も、Android の Chrome も Webkit というレンダリング エンジンで作られているからだ(Chrome は Webkit からさらにフォークして Blink となった)。

ところが、けっこう iOS と Android で表示が違うんですな。
更に困ったのが Android の標準ブラウザ。
実は Android に最初からついてくるブラウザというのは Google Chrome ではない。なんでなのかというと、これはボクの予想でしかないのだが、Android デビューに Chrome は間に合わなかったからだと思われる。ちなみにエンジンは Webkit である。
Android 版の Chrome は Android のバージョンが 2.3 だか 2.4 だかくらいにようやくデビューした。なので Android には「標準ブラウザ」という、別のブラウザがずっとついてきている(Android 4.4 でようやく標準ブラウザが Chrome となった)。

この標準ブラウザがとにかくタコい。
まず Javascript の実行速度が圧倒的に遅い。そして HTML5 からついた修飾(ぼかしや縁取り、グラデーション)などの再現率が低い。特にぼかしがおかしい。

次に Safari。コイツのフォント処理はおかしい。とにかく文字の大きさが合わない。
なんだこれー!?
しかもバグがあって、Javascript で拡縮をやると正しい大きさにならないという……orz(CSS でも ZOOM を使うと同じ症状が出るらしい)
これが実に問題で、先の記事の CSS ピクセル問題で、CSS を書き直しせず、Javascript で最適な大きさに拡縮するという風に逃げたのだが、この Safari のバグのおかげで結局この方法は使えなくなってしまい、CSS を全面書き直さなければならなくなった。

だ、ダメすぎる……orz

だが今回、「ブラウザの場合分けはしない」というポリシーで組んでいる。これは別にボクの勝手なポリシーなんだけど。場合分けってのは何かっていうと、Safari だとこっちの処理、Chrome だとこっちの処理というようにブラウザことに処理をわけることだ。
CSS / HTML は一種類の定義ですべてのブラウザで通用するように書いた。まぁ、なんだかんだ言ってもレンダリング エンジンが一つだったというのが大きいだろう。これが PC だとこうは行かなかったと思う。

DOCTYPE め

rural_ay00m
うちのサイトなんかでもそうなんだけど、WordPress で CG を別ウィンドウで拡大表示できるプラグインがあるのね。これは元々有名な lightbox とかfancybox っていうライブラリをつかっている。で、コイツ、IE9 だと何故かちゃんと表示されないという現象が前々から起きていた。まー、とりあえずいいやって思ってはいたものの、設定によってはまったく表示されないこともあるので、ずっと原因を探っていた。

起きるトリガは、position: absolute。これをつかって座標指定してある要素内の画像(img)はすべて IE9 では正常に表示されない。

最初ソースを解析しようとしたんだけど、Javascript ってサイズを小さくするために、組んだあと難読化(改行とか削り、変数名も 1 文字とかにして、とことんバイト数を削っている)するのが常識なようで、とにかく解析するのが面倒くさい。って思ったら、本家のサイトに難読化する前のソースがあった(ぁ。
まぁそれを調べたりどしたりしていると IE9 だけ座標と画像のサイズが取ってこられてないことが判明。
なんだこりゃ??
というわけで、ネットを徘徊して調べるも多くは fancybox のバージョンを上げたら直りましたっていうのばっかり。いやそうじゃないんだ、と思いながら、ボクのサイトで座標指定して IE9 で開いてみたら普通に表示されたのね。

なんだって!?

ということはボクの組み方そのものが不味いのか?
っと WordPress のスキンを眺めたところ、目についたのが、DOCTYPE だ。こいつはその HTML ファイルが、どのバージョンの仕様にのとって作られているかを宣言している。

ボクは未だにレイアウトに table を使う。これはバッドノウハウなのだが、正直、ドット単位の細かな位置合わせって、ボクの組み方が悪いのだろうが CSS はめんどくさくてしようがない。その辺 table はわりと簡単にできてしまうので、ついつい table を頼ってしまうクセがあるのだ。
が、この table タグは今の HTML では推奨されない指定が存在するのだ。width とか height とか。これらを有効にするためには、DOCTYPE で古いバージョンの仕様であることを明示しなければならない。ところがこれは Javascript にも影響するようで、ちゃんと調べてないんだけど DOCTYPE によっては実行出来ない(?)ものがあるらしい。
IE10 とか Google Chrome はそんなの関係なく実行してくれているのだが、IE9 はこの DOCTYPE を忠実に守っていたらしい。なので、IE9 だけ座標と画像サイズの決定が出来ず、表示されなかったと言うことのようだ。
うがー!!! いつもアバウトな IE がなんでよりによって DOCTYPE 見てんのよ!!

というわけで、DOCTYPE をXHTML 1.0 に定義。でもそうすると、table でレイアウトしていた部分が使えない。なのでそこは、全部書き直して、XHTML 1.0 でもちゃんとレイアウトが整うように書き換え。ようやっと、fancybox で表示されるようになった。くそー IE9 めっ、貴様さえいなければ!!
曲はトルコのメタル・バンドらしい。