1

静的な配置を持ちdiv、必要な各要素に対してリスト要素を含むがあります

  1. offset()メソッドを使用してその絶対位置を記録する
  2. 位置を に変更し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);「位置」オブジェクトに正しいオフセット座標が入力された後にのみブロックが実行されるようにするにはどうすればよいですか?

編集 私の場合、「オフセット()」ではなく「位置()」を使用する必要があることに気付きましたが、それは私が説明した問題を実際には変えません

4

1 に答える 1

3

兄弟要素の位置を変更すると、最初の要素の後.each()に間違った座標が取得される可能性があります。

変更する前にすべての位置を取得して保存してみませんか? つまり、子を2回繰り返す必要があります。

  1. 子を反復して位置を保存し、css を変更しないでください。
  2. 子をもう一度繰り返し、css を変更します。
于 2013-05-16T13:40:09.320 に答える