同步发布:https://blog.jijian.link/2020-04-15/css-img-after-placeholder/

如图:

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

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

做法一

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

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

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

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

做法二

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

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

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

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

效果:

https://blog.jijian.link/2020-04-15/css-img-after-placeholder/

源码:

<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 属性实现占位图。

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

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

效果:

https://blog.jijian.link/2020-04-15/css-img-after-placeholder/

源码:

<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 透明,可能会导致占位图与需要显示的图片重叠。

css 技巧:利用 after 伪对象和 background 属性实现 img 图片标签占位图的更多相关文章

  1. 利用BeanUtils在对象间复制属性

    commons-beanutils是jakarta commons子项目中的一个软件包,其主要目的是利用反射机制对JavaBean的属性进行处理.我们知道,一个JavaBean通常包含了大量的属性,很 ...

  2. VB默认属性、动态数组、Range对象的默认属性的一点不成熟的想法

    1.默认属性 VB6.0有默认属性的特性.当没有给对象指定具体的属性时,"默认属性"是VB6.0将使用的属性.在某些情形下,省略常用属性名,使代码更为精简. 因为CommandBu ...

  3. 从知乎首页用户操作入口学习到的CSS技巧 - 合理利用伪元素实现一些装饰样式

    最近在模仿做一个静态的PC版知乎,在模仿的过程中,从知乎工程师的方法中学到了不少知识,比如CSS方面的,以下介绍一个今天学到的伪元素的技巧. 示例 DOM结构为: <div class=&quo ...

  4. #8.10.16总结# 属性选择符 伪对象选择符 CSS的常用样式

    属性选择符 E[att] E[att="val"] E[att~="val"] E[att^="val"] E[att$="val ...

  5. css伪元素选择器(伪对象选择器)checked + 伪元素练习

    伪对象也叫伪元素,在过去,伪类和伪元素都被书写成前面只加一个冒号,实际上应该是: :weilei ::伪元素 而现在我们为了兼容旧的书写方式,用一个冒号引导伪类也是能被解析的. 伪类一般反应无法在CS ...

  6. CSS Pseudo-Element Selectors伪对象选择符

    一: CSS3将伪对象选择符(Pseudo-Element Selectors)前面的单个冒号(:)修改为双冒号(::)用以区别伪类选择符(Pseudo-Classes Selectors),但以前的 ...

  7. CSS 伪类和伪对象选(五)

    一.伪选择器 伪选择器包括:伪类选择器和伪对象选择器,以冒号(:)作为前缀,冒号后紧跟伪类或者伪对象名称,冒号前后没有空格,否则解析为包含选择器 如: div:hover{ font-size:12p ...

  8. CSS伪对象选择符整理

    1.E::selection 2.E::placeholder 1. E::selection 设置对象被选择时的样式. 需要注意的是,::selection只能定义被选择时的background-c ...

  9. 应该知道的25个非常有用的CSS技巧

    在我们的前端CSS编码当中,经常要设置特殊的字体效果,边框圆角等等,还要考虑兼 容性的问题, CSS网页布局,说难,其实很简单.说它容易,往往有很多问题困扰着新 手,在中介绍了非常多的技巧,这些小技巧 ...

  10. 20个很有用的CSS技巧

    导语:下面这几个CSS技巧你可能不知道,1.彩色照片变黑白,2.所有元素垂直居中,3.禁用鼠标,4.模糊文字,小编学完能量满满的,觉得对CSS又充满了爱,你也来看看. 1. 黑白图像 这段代码会让你的 ...

随机推荐

  1. qemu/kvm

    <domain type="kvm"> <name>win7</name> <uuid>e31c1621-b3c3-42ed-be3 ...

  2. mysql数据库 主从同步

    我们知道mysql数据库为了得到更高性能,一般会读写分离.主库用于写操作,比如用于执行的insert.update操作:从库用于读,也就是常见的select操作. 写数据都在主库(master)操作, ...

  3. minimind复现记录

  4. 重温Go语法笔记 | 结构体

    结构体 多个任意类型聚合成的复合类型 1.字段拥有自己的类型和值 2.字段名必须唯一 3.字段可以是结构体 结构体的定义是一种内存布局的描述 只有实例化才会真正分配内存,必须实例化之后才能使用结构体的 ...

  5. C#中如何使用异步编程

    在 C# 中,异步编程主要通过 async 和 await 关键字来实现.异步编程的目的是让程序在执行耗时操作(如 I/O 操作.网络请求等)时不会阻塞主线程,从而提高程序的性能. 1. 异步编程的核 ...

  6. Mybatis插入数据后返回主键

    添加记录后获取主键ID,这是一个很常见的需求,特别是在一次前端调用中需要插入多个表的场景. 除了添加单条记录时获取主键值,有时候可能需要获取批量添加记录时各记录的主键值,MyBatis从3.3.1版本 ...

  7. SpringBoot(二) - 核心配置文件 (+ 邮件发送 和 短信发送)

    1.application.properties 和 application.yml 配置文件格式区别 1.1 文件格式 application.properties # 端口号 server.por ...

  8. jdk8之stream原理及流创建、排序、转换等处理

    目录 一.为什么需要 Stream 二.什么是流 三.流的分类 1.有多种方式生成 Stream Source 2.流的操作类型 四.流的创建 1.数组和集合创建流 2.基本数值型流 3.数值流的构造 ...

  9. Elasticsearch的分享

    一.生活中的数据 搜索引擎是对数据的检索,所以我们先从生活中的数据说起.我们生活中的数据总体分为两种: 结构化数据 非结构化数据 结构化数据: 也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格 ...

  10. 我的程序库:HiCSDB

    HiCSDB是我写的一个通用程序库,地址:https://github.com/xumingxsh/HiCSDB 该库的目标是简化C#的数据库交互操作. 在这个库中,我将数据库的交互操作抽象为一下几个 ...