css 技巧:利用 after 伪对象和 background 属性实现 img 图片标签占位图

如图:

图片加载失败了,在浏览器会默认显示一张破图。受各种网速、浏览器等因素影响,我们无法保证图片能够完全加载成功。加载失败时如何更友好的显示是前端要考虑的主要因素。

常见做法都是使用一张默认图代替加载失败的图片,比如一个 logo 、一张主题图片等。

做法一

使用 JS 懒加载图片,如果图片加载失败,使用一个默认图占位。

推荐插件:https://github.com/lzxb/lazy-load-img

该插件使用 setTimeout 监听页面元素是否显示,如果图片出现在显示区域则执行图片加载。适应常见的 tab 切换,轮播图等。

注意:图片懒加载也是一种页面优化手段,该方案适用于一开始项目立项就有考虑懒加载情况。

做法二

使用 img 伪对象 after 和 background 实现占位图。

该方案适用于一些未考虑图片懒加载的项目优化。

比如:页面上某个模块存在很古老,如果去改 html 结构有风险,这时候可以使用 css background 和伪对象 after 用占位图去优化显示。

注意:该方案仅适用于 webkit 内核浏览器,对于采用渐进增强的网页比较实用。比如: chrome浏览器,移动端浏览器等。桌面浏览器比如 Firefox、IE 等都不支持 img:after 写法。

效果如下:

加载失败显示默认图小白兔:

加载成功,显示皮卡丘:

源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<img class="placeholder" src="./test.png">

<style>
.placeholder {
width: 120px;
height: 120px;
position: relative;
}
.placeholder:after {
content: '';
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
background: url('img.png') no-repeat center #999;
z-index: 3;
}
</style>

做法三

直接使用 img background 属性实现占位图。

该方案好处是兼容性强,各种浏览器都支持 img background 写法。

注意:该方案中的 alt="" 不能少,也不能写入任何文字,如果有文字,会导致文字显示出来,如果没有 alt 属性,会显示破图。

效果如下:

源码:

1
2
3
4
5
6
7
8
<img class="placeholder2" src="./test.png" alt="">
<style>
.placeholder2 {
width: 120px;
height: 120px;
background: url('img.png') no-repeat center #999;
}
</style>

总结

img 标签经常用于加载图片,background 属性及 after 伪对象使用比较少。其实 css 比我们想象中的更强大。

以上使用 css 优化方案需要考虑 png 透明背景情况,如果 png 透明,可能会导致占位图与需要显示的图片重叠。

本文由 linx(544819896@qq.com) 创作,采用 CC BY 4.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。本文链接为: https://blog.jijian.link/2020-04-15/css-img-after-placeholder/

如果您觉得文章不错,可以点击文章中的广告支持一下!