我整晚都在阅读,似乎找不到任何关于如何最好地做这件事的具体答案。我知道有两种方法是行得通的:
用于图片加载淡入的方法:
使用图像包装器和<img>
标记,如下所示:
<div class="imageWrapper">
<img src="img.jpg" alt="" onload="imageLoaded(this)">
</div>
并且 CSS 看起来像这样
.imageWrapper {
opacity: 0
}
.loaded {
opacity: 1
}
然后在您的js文件中添加类似以下内容:
var imageLoaded = (img) => {
var imgWrapper = img.parentNode;
imgWrapper.className += ' loaded';
}
根据屏幕大小加载不同的图像
@media screen only and (min-device-width: 0) and (max-device-width: 450px) {
.backgroundImage {
background: url('small_background_image.jpg');
}
}
@media screen only and (min-device-width: 451px) and (max-device-width: 1024px) {
.backgroundImage {
background: url('medium_background_image.jpg');
}
}
@media screen only and (min-device-width: 1025px) {
.backgroundImage {
background: url('large_background_image.jpg');
}
}
我的问题
我可以单独完成这两件事情 (加载图像时淡入,当浏览器检测到较小的屏幕尺寸时更改背景图片),但我似乎找不到同时包含 这两者 的解决方案。 我需要能够为不同的屏幕尺寸指定不同的图像,并能够检测该图像何时加载并淡入。
有什么好方法吗?
我的解决方案:
最终,我使用了guest271314的 答案的变化来加载正确的图像。 这适用于所有浏览器的最新版本,而且非常容易实现。
首先,我在开头的 <body>
标记右下方放置一个内联脚本,以便如果浏览器加载我的js文件速度很慢,它仍然可以立即加载图像。
<body>
<script>
function imageLoaded(img) {
if ((" " + img.className + " ").indexOf(" "+'loaded'+" ") > -1 ) {
return true;
} else {
img.className += ' loaded';
}
}
</script>
然后我有一个<picture>
标签,就像这样:
<picture class="backgroundContainer">
<source srcset="img-1024.jpg" media="(min-width: 0px) and (max-width:1024px)">
<source srcset="img-1920.jpg" media="(min-width: 1025px) and (max-width: 1920px)">
<source srcset="img-2560.jpg" media="(min-width: 1921px)">
<img class="backgroundImage" onload="imageLoaded(this)" src="img-1920.jpg" alt="">
</picture>
我的Sass看起来是这样的:
@keyframes fadeIn
0%
opacity: 0
100%
opacity: 1
.backgroundContainer
width: 100%
height: 100%
.backgroundImage
opacity: 0
.loaded
opacity: 1
animation: fadeIn 3s
这使得浏览器(不论速度)能够等待正确大小的图像加载完毕,然后在3秒
内淡入显示。对于旧版浏览器,它会使用<img>
标签提供一个安全的备用方案。