アニメーションをスローモーション (非常に長い時間) にすると、実際には div の下部が実際に 1 ピクセル上に移動することがわかります。これが揺れの原因です。スタイル インスペクタで見ると、jQuery が div の各位置プロパティを 10 進数に設定していることがわかります。これらの 10 進数の 1 つが整数を通過するたびに、実際には div の位置が変化します。頂点と高さは必ずしも同時に整数を通過するとは限らないため、揺れが発生します。一方、左と幅は常に整数を同時に渡すように見えますが、そうであるかどうかはわかりません。いずれにせよ、横揺れは判別できませんでした。
どうやらChromeは位置プロパティの小数を切り捨てていますが、他のブラウザは浮動小数点演算を使用して、丸めまたは切り捨ての前に絶対座標でdivの境界を計算しています。これがバグであるかどうかはわかりませんが (仕様を調べる必要があります)、最終的には修正/改善される可能性があります。jQuery はそのようなブラウザーの特性を回避するはずなので、おそらく jQuery のバグとして認定されます。
この問題を解決するには、別のスケーリング アルゴリズムを提供する必要があります。1 つの解決策は、他のブラウザが自動的に計算している値を JavaScript で計算し、この jsFiddle のように整数のみを Chrome に提供することです: http://jsfiddle.net/gqLZe/1/
このメソッドは、包含要素の上端または左端が整数でない場合 (ボーダーまたはマージンによる場合を含む)、他のブラウザーで同様の問題を引き起こす可能性がありますが、整数に固執する限り、問題なく動作するはずです。
別の解決策は、div を展開するサイズの親要素を提供し、right
andbottom
ではなくwidth
andでアニメーション化することですheight
。これは、jQuery を使用して非常に簡単に実行できますanimate()
。
var width = $(".frame").width();
var height = $(".frame").height();
$(".frame").css({
top: height / 2 + "px",
bottom: height / 2 + "px",
left: width / 2 + "px",
right: width / 2 + "px"
}).show().animate({
top: 0,
bottom: 0,
left: 0,
right: 0
}, 3000, 'linear');
jsFiddle: http://jsfiddle.net/gqLZe/3/
余分なマークアップ要素を持つことに耐えることができれば、おそらくそれが進むべき道です。