Prototype.jsを使っていてちょっと悩んだ事があった。
下記のようなごくごく単純なHTMLがあったとして
<body> <img id="item" src="images/image.jpg" /> </body>
それに対して以下のようなスタイルが適用されている
#item { position: absolute; top: 100px; left: 100px; }
さらにjavascript(Prototype.jsを使い)で
Event.observe(window, 'load', function(event) { alert($('item').getStyle('left')); });
と、読み込みが完了した時点でアラートを表示させているが当然これは『100px』と表示される。
ここまでは何の問題もない。ただしちょっとスタイル下記のようにをいじってみて、
#item { position: absolute; top: 100px; left: 100px; border: 10px solid #CCC; }
同じように実行するとなぜかOperaでだけ『80px』と表示されてしまう。足されたボーダーのwidth分だけ引かれてしまっている。
さらにスタイルをいじり
#item { position: absolute; top: 100px; left: 100px; border: 10px solid #CCC; padding: 10px; }
こうすると今度は『60px』と表示され、padding分まで引かれてしまった。
このままこの数値を元にドラッグの処理などを実装していくとOperaでだけ挙動がおかしくなってしまう。
とはいえ、簡単な解決方法があった。一つは
$('item').getStyle('left');
のところを
document.defaultView.getComputedStyle($('item'), null)['left'];
と、Prototypeのメソッドを使わずネイティブのgetComputedStyleメソッドを使うだけで正常な値を得る事ができる(ただし、今度はIEでうまくいかなくなる、なのでブラウザを判別する処理が必要になってしまう)。
もしくは、要素を内包している要素、この場合は『body』に対して『position』プロパティを設定してあげれば
body { position: relative; #static以外にする }
うまくいく。こっちの方が簡単だ。
カテゴリ:
トラックバック(0)
トラックバックURL: http://blog.beanz-net.jp/beanz_mtos/mt-tb.cgi/77
コメントする