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

コメントする