CSS3 トランジションを使用した例を紹介します。特定のケースに合わせて調整および改善できます。
書き起こし終了コールバックの実装はベンダーに依存するため、私の具体的な例は、記述されているように Webkit でのみ機能します。これは、正しいベンダー イベント ハンドラー名を使用することで修正できます。
/* Fades an element to given opacity */
var fade = function(opacity, fn) {
this.addEventListener("webkitTransitionEnd", function end() {
this.removeEventListener("webkitTransitionEnd", end);
fn && fn.call(this);
}, false);
this.style.opacity = opacity;
};
/* Preloads an image */
var load = function(src, fn) {
var self = this, $img = new Image();
$img.onload = function() {
fn && fn.call(self);
};
$img.src = src;
};
/* Steps:
* 1. Fades out current image.
* 2. Preloads next image.
* 3. When loading of next image is complete, sets next image.
* 4. Fades in.
*/
var $img = document.getElementById("imgRand");
/* Fades out */
fade.call($img, 0, function() {
/* Get random dimensions */
var height = Math.ceil(Math.random() * 100) + 100;
var width = Math.ceil(Math.random() * 200) + 100;
var src = "http://placehold.it/" + width + "x" + height;
/* Preloading */
load.call(this, src, function() {
$img.setAttribute("src", src);
/* Fades in */
fade.call($img, 1);
});
});
ここで見ることができます。
img
要素の-webkit-transition-duration
style プロパティが に設定されてい1s
ます。
この中で最も複雑で見過ごされている部分は、画像のプリロードです。使用するすべての画像をプリロードしないと、アニメーションが滑らかにならないためです。しかし同時に、画像がいつ読み込まれたかを検出するのは簡単な作業ではありません。私が使用している方法は、ブラウザのキャッシュ内の画像に対して失敗する可能性が最も高い単純なものです。それについては詳しく説明しませんが、SO で検索できます。
免責事項:遅すぎます。そのため、ここにコードをダンプして、後で使用します。疑問があれば。