css体验优化之图片容器设置宽高比

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 需求 我们在做web页面的时候,经常会有一些图片列表,例如下图的视频列表以及表情列表:        需求要求: 1. 列表是responsive的,在不同宽度的浏览器下面,图片要自适应容器宽度 2.

需求

我们在做web页面的时候,经常会有一些图片列表,例如下图的视频列表以及表情列表:

      

需求要求:

1. 列表是responsive的,在不同宽度的浏览器下面,图片要自适应容器宽度

2. 图片在自适应的过程中,图片的长宽比要保持不变

 

常规解决方案

在container宽度固定的需求中(比如PC版页面),我们直接设置图片容器或者图片为固定的宽高就好了,比如:

1 img{
2     width:330px;
3     height:180px;
4 }

 

但是这个不能满足需求,为了满足上面的需求两点,通常我们会想到通过设置图片的宽度为百分比来满足第1点,不设置高度来满足到第2点(容器的height不能根据width设置百分比),简单代码如下:

 1 ul{
 2     list-style:none;
 3 }
 4 ul li{
 5     float:left;
 6     width:100%;
 7     padding:5px;
 8 }
 9 ul li img{
10     width:100%;
11 }

 

视频时间的代码就不写出来了,通过绝对定位来做即可。

 

存在的问题

上面的解决方案虽然可行,但是条件又点苛刻,并且体验不好,为什么呢?

1. 为了做到完美显示,运营同学在配置图片的时候必须做到图片的长宽比完全一致,不能有一个像素的差别,否则会出现如下图情况:

上图中第一张图比其他三张图高一个像素,由于不能设置图片容器的高度,所以对图片大小就必须要严格控制。

2. 体验不好。当网络不佳,图片还没有加载出来的情况下,你可能看到如下图:

由于图片没有加载出来,图片没有占位,当图片加载出来后,再把容器撑高,这样的体验非常不好(特别是图片内容在首屏的时候)。

有人可能会说,使用默认图片来占位,但是有时候,在网络情况恶劣的情况下,默认图片都可能加载不出来。

 

优化方案

 为了解决上面两个存在的问题,我想到了一种使用图片容器进行占位的方法。首先我们要了解一个css的知识点,块级元素(如div,p)的padding设置为百分比的时候,是按照容器的宽度来定的,那么我们可以按照图片的比例来设置容器的高度(使用padding-top/padding-bottom),图片则使用绝对定位显示在容器的下层。

html:

 1 <div class="section-video">
 2   <ul class="list">
 3     <li>
 4       <a href="https://www.youtube.com/embed/vCS_Nl4R9W8">
 5         <div class="img">
 6           <img class="" src="http://down2.9apps.com:7080/group1/M00/76/E4/pYYBAFdlMBaAAKvkAAA0HBzaV9E798.jpg" alt="logo">
 7           <span class="time">07:12</span>
 8         </div>
 9         <span class="title">ЕВРО 2016 - ЖЕСТЬ! ТРЕНЕР СБОРНОЙ ГЕРМАНИИ ОПОЗОРИЛСЯ НА ВЕСЬ МИР</span>
10       </a>
11     </li>
12     <li>
13       <a href="https://www.youtube.com/embed/8H2VfEO4n1k">
14         <div class="img">
15           <img class="" src="http://down2.9apps.com:7080/group1/M00/B0/71/qIYBAFdlMBWARAEqAAArw8xAvK8090.jpg" alt="logo">
16           <span class="time">04:58</span>
17         </div>
18         <span class="title">ЧЕХИЯ - ХОРВАТИЯ 2:2 ОБЗОР МАТЧА </span>
19       </a>
20     </li>
21     <li>
22       <a href="https://www.youtube.com/embed/R5kRrJuolak">
23         <div class="img">
24           <img class="" src="http://down2.9apps.com:7080/group1/M01/76/E4/poYBAFdlMBmAKGmxAAA7r722CEs285.jpg" alt="logo">
25           <span class="time">03:54</span>
26         </div>
27         <span class="title">ИСПАНИЯ - ТУРЦИЯ 3:0 ОБЗОР МАТЧА </span>
28       </a>
29     </li>
30     <li>
31       <a href="https://www.youtube.com/embed/zjKbunbkU78">
32         <div class="img">
33           <img class="" src="http://down2.9apps.com:7080/group1/M00/76/E4/pYYBAFdlMBuAO13wAAA-uPs5iqo997.jpg" alt="logo">
34           <span class="time">03:14</span>
35         </div>
36         <span class="title">ИТАЛИЯ - ШВЕЦИЯ 1:0 ОБЗОР </span>
37       </a>
38     </li>
39   </ul>
40 </div>

 

css:

 1 * {
 2   box-sizing: border-box;
 3 }
 4 
 5 .section-video ul.list {
 6   padding: 5px;
 7   width: 100%;
 8   font-size: 12px;
 9   background-color: #0363b5;
10   list-style: none;
11   overflow: hidden;
12 }
13 
14 .section-video ul.list li {
15   display: inline-block;
16   width: 50%;
17   padding: 5px;
18   float: left
19 }
20 
21 .section-video ul.list li a {
22   display: block;
23   width: 100%;
24   color: #fff;
25   text-decoration: none;
26 }
27 
28 .section-video ul.list li .img {
29   width: 100%;
30   position: relative; // 使用相对定位
31   height: 0; // 高度设置为0,使用padding来设置高度
32   overflow: hidden;
33   padding-bottom: 54.545454%; // 使用padding-top也可,使用padding来撑高容器,高度为宽度的 54.545454%
34 }
35 
36 .section-video ul.list li .img img {
37   position: absolute; // 使用绝对定位
38   width: 100%; // 宽高为容器的宽高
39   height: 100%;
40   top: 0;
41   left: 0
42 }
43 
44 .section-video ul.list li .img .time {
45   position: absolute;
46   display: inline-block;
47   right: 0;
48   bottom: 15px;
49   font-size: 12px;
50   line-height: 18px;
51   background-color: rgba(0, 0, 0, .48);
52   border-top-left-radius: 8px;
53   border-bottom-left-radius: 8px;
54   padding: 0 10px
55 }
56 
57 .section-video ul.list li .title {
58   display: block;
59   line-height: 18px;
60   padding: 4px 0;
61   height: 40px;
62   overflow: hidden;
63   text-overflow: ellipsis
64 }

 

这种情况及时配置的图片有点小误差,我们也可以忽略。

使用优化方案后,当图片加载不出来的时候,容器的位置不会消失,如下图:

那么对于体验上来说,整个页面不会在图片加载的时候出现撑高的情况。

 

解决方案代码演示:https://jsfiddle.net/boxiang_hbx/wrf4xshn/3/

当前两张图没有load出来的时候,代码演示:https://jsfiddle.net/boxiang_hbx/wrf4xshn/4/

 

改优化方案可以巧妙地用于其他布局的地方,不限于图片,有问题,欢迎讨论!

 

尊重版权,转载请说明出处!

 

目录
相关文章
|
3月前
|
前端开发
如何设置 CSS 盒子模型的边框样式?
CSS盒子模型的边框样式可以通过`border`属性设置,包括边框宽度、样式和颜色。例如:`border: 2px solid red;` 设置了2像素宽的红色实线边框。也可分别设置四边,如`border-top`、`border-right`等。
|
2月前
|
前端开发
在Webpack配置文件中,如何配置loader以处理其他类型的文件,如CSS或图片
在Webpack配置文件中,通过设置`module.rules`来配置loader处理不同类型的文件。例如,使用`css-loader`和`style-loader`处理CSS文件,使用`file-loader`或`url-loader`处理图片等资源文件。配置示例:在`rules`数组中添加对应规则,指定`test`匹配文件类型,`use`指定使用的loader。
|
3月前
|
前端开发
css 设置背景色渐变、字体颜色渐变
css 设置背景色渐变、字体颜色渐变
|
17天前
|
JavaScript 容器
jquery和CSS3图片排序过滤搜索插件
Filterizr是一款jquery和CSS3图片排序过滤插件。它可以对一组图片进行排序,按条件过滤和按关键字搜索。并在显示结果时使用指定的CSS3动画过渡效果。
24 2
|
1月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
111 7
|
2月前
|
编解码 前端开发 UED
探讨了CSS媒体查询在移动端开发中的应用,介绍了媒体查询的基本概念、常见条件及其在响应式布局、导航菜单、图片优化和字体调整等方面的具体应用
本文深入探讨了CSS媒体查询在移动端开发中的应用,介绍了媒体查询的基本概念、常见条件及其在响应式布局、导航菜单、图片优化和字体调整等方面的具体应用。通过实际案例分析和注意事项的讨论,旨在帮助开发者更好地理解和运用媒体查询,提升移动端用户体验。
48 4
|
2月前
|
弹性计算 运维 开发者
后端架构优化:微服务与容器化的协同进化
在现代软件开发中,后端架构的优化是提高系统性能和可维护性的关键。本文探讨了微服务架构与容器化技术如何相辅相成,共同推动后端系统的高效运行。通过分析两者的优势和挑战,我们提出了一系列最佳实践策略,旨在帮助开发者构建更加灵活、可扩展的后端服务。
|
2月前
CSS3实现的九宫格图片鼠标悬停去除遮罩层源码
CSS3实现的九宫格图片鼠标悬停去除遮罩层源码
20 0
CSS3实现的九宫格图片鼠标悬停去除遮罩层源码
|
2月前
|
前端开发 JavaScript UED
|
3月前
|
前端开发 UED
Webpack 中处理 CSS 和图片资源的多 Loader 配置
【10月更文挑战第12天】 处理 CSS 和图片资源是 Webpack 配置中的重要部分。通过合理选择和配置多个 Loader,可以实现对这些资源的精细处理和优化,提升项目的性能和用户体验。在实际应用中,需要不断探索和实践,根据项目的具体情况进行灵活调整和优化,以达到最佳的处理效果。通过对 Webpack 中多 Loader 处理 CSS 和图片资源的深入了解和掌握,你将能够更好地应对各种复杂的资源处理需求,为项目的成功构建和运行提供坚实的基础。
91 1