首次在 Web 浏览器中加载图像时,浏览器下载图像时会存在一定程度的延迟。
一般来说,大多数网站都有很多活动部分。当浏览器下载 HTML 文档时,浏览器将开始处理由 HTML 文档中的 HTML 元素表示的所有元素和事件。
例如,CSS 在遇到链接标签时开始加载。JavaScript 正在加载脚本元素。其他 HTML 元素被添加到 DOM。发生这种情况时,会触发向服务器发送请求以下载这些资源的事件。
将img
标签添加到 DOM 时,会向服务器发送请求以检索由 src 属性标识的资源。图像完全下载后,将在页面上呈现。
假设我们正在使用适合网站大小的图像,当我们正常加载图像时,没有效果,我们不会真正注意到延迟,因为图像在下载完成后或多或少会立即显示。
但是,当我们添加诸如fadeIn 和fadeOut 之类的效果时,延迟的效果会变得非常明显。这是因为 JavaScript 事件实际上开始修改 img 元素的 CSS 属性,即使实际资源尚未准备好。
因此,当 DOM 元素被添加到 DOM 时,fadeIn 和 fadeOut 事件就会触发,而不是在图像加载完成时触发。换句话说,当图像仍在下载时,会发生fadeIn 或fadeOut 操作。这会产生不和谐的效果,因为部分褪色但未渲染的图像可能会突然出现,然后在其余部分缓慢褪色。
这个动作不是我们正在寻找的平滑、渐进的效果。
现在,您可能会注意到在您加载图像的第 2 次、第 3 次、第 4 次或第 n 次时不会发生这种情况。图像被浏览器缓存后,延迟大大降低,淡入淡出效果呈现应有的效果。平滑而渐进。
我在图像中淡入淡出时通常使用的技术是首先预加载它。虽然有一些库可以为您预加载所有图像,但在应用 fadeIn 事件之前,这里有一个非常简单、快速的预加载图像技术:
将图像作为隐藏图像放置在 HTML 中:
<!-- Hidden by default, but now preloaded for a smooth fadeIn effect -->
<img id="myImage" src="/images/myImage.png" style="display:none" />
绑定点击事件时使用jQuery添加隐藏图片:
如果图像在单击事件发生后会淡入,我发现这种技术非常有用:
// preload the image while registering the click event
$('<img id="myImage" src="/images/myImage.png" style="display:none" />')
.append("body");
$('button').click(function() {
$('#myImage').fadeIn();
});
使用 jQuery 的 load 事件根据需要预加载图像:
用户可能永远不会点击按钮来显示图像;因此,这是一种在请求图像时预加载图像的技术,但仍不会影响用户。如果用户决定不点击按钮,则永远不会从服务器请求资源。此外,由于我们在触发 fadeIn 事件之前等待图像加载,我们仍然可以获得我们正在寻找的平滑度,但在过程开始之前可能会有轻微的延迟。
// preload the image while registering the click event
$('button').click(function() {
// place img element on page without specifying the src attribute
$('<img id="myImage" style="display:none" />').append("body");
// bind a load event to the image element so fadeIn doesn't start until
// the image is completely downloaded
$('#myImage').load(function() {
$(this).fadeIn(); // fade in the image
});
});