今天聊一个图片加载提前占位的一个问题 ,内容比较适合初学者。

起因

在响应式页面当中,图片加载之前是不知道图片高度的,加载成功图片完全撑开。如果不做提前占位会把下面的内容挤下去,页面出现抖动,就像下面效果一样:

假如图片是自适应的,宽度为屏幕宽度的30%,高度等比例缩放,这时候是无法直接设置图片高度的,所以就导致了图片未加载前高度为0,加载成功后撑开的问题。

解决这个问题就需要对图片进行提前占位,这里虽然不确定图片的高度,但是图片的比例是确定的。(要是图片的比例都不确定那就玩不了了……)

padding-top

所以有请今天的主角登场:padding-top或者padding-bottom

padding-top的值设置为百分比的时候,让我们先看一下mdn官方是怎么解释的:

当内边距(padding)是一个百分比的时候,百分比是和包含块(containing block)的宽度有关的,同样一定不能为负数。

说白了就是padding-top的值如果是百分比,那么这个百分比是相对于其父容器的宽度的。

比如下面这个案例(案例写成了padding-bottom,效果都是一样的):

.content{
width: 300px; /* 也可以是百分比 */
height: 500px;
background-color: aquamarine;
}
.box{
width: 100%;
height: 0;
padding-bottom: 50%; /* 相对于父级宽度,也就是150px */
background-color: red;
}
<div class="content">
<div class="box"></div>
</div>

.boxpadding-bottom的50%是相对于父容器.content的宽度决定的,也就是150px。而且.content也不一定是准确的px值,也可以是相对于页面的百分比值,这就适用于响应式的百分比宽度。

所以我们可以用图片的宽高比作为padding-bottom的值提前把图片所要占用的空间撑开,然后img绝对定位在.content上面就可以达到提前占位的效果。

比如下面案例使用的图片宽高是300px * 450px,那么padding-bottom的值就可以设置为150%

这里为了少写一个div,用伪类代替:

.content{
position: relative;
width: 300px;
font-size: 0; /* 消除内联元素间的间隔(空格) */
}
.content::before{
content: '';
display: block;
width: 100%; /* 400px 相对于content的width */
padding-bottom: 150%; /* 200px 相对于content的width */
background-color: red;
}
.content img{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
<div class="content">
<img src="https://img1.baidu.com/it/u=2348819965,1910380145&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=750" alt="">
</div>
<div>下方内容下方内容下方内容</div>

可以看到在加载过程中下方内容没有从上面被挤下来,提升了用户体验。

大致思路就是这样,主要是使用padding-top或者padding-bottom的百分比用来实现占位效果 。

CSS 图片加载提前占位 padding-top、padding-bottom的更多相关文章

  1. CSS 图片加载完成再淡入显示

    一.方法 加载完成再显示:借助Image对象的onload事件,加载完时再把src赋给img标签的src: 淡人显示:起始opacity为0,利用transform过度到1 二.代码 <!DOC ...

  2. 运用CSS高斯模糊添加图片加载效果

    <!DOCTYPE html> <html> <head> <title>大图片加载从模糊到清晰</title> </head> ...

  3. nginx实现动态分离,解决css和js等图片加载问题

    改帖专门为使用nginx,通过nginx把请求转发到web服务器再返回客户端的时候,解决css和js和图片加载不出来的问题. 如果没安装nginx,请访问一下地址进行安装 http://www.cnb ...

  4. Android 图片加载库Glide 实战(二),占位符,缓存,转换自签名高级实战

    http://blog.csdn.net/sk719887916/article/details/40073747 请尊重原创 : skay <Android 图片加载库Glide 实战(一), ...

  5. 图片预加载 js css预加载

    图片预加载, 效果非常明显, 特别是有多个图, 方法很简单 , 体验提升了不少 <div class="hidden">        <script type= ...

  6. css背景图片加载失败,页面部分图标无法显示

    1.问题表现:首屏缺失部分图标.点击按钮切换为激活状态时,部分按钮的激活态图标无法显示. 2.问题原因:网络极差,断断续续,点击时添加class:active变为激活态, active.png这张图片 ...

  7. touchweb手机网站图片加载方法(canvas加载和延迟加载)

    一.canvas图片加载 关于canvas加载,我的方法是,将文章中所有用到图片的地方,都用canvas代替,给canvas一个data-src,里面存放img的路径,通过canvas方法渲染图片.因 ...

  8. Android 图片加载框架 Glide4.x

    概述 Glide是一个图片加载框架,使得我们可以轻松的加载和展示图片 Glide4.x新增apply()来进行设置,apply可以调用多次,但是如果两次apply存在冲突的设置,会以最后一次为准 新增 ...

  9. HTML5_canvas_图片加载_双缓冲_跳帧闪烁问题

    canvas 图片加载 pen.drawImage(ele, showX, showY, imgWidth, imgHeight); ele    将 img 元素 加载到画布上 步骤 1. 创建一个 ...

  10. vue 首页背景图片加载完成前增加 loading 效果 -- 使用 new Image() 实现

    1. 创建 loading 公用组件 <template> <div class="load-container"> <div class=" ...

随机推荐

  1. How to implement UDP protocal

    Server implementation Open a socket on the server that listens to the UDP requests. (I've chosen 888 ...

  2. 细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现

    1. 前文回顾 在之前的几篇内存管理系列文章中,笔者带大家从宏观角度完整地梳理了一遍 Linux 内存分配的整个链路,本文的主题依然是内存分配,这一次我们会从微观的角度来探秘一下 Linux 内核中用 ...

  3. Docker容器中使用GPU

    背景 容器封装了应用程序的依赖项,以提供可重复和可靠的应用程序和服务执行,而无需整个虚拟机的开销.如果您曾经花了一天的时间为一个科学或 深度学习 应用程序提供一个包含大量软件包的服务器,或者已经花费数 ...

  4. 有关Spring的ioc理解之代理模式

    AOP代理模式可以实现事务控制和业务逻辑代码横切. 使用代理模式,动态代理实现横切. 什么是代理? 接口就是指定要做的事情,要实现的逻辑. 代理类似于房源租房 public interface ZuF ...

  5. SSL CA 证书生成shell

    gencert ssl证书生成 要保证Web浏览器到服务器的安全连接,HTTPS几乎是唯一选择.HTTPS其实就是HTTP over SSL,也就是让HTTP连接建立在SSL安全连接之上. SSL使用 ...

  6. YII2.0使用ActiveForm表单

    Controller控制器层代码 <?php namespace frontend\controllers; use frontend\models\UserForm; class UserCo ...

  7. 长连接Netty服务内存泄漏,看我如何一步步捉“虫”解决

    作者:京东科技 王长春 背景 事情要回顾到双11.11备战前夕,在那个风雨交加的夜晚,一个急促的咚咚报警,惊破了电闪雷鸣的黑夜,将沉浸在梦香,熟睡的我惊醒. 一看手机咚咚报警,不好!有大事发生了!电话 ...

  8. 基于SqlSugar的开发框架循序渐进介绍(28)-- 快速构建系统参数管理界面

    在参照一些行业系统软件的时候,发现一个做的挺不错的系统功能-系统参数管理,相当于把任何一个基础的系统参数碎片化进行管理,每次可以读取一个值进行管理,这样有利于我们快速的处理业务需求,是一个挺好的功能. ...

  9. Appweb-6.1.1 移植到ARM

    Appweb-6.1.1 移植到ARM 编译环境:ubuntu-12.04 x64 开发平台:Hi3535 arm版 编译版本:appweb-6.1.1.zip ESP下载地址=> ESP we ...

  10. Reshaper 代码清理工具

    reshaper是个好工具,能帮助我们提升开发效率,比如本文要介绍的全局代码清理功能. 如果你的VS安装了reshaper,可以通过Ctrl+E+C快捷键打开代码清理窗口. 代码清理,可以格式化多种文 ...