静的な配置を持ちdiv
、必要な各要素に対してリスト要素を含むがあります
offset()
メソッドを使用してその絶対位置を記録する- 位置を に変更し
absolute
、別の場所に移動してから、記録された座標を使用して元の位置に戻します。
最初にこれを試しました:
var positions = {};
myDiv.children().each(function(){
var child = $(this);
var id = child.attr('id');
var offset = child.offset();
positions[id] = [offset.left, offset.top];
child .css('position', 'absolute');
var x = ...;
var y = ...;
child.css('left', x);
child.css('top', y);
});
console.log(positions);
この場合、'positions' オブジェクトのすべてのエントリは同じ座標 (最初の要素の値) を持ちます。ただし、要素を移動するビットをコメントアウトすると、positions
オブジェクトは各子の正しい座標を持ちます。
css
関数が終了する前に関数が呼び出されるため、同期の問題だと思いoffset
ます。
したがって、私が本当に必要としているのはchild.css('left', x); child.css('top', y);
、「オフセット」機能が完了したときにのみブロックが実行されるようにすることです。
私は次のようなことを試しました
$.queue(child, 'foo', function() {
var offset = $(this).offset();
positions[id] = [offset.left, offset.top];
jQuery.dequeue(this);
});
$.dequeue(child, 'foo');
child.promise().done(function() {
child.css('position', 'absolute');
...
});
しかし、運が悪い:positions
オブジェクトをログに記録すると、まだ座標が間違っています。
私はJSとJQueryにまったく慣れていないので、ここで正しいことをする方法を確信しています.
child.css('left', x); child.css('top', y);
「位置」オブジェクトに正しいオフセット座標が入力された後にのみブロックが実行されるようにするにはどうすればよいですか?
編集 私の場合、「オフセット()」ではなく「位置()」を使用する必要があることに気付きましたが、それは私が説明した問題を実際には変えません