Apr 11, 2007

XULとインラインフレームと重ね合わせ

Split BrowserGoogle Notebook Extensionがコンフリクトしてるという報告を受けて調べてみた結果のメモ。

XULでは、というかGeckoでは、iframeもbrowserも、インラインフレームについてはCSSのz-indexプロパティの指定とは関係なく、一番最後に描画されたものが一番上に表示されるようになっている。たぶんバグなんだけど、長年そのままになってるから、仕様ということになってるのかもしれない。

Google Notebook Extensionはウィンドウ内にインラインフレームを生成して絶対配置でメインのブラウザ領域の上に重ねて表示してるんだけど、Split Browserで新しいブラウザ領域を追加すると、それがGoogle Notebook Extensionのフレームよりも上に描画されてしまう、というのが問題の現象だ。この問題は分割後の領域でタブを切り替えた際にも発生する。

Google Notebook Extensionのデフォルトの挙動を調べてみると、メインのブラウザ領域については、タブを切り替える度にGoogle Notebook Extensionのフレームを表示し直すようになっていることが分かった。つまりこれと同様に、Split Browserでブラウズ領域を分割した時と、それらの領域内でタブを切り替えたときにも、Google Notebook Extensionのフレームを表示し直してやればいいということになる。

ただ、検証中にさらにもう一つ問題が発覚した。deck要素で内容を切り替えた部分と重なるGoogle Notebook Extensionの領域が白く抜けて描画されてしまうというものだ。deckを使わないようにすればどうにかなりそうなんだけど、そうするとツールバーの高さがガタついてしまうので、どうしたらよいか悩んでいる。

追記。deckの問題については、stackとCSSのvisibilityプロパティを使うことで解決することにした。CSSのvisibility: hiddenは、その要素が存在するべき位置に空白の領域を残した状態で、その要素を見えなくする指定だ。stackで重ね合わせた要素に対してこの指定を適宜与えてやれば、つまり、今表示するべき内容だけvisibility: visibleにして、それ以外をすべてvisibility: hiddenにしてやれば、stackでdeckのようなことができるようになる。

まあ、あまり意味の無いテクニックだと思うけど、いちおうメモしておこう。

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能