CSSで"position"というプロパティがあるが、これはボックスを配置する時の基準位置を決める為のプロパティだ。
'static'、'relative'、'absolute'、'fixed'というプロパティ値がある。
ここを'static'以外の値にした時に今度は'top'、'right'、'bottom'、'left'というプロパティを指定できるようになる。

具体的な指定方法は

elem {
    position: relative;
    top: 10px;
    left: 10px;
}

と、こんな感じだが、例えば"position"プロパティだけを指定してその他の(topやleft等)プロパティを指定しなかった時はどうなるか?
実際は0が適用されて"position"プロパティに"relative"を指定しているだけなら何も指定していないのと表示上は全く変わらない。

Javascriptで要素をドラッグするようなスクリプトを書く時、その要素の"position"プロパティは'static以外'にしなければいけない。
そこで"position"プロパティだけを指定して"top"や"left"を指定していないとちょっと困った事が起きる。

FirefoxやOperaでは

parseInt(elem.getStyle('top'));

とした時はたとえ"top"や"left"を指定していなくともデフォルトの数値を返してくれる。
prototype.jsは使わずに

parseInt(getComputedStyle(elem, '').getPropertyValue('top'));

とした時も同様だ。
なので

var top = parseInt(elem.getStyle('top'));

とすれば変数topにはそのときの(要素の)Y座標が入っていると考えてもいい。
ところがSafariでは

elem.getStyle('top');

を実行しても'null'が返ってきてしまう。

var top = parseInt(elem.getStyle('top'));

これを実行したときは'NaN'だ。
数値が入っているものだと思ってその後、変数topに対しあれやこれや計算をしても当然うまくいかない。

なのでそんな時はあらかじめCSS側で

elem {
    position: relative;
    top: 0px;
    left: 0px;
}

としておくかJavascript側で

var top = (isNaN(parseInt(elem.getStyle('top'))) ? 0 : parseInt(elem.getStyle('top')));

とする。

カテゴリ:

トラックバック(0)

トラックバックURL: http://blog.beanz-net.jp/beanz_mtos/mt-tb.cgi/44

コメントする