2012-02-29 10 views
0

DOMからelemntsを削除できる関数を作成しようとしていますが、私は解決できない問題に直面しています。jQuery:高さのジャンプ/シフトを伴うアニメーション

コードは次のようになります。

function closeMessage(message) { 
    var height = $(message).outerHeight(); 
    $(message).fadeTo("fast", 0.01).animate({marginTop: -height, marginBottom: 0}, function(){ 
     $(message).remove(); 
    }); 
} 

変数messageが削除される要素です。 CSSの中で私はmargin-topmargin-bottomをメッセージ要素に割り当てました。

上記の関数を実行すると、メッセージ要素は0.01%の不透明度(=ほとんど見えませんが、まだそこにあります)にフェードしてから、負のマージンがメッセージ要素の下の内容が上にスライドするという効果を作り出します。その後、コールバックでmessage-elementがDOMから削除されます。

メッセージエレメントの下のコンテンツは、小さなぎりぎりのように、最後の数ピクセルを上にジャンプするという問題があります。 1つ以上のメッセージボックスが存在する場合にのみ、このような現象が顕著になります。マージンが大きくなるほど、目立つようになります。あなたが見ることができるように、私はmarginBottom: 0で問題を解決しようとしましたが、うまくいきません。

また、outerHeight();,outherHeight(true);およびinnerHeight();のような異なるheight();の機能を試しましたが、それでも問題は解決しませんでした。

私の質問は:上記のコードに何か間違っていますか?なぜアニメーションの最終段階でその小さな「ジャンプ」がありますか?これは正常な動作ですか?

+0

あなたが作業例を供給することはできますか?私はちょうど2つのdivで簡単なページでそれをテストしました。一番上のものが取り除かれ、一番上のものが上に動く。 –

+0

実際のプロジェクトは内部的なものなのでリンクできませんが、ここでは例を作りました(http://jsfiddle.net/jDcaH/)。一番下のメッセージは必ず閉じてください。あなたが私に尋ねるなら、アニメーションは滑らかではありません。 – Sven

+0

ええ、あなたの例は、私にとってはうまくいきます。滑らかで、揺れはありません。 Firefox 10.0.2を使用していますが、どのブラウザを使用していますか? –

答えて

1

最初の問題はouterHeightがそれにtrueを通過することなく、アカウントの余白に入れていないということです。

var height = $(message).outerHeight(true); 
$(message).fadeTo("fast", 0.01).animate({marginTop: -height, marginBottom: 0}, function(){ 
    $(message).remove(); 
}); 

第二の問題は、CSSの定義によるということです隣接する要素の垂直マージンが崩壊します。つまり、下マージンは次の要素の上マージンと重なります。これにより、上下の余白のすべてが常に同じでない限り、計算がより困難になります。

編集:私が思うあなたが負のマージンや、本当に奇妙な何も持っていない限り、動作するはずです以下:

function closeMessage(message) { 
    var pBot = 0; 

    if ($(message).prev().length) { 
     pBot = parseInt($(message).prev().css('marginBottom')); 
    } 

    var height = $(message).outerHeight(); 
    $(message).fadeTo("fast", 0.01).animate({ 
     marginTop: -height-pBot+'px', 
     marginBottom: pBot+'px' 
    }, 'linear', function() { 
     $(message).remove(); 
    }); 
} 

これは、その上部余白を崩壊遠ざかっている要素になりますが、その上の要素のマージンを無効にし、要素の高さ(マージンなし)を引いて要素を「消える」ようにし、同時にその下のマージンを上の要素と同じに設定します。それは消える。それはうまくいくように見えます。次のものが自動的に処理されるので、前のマージンについて心配する必要があります。

例:何が起こっているかを確認するのに役立ちますhttp://jsfiddle.net/FxR9M/

私自身の例:http://jsfiddle.net/5PRy2/2/

+0

ありがとう、それは私の問題をほぼ解決しました。[こちらをご覧ください](http://jsfiddle.net/jDcaH/11/)。唯一の問題は、最後のボックスを閉じるときに、灰色のボックスがあまりにも上にスライドすることです。なぜ私は灰色のボックスに 'margin-top'が宣言されているのか理解できません。 – Sven

+0

それはそれより複雑です。 2つの項目の間の計算されたマージンは、最上位要素の下余白と最下位要素の上余白の最大値です。したがって、消えた要素の計算された上下のマージンと、上と下の要素の間の計算されたマージンがどのようになるかを知る必要があります。私はこれを単純化する方法を考えようとしています... –

+0

私はあなたが言っていることを理解しました。 jQueryの 'next();'と 'prev();'関数を使ってこれらのマージンを取得することは問題ありません。私はちょうど一緒にすぐにそれを取得しないでください。メッセージが1つしか残っていない場合は、ボックスの移動量を変更する必要がありますが、それは機能しません。 – Sven

0

jQueryアニメーション関数は、swingという既定のイージング関数を使用します。 「リニア」イージング機能を使用するようにコードを変更してみてください。

$(message).fadeTo("fast", 0.01).animate({marginTop: -height, marginBottom: 0},'linear', function(){ 
     $(message).remove(); 
    }); 

ドキュメントをチェックアウトhere

+0

お返事ありがとうございますが、私は問題を解決していないのではないかと心配しています。上記の例を確認できますか? – Sven

関連する問題