预加载图像以在 JavaScript 中无缝更改背景图像
Preload image for seamless background image change in JavaScript
我有一个 Python websocket 应用程序,它将图像路径发送到 JavaScript HTML 文件。收到图像路径后,我将网页的背景图像更改为提供的图像。
我目前遇到的问题是,当背景从旧图像变为新图像时,有一个瞬间 'flash',这表明有一段时间 (尽管非常简短)正在加载新图像的位置。
我已经尝试过各种预加载方法,但我对 JavaScript 还是个新手,所以我不确定哪种方法可以提供两个图像之间的无缝过渡。这是我目前实现的方法:
var NewImage = new Image();
NewImage = message.data; //This is the image string received from Python
document.body.style.backgroundImage = "url('" + NewImage + "')";
上面显示了所需的图像(包括我的 CSS 格式),但过渡效果不佳。
我也玩过下面的方法,这对我来说更有意义,但我无法让它工作。
var NewImage = new Image();
//Websocket function here
PreloadImage;
function PreloadImage() {
NewImage.onload = ImageLoadComplete();
NewImage.src = message.data;
}
function ImageLoadComplete() {
document.body.style.backgroundImage = "url('" + NewImage + "')"
}
我不确定如何在第二种方法中的函数之间传递变量。鉴于此方法中的显式 'onload' 调用,我认为这可能会提供我所追求的功能。
如何预加载图像以便在它们之间无缝过渡?
编辑:工作代码贴在下面。感谢@blender 为我指明了正确的方向:)
var NewImage = new Image;
NewImage.src = message.data; //Data from Python
if (NewImage.complete) {
NewImage.onload = ImageLoadComplete();
} else {
NewImage.onload = ImageLoadComplete;
}
function ImageLoadComplete() {
document.body.style.backgroundImage = "url('" + NewImage.src + "')";
}
您实际上并没有传递回调函数:
NewImage.onload = ImageLoadComplete();
您正在传递调用 ImageLoadComplete()
的 结果 ,这意味着您会立即调用回调。不要调用该函数,您的代码应该会按预期工作(大部分时间):
NewImage.onload = ImageLoadComplete;
您会遇到的一个问题是,如果从缓存中加载图像,某些浏览器可能不会调用 onload
。如果是这种情况,您必须手动调用回调:
if (NewImage.complete || NewImage.height > 0) {
ImageLoadComplete();
} else {
NewImage.onload = ImageLoadComplete;
}
我有一个 Python websocket 应用程序,它将图像路径发送到 JavaScript HTML 文件。收到图像路径后,我将网页的背景图像更改为提供的图像。
我目前遇到的问题是,当背景从旧图像变为新图像时,有一个瞬间 'flash',这表明有一段时间 (尽管非常简短)正在加载新图像的位置。
我已经尝试过各种预加载方法,但我对 JavaScript 还是个新手,所以我不确定哪种方法可以提供两个图像之间的无缝过渡。这是我目前实现的方法:
var NewImage = new Image();
NewImage = message.data; //This is the image string received from Python
document.body.style.backgroundImage = "url('" + NewImage + "')";
上面显示了所需的图像(包括我的 CSS 格式),但过渡效果不佳。
我也玩过下面的方法,这对我来说更有意义,但我无法让它工作。
var NewImage = new Image();
//Websocket function here
PreloadImage;
function PreloadImage() {
NewImage.onload = ImageLoadComplete();
NewImage.src = message.data;
}
function ImageLoadComplete() {
document.body.style.backgroundImage = "url('" + NewImage + "')"
}
我不确定如何在第二种方法中的函数之间传递变量。鉴于此方法中的显式 'onload' 调用,我认为这可能会提供我所追求的功能。
如何预加载图像以便在它们之间无缝过渡?
编辑:工作代码贴在下面。感谢@blender 为我指明了正确的方向:)
var NewImage = new Image;
NewImage.src = message.data; //Data from Python
if (NewImage.complete) {
NewImage.onload = ImageLoadComplete();
} else {
NewImage.onload = ImageLoadComplete;
}
function ImageLoadComplete() {
document.body.style.backgroundImage = "url('" + NewImage.src + "')";
}
您实际上并没有传递回调函数:
NewImage.onload = ImageLoadComplete();
您正在传递调用 ImageLoadComplete()
的 结果 ,这意味着您会立即调用回调。不要调用该函数,您的代码应该会按预期工作(大部分时间):
NewImage.onload = ImageLoadComplete;
您会遇到的一个问题是,如果从缓存中加载图像,某些浏览器可能不会调用 onload
。如果是这种情况,您必须手动调用回调:
if (NewImage.complete || NewImage.height > 0) {
ImageLoadComplete();
} else {
NewImage.onload = ImageLoadComplete;
}