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

起因

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

假如图片是自适应的,宽度为屏幕宽度的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. flutter ui---->一些类QQ的实现

    整理一下比较有意思的类QQ的UI实现.Nothing that has meaning is easy. Easy doesn't enter into grown-up life. darken t ...

  2. python之PySimpleGUI(二)属性

    属性 Size• Key 相当于句柄/ID• Font• Pad• Colors• Enable Events• Visibility• Tooltip• Metadata• Right click ...

  3. [Chrome]插件的导出与导入[转载]

    1 文由 毕竟是在墙内,暂时又没有有效的FQ工具,换设备了,但需要使用原先旧设备下载的插件.只能出此下策liao~ 2 导出插件 step1 Chrome: 进入插件管理界面 Chrome: 更多工具 ...

  4. python选出一定数量的随机文件到某个文件夹

    import os import random import shutil def move_file(target_path, save_path, number): file_list = os. ...

  5. 浅析pcba测试

      说起PCB大家都很熟悉,那大家知道什么是PCBA吗?它是指将PCB板进行加工,支撑一个成品线路板.而PCBA测试就是对线路板进行一个功能测试.电路测试.那么为什么一定要对PAB板进行检测呢?它有什 ...

  6. layUI之DataTable组件V1.0(父子表管理传值/数据表格与select&laydate结合等)

    layUI之DataTable数据表格组件V1.0 目录 layUI之DataTable数据表格组件V1.0 概述 一.下载与引用 二.组件功能介绍 三.父表格渲染 1. HTML中声明空table一 ...

  7. 从Chat-GPT看爆火技术概念及医疗领域科技与应用场景

    作者:京东健康 陈刚 一.前言 最近OpenAI在官网上宣告了多模态大模型 GPT-4 的诞生,它可能是迄今为止最好的多模态模型. 主要更新内容如下: 1. 逻辑分析能力更加全面.「考试」能力大幅提升 ...

  8. 看了绝对不会忘的 去中心化金融 - DeFi

    DeFi Decentralized Finance, 去中心化金融,主要就是 以区块链技术为载体的金融模式. 注意:区块链是一种技术,而比特币是一种应用. Terminology fungible ...

  9. Linux云计算运维工程师day29软件安装

    1.  diff(文本比较) [root@guosaike ~]# cp /etc/passwd{,.ori}备份 [root@guosaike ~]# diff /etc/passwd{,.ori} ...

  10. Vue+echarts实现中国地图射线效果

    效果图如上 前提是安装Echarts并引入 并且配置中国地图json文件这些都在同账号另一篇博客上有说明,查看请自行移步 下展示代码 <template> <div class=&q ...