图片加载失败使用CSS处理最佳实践
# 1、传统的图片异常处理
<img>
如果因为网络或者跨域限制等原因无法正常加载,在默认情况下会显示浏览器默认的“裂开”的图片效果,如果设置了 alt
属性值,则 alt
属性对应的内容也会一并显示。例如:
<img src="//zasd.jpg alt=图片">
1
这样图片加载异常之后的视觉效果很差,因此,为了更好的视觉效果,实际项目开发中,我们总会对图片加载异常的边界场景进行额外的处理。
传统的图片加载异常会使用一个加载失败的占位符代替,这个占位图通常会是一张裂开的图片。通过 onerror
事件,代码示意如下:
<img src="xxx.png" alt="鑫空间鑫生活" onerror="this.src='break.svg';">
1
配合css
img[src$="break.svg"] {
object-fit: contain;
}
1
2
3
2
3
就可以保证占位图的横宽比例是正常的。然而这种实现方式有一个比较致命的问题,那就是用户并不清楚无法显示的图片具体表示的含义是什么。因此,传统的图片出错的处理方法可以有进一步的优化。
//zxx: 如果你看到这段文字,说明你现在访问是体验糟糕的垃圾盗版网站,你可以访问原文获得很好的体验:https://www.zhangxinxu.com/wordpress/?p=9618(作者张鑫旭)
# 2、最佳实践,同时显示alt信息
为了便于维护,图像加载 error
的时候不再是替换 src
c地址,而是新增一个错误类名,例如 .error
:
<img src="zxx.png" alt="css新世界封面" onerror="this.classList.add('error');">
1
然后配合使用如下所示的CSS(部分CSS样式细节大家可以根据自己的审美进行修改):
img.error {
display: inline-block;
transform: scale(1);
content: '';
color: transparent;
}
img.error::before {
content: '';
position: absolute;
left: 0; top: 0;
width: 100%; height: 100%;
background: #f5f5f5 url(break.svg) no-repeat center / 50% 50%;
}
img.error::after {
content: attr(alt);
position: absolute;
left: 0; bottom: 0;
width: 100%;
line-height: 2;
background-color: rgba(0,0,0,.5);
color: white;
font-size: 12px;
text-align: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
此时就可以看到失败的图片和alt文字信息同时出现的效果了。
# 3、注意点
上面提供的CSS代码中的兜底图像均使用的外链地址,例如:
img.error::before {
background: #f5f5f5 url(break.svg) no-repeat center / 50% 50%;
}
1
2
3
2
3
其中的 url(break.svg)
就是使用的外链地址。
然后这里有个需要注意的地方,这个 break.svg
的域名地址建议不要和网站的静态图片的地址一样。 break.svg 可以和主站域名一致,或跟CSS域名一致,或者直接内联在CSS文件中。
上次更新: 2024/01/30, 00:35:17
- 02
- Node与GLIBC_2.27不兼容解决方案08-19
- 03
- Git清空本地文件跟踪缓存08-13