css体验优化之图片容器设置宽高比
需求
我们在做web页面的时候,经常会有一些图片列表,例如下图的视频列表以及表情列表:

需求要求:
1. 列表是responsive的,在不同宽度的浏览器下面,图片要自适应容器宽度
2. 图片在自适应的过程中,图片的长宽比要保持不变
常规解决方案
在container宽度固定的需求中(比如PC版页面),我们直接设置图片容器或者图片为固定的宽高就好了,比如:
img{
width:330px;
height:180px;
}
但是这个不能满足需求,为了满足上面的需求两点,通常我们会想到通过设置图片的宽度为百分比来满足第1点,不设置高度来满足到第2点(容器的height不能根据width设置百分比),简单代码如下:
ul{
list-style:none;
}
ul li{
float:left;
width:100%;
padding:5px;
}
ul li img{
width:100%;
}
视频时间的代码就不写出来了,通过绝对定位来做即可。
存在的问题
上面的解决方案虽然可行,但是条件又点苛刻,并且体验不好,为什么呢?
1. 为了做到完美显示,运营同学在配置图片的时候必须做到图片的长宽比完全一致,不能有一个像素的差别,否则会出现如下图情况:

上图中第一张图比其他三张图高一个像素,由于不能设置图片容器的高度,所以对图片大小就必须要严格控制。
2. 体验不好。当网络不佳,图片还没有加载出来的情况下,你可能看到如下图:

由于图片没有加载出来,图片没有占位,当图片加载出来后,再把容器撑高,这样的体验非常不好(特别是图片内容在首屏的时候)。
有人可能会说,使用默认图片来占位,但是有时候,在网络情况恶劣的情况下,默认图片都可能加载不出来。
优化方案
为了解决上面两个存在的问题,我想到了一种使用图片容器进行占位的方法。首先我们要了解一个css的知识点,块级元素(如div,p)的padding设置为百分比的时候,是按照容器的宽度来定的,那么我们可以按照图片的比例来设置容器的高度(使用padding-top/padding-bottom),图片则使用绝对定位显示在容器的下层。
html:
<div class="section-video">
<ul class="list">
<li>
<a href="https://www.youtube.com/embed/vCS_Nl4R9W8">
<div class="img">
<img class="" src="http://down2.9apps.com:7080/group1/M00/76/E4/pYYBAFdlMBaAAKvkAAA0HBzaV9E798.jpg" alt="logo">
<span class="time">07:12</span>
</div>
<span class="title">ЕВРО 2016 - ЖЕСТЬ! ТРЕНЕР СБОРНОЙ ГЕРМАНИИ ОПОЗОРИЛСЯ НА ВЕСЬ МИР</span>
</a>
</li>
<li>
<a href="https://www.youtube.com/embed/8H2VfEO4n1k">
<div class="img">
<img class="" src="http://down2.9apps.com:7080/group1/M00/B0/71/qIYBAFdlMBWARAEqAAArw8xAvK8090.jpg" alt="logo">
<span class="time">04:58</span>
</div>
<span class="title">ЧЕХИЯ - ХОРВАТИЯ 2:2 ОБЗОР МАТЧА </span>
</a>
</li>
<li>
<a href="https://www.youtube.com/embed/R5kRrJuolak">
<div class="img">
<img class="" src="http://down2.9apps.com:7080/group1/M01/76/E4/poYBAFdlMBmAKGmxAAA7r722CEs285.jpg" alt="logo">
<span class="time">03:54</span>
</div>
<span class="title">ИСПАНИЯ - ТУРЦИЯ 3:0 ОБЗОР МАТЧА </span>
</a>
</li>
<li>
<a href="https://www.youtube.com/embed/zjKbunbkU78">
<div class="img">
<img class="" src="http://down2.9apps.com:7080/group1/M00/76/E4/pYYBAFdlMBuAO13wAAA-uPs5iqo997.jpg" alt="logo">
<span class="time">03:14</span>
</div>
<span class="title">ИТАЛИЯ - ШВЕЦИЯ 1:0 ОБЗОР </span>
</a>
</li>
</ul>
</div>
css:
* {
box-sizing: border-box;
}
.section-video ul.list {
padding: 5px;
width: 100%;
font-size: 12px;
background-color: #0363b5;
list-style: none;
overflow: hidden;
}
.section-video ul.list li {
display: inline-block;
width: 50%;
padding: 5px;
float: left
}
.section-video ul.list li a {
display: block;
width: 100%;
color: #fff;
text-decoration: none;
}
.section-video ul.list li .img {
width: 100%;
position: relative; // 使用相对定位
height:; // 高度设置为0,使用padding来设置高度
overflow: hidden;
padding-bottom: 54.545454%; // 使用padding-top也可,使用padding来撑高容器,高度为宽度的 54.545454%
}
.section-video ul.list li .img img {
position: absolute; // 使用绝对定位
width: 100%; // 宽高为容器的宽高
height: 100%;
top:;
left: 0
}
.section-video ul.list li .img .time {
position: absolute;
display: inline-block;
right:;
bottom: 15px;
font-size: 12px;
line-height: 18px;
background-color: rgba(0, 0, 0, .48);
border-top-left-radius: 8px;
border-bottom-left-radius: 8px;
padding: 0 10px
}
.section-video ul.list li .title {
display: block;
line-height: 18px;
padding: 4px 0;
height: 40px;
overflow: hidden;
text-overflow: ellipsis
}
这种情况及时配置的图片有点小误差,我们也可以忽略。
使用优化方案后,当图片加载不出来的时候,容器的位置不会消失,如下图:

那么对于体验上来说,整个页面不会在图片加载的时候出现撑高的情况。
解决方案代码演示:https://jsfiddle.net/boxiang_hbx/wrf4xshn/3/
当前两张图没有load出来的时候,代码演示:https://jsfiddle.net/boxiang_hbx/wrf4xshn/4/
改优化方案可以巧妙地用于其他布局的地方,不限于图片,有问题,欢迎讨论!
尊重版权,转载请说明出处!
css体验优化之图片容器设置宽高比的更多相关文章
- get新技能: 如何设置元素高度与宽度成特定比例。宽度改变,高度自动按比例改变。 例如设置宽高比16:9。
设置宽高比在很多时候是有用的. 下面的栗子,我们设置一个容器的宽高比为16:9 //HTML代码片段 <div class="container"> <div c ...
- c# winform DirectX播放器 可以任意设置宽高比 屏幕拉伸
第一步:dll引用 Microsoft.DirectX.dll Microsoft.DirectX.AudioVideoPlayback.dll 如果没有的话,可能需要安装微软的DRECTX JDK ...
- css中background-image背景图片路径设置
web项目中经常会用到background-image:url(),很多小伙伴不知道该怎么写需要的图片路径. 在此之前先要知道几个重要的东东: / 项目根目录 这个不用多说,就是程序 ...
- css怎样让元素显示指定的宽高比
.father { width: 100% } .child {; padding-bottom: 20%; background: green; overflow: hidden; } <bo ...
- 巧用padding让图片宽高比固定并自适应布局
1.从上图知道原始图片大小是 800 * 250,即宽高比为 3.2: 2.html 及 css 代码如下, 可以知道就只是在一个div里面放了一张图片,那么如何让这张图片的宽高比固定呢,看了css之 ...
- 加载的过程中图片变形了? --教你自定义自动适配图片宽高比的RatioLayout
很多同行在开发中可能会遇到这样的问题,就是在加载图片的时候会出现图片变形的问题.其实这很可能就是你的图片宽高比和图片所在容器的宽高比不匹配造成的.比如说图片的宽为200,高为100.宽高比就是2,那么 ...
- 使用css让动态容器按固定宽高比显示
需求:页面上有一个div的宽度是随着屏幕宽度的改变而改变的,但其宽高比始终是2:1,也就是当宽度是1000px时,高度为500px 分析:无论浏览器窗口如何改变,始终要让目标元素的宽高比保持2:1,我 ...
- (转)网站速度优化技巧:Nginx设置js、css过期时间
网站速度优化技巧:Nginx设置js.css过期时间 原文:http://www.webkaka.com/blog/archives/Nginx-set-the-expiration-time-for ...
- Bootstrap css背景图片的设置
一. 网页中添加图片的方式有两种 一种是:通过<img>标签直接插入到html中 另一种是:通过css背景属性添加 居中方法:水平居中的text-align:center 和 margin ...
随机推荐
- Ubuntu vi 常用命令集合
:w 保存文件但不退出vi:w file 将修改另外保存到file中,不退出vi:w! 强制保存,不推出vi:wq 保存文件并退出vi:wq! 强制保存文件,并退出viq: 不保存文件,退出vi:q! ...
- AIX上通过IPSEC进行IP包过滤
AIX上的IPSEC 在AIX可以通过以下步骤打开IP Security smitty ipsec4 --> Start/Stop IP Security --> Start IP Sec ...
- UE4 去除不正确的水面倒影以及不完整镜头轮廓
最近在做的项目遇到了一点点问题,出现了如下效果 视角对着湖面移动会出现一个显示不完整的轮廓(比较长的蓝色矩形),详细一点就是下图这样,以及近处物体的倒影(从光照的照射角度来看是不应该出现的) 一开始就 ...
- 转载《SimpleAdapter的参数说明》
SimpleAdapter的参数说明 第一个参数 表示访问整个android应用程序接口,基本上所有的组件都需要 第二个参数表示生成一个Map(String ,Object)列表选项 第三个参数表示界 ...
- Python实例1
1.有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 错解: 正解: 源码: #!/usr/bin/python for i in range(1,5): for j in ...
- js将金额专成每隔3位数加逗号
js将金额专成每隔3位数加逗号,比如 12345.00 转成 12,345.00; 懒得解释具体代码如下 //分割 String.prototype.joinByNum = function(num, ...
- 【转载】ANSYS完全法与模态叠加法瞬态分析实例
原文地址:http://www.caetecc.com/thread-2172-1-1.html ! 半脉冲载荷 --- 模态叠加法fini/clear,nostart/PREP7ET,1,BEAM4 ...
- xmind8
win10企业版安装 xmind.zip,打开应用程序报下面的错 解决办法是 先备份xmind8下的XMind.ini文件 Open up Xmind.ini and replace "Ap ...
- 关于电信cdma基站nid,sid,bid的解释
通过cdma的基站代码确定该基站的经纬度位置,必须知道Sid.Nid.Bid这三个基站数据,缺一不可. SID 是系统识别码,每个地级市只有一个sid,是唯一的. NID是网络识别码,由各本地网管理, ...
- Centos6.5 设置Tomcat8 service服务实现自启动和服务管理
Centos6.5 设置Tomcat8 service服务实现自启动和服务管理 将tomcat设置成像apache,nginx一样. 用serviec xxxx start/stop/restart ...