图片在固定宽高盒子中的显示问题

简介: 我们经常可能会遇到这样一个情况:在一个固定宽高的盒子中,要放置一张宽高比不定的图片(比如说后台上传的图片),这时候图片应该如何设置样式呢?有人可能会说,那还不简单,图片宽高设置成父级盒子的宽高不就行了?举个例子:/*HTML*/ /*CSS*/.

我们经常可能会遇到这样一个情况:

在一个固定宽高的盒子中,要放置一张宽高比不定的图片(比如说后台上传的图片),这时候图片应该如何设置样式呢?

有人可能会说,那还不简单,图片宽高设置成父级盒子的宽高不就行了?

举个例子:

/*HTML*/
<div class="image">
    <img src="imgs/img.jpg"/>
</div>
/*CSS*/
.image{ width: 400px; height: 200px;}
.image img{ width: 100%; height: 100%;}

结果很显然,如果图片比例与父级盒子比例不对,则很容易造成图片变形:

图一

所以我们往往会直接不限制图片的高度,让图片溢出部分隐藏。

/*CSS*/
.image{ width: 400px; height: 200px; overflow: hidden;}
.image img{ width: 100%;}
图二

但是这并不是最佳的显示效果,最佳效果应该是让整个图片居中放置。所以有些人可能会用JS去计算,而有些人直接就用背景图片替代,因为背景图片可以直接设置background-size: cover,效果就像这样:

图三

然而,事实上,还有一种既可以不用JS,又可以不用背景图片的完美解决方案。

那就是使用CSS中的object-fit属性。

一、object-fit 属性的用法介绍

该属性一般作用于图片或视频标签上,主要有以下五种属性值:

fill(不保持纵横比缩放图片,使图片完全适应)
contain(保持纵横比缩放图片,使图片的长边能完全显示出来)
cover(保持纵横比缩放图片,只保证图片的短边能完全显示出来)
none(保持图片宽高不变)
scale-down(当图片实际宽高小于所设置的图片宽高时,显示效果与none一致;否则,显示效果与contain一致)

当然还有三个基本上不用的属性,它们显示的效果相当于未设置该属性,本文不做细讲。

inherit
initial
unset

接下来以具体实例分别讲讲以上五个主要的属性值。

/*HTML*/
<img src="imgs/img.jpg"/>

1. fill

/*CSS*/
img{ width: 400px; height: 200px; object-fit: fill;}

图片可能变形,效果同图一。

2. contain

/*CSS*/
img{ width: 400px; height: 200px; object-fit: contain; background: #eee;}

类似于background-size: contain,图片可以完整显示,如图四。

图四

3. cover

/*CSS*/
img{ width: 400px; height: 200px; object-fit: cover;}

类似于background-size: cover,图片会被裁切(只有当图片实际宽高比与样式设置的宽高比正好一致时才不会被裁切),效果同图三。

4. none

图片 宽高 保持不变,可能出现以下两种情况。

① 图片实际宽度大于样式设置的宽度(或图片实际高度大于样式设置的高度)

/*CSS*/
img{ width: 400px; height: 200px; object-fit: none;}

图片会被裁切,如图五。(图片实际宽高为512*512)

图五

② 图片实际宽度小于样式设置的宽度(或图片实际高度小于样式设置的高度)

/*CSS*/
img{ width: 600px; height: 600px; object-fit: none; background: #eee;}

图片不会被裁切,如图六。

图六

5. scale-down

图片 宽高比 保持不变,同样也可能出现以下两种情况。

① 图片实际宽度大于样式设置的宽度(或图片实际高度大于样式设置的高度)

/*CSS*/
img{ width: 400px; height: 200px; object-fit: scale-down; background: #eee;}

效果与 object-fit: contain 一致,如图四。

② 图片实际宽度小于样式设置的宽度(或图片实际高度小于样式设置的高度)

/*CSS*/
img{ width: 600px; height: 600px; object-fit: scale-down; background: #eee;}

效果与 object-fit: none 一致,如图六。

二、object-position 属性的用法介绍

object-position属性规定了指定元素的替换内容在其盒子内的对齐方式,与 background-position 类似,默认为居中,该属性实际用到的情况比较少,本文不再具体展开。

三、object-fit与object-position属性的兼容性

兼容性整体还可以,移动端基本没什么问题,只可惜还是IE……

相关文章
AutoJs曲线滑动---贝塞尔曲线
AutoJs曲线滑动---贝塞尔曲线
461 0
配置project.config.json文件报错 解析 project.config.json 文件失败,请检查其内容或删除此文件。
配置project.config.json文件报错 解析 project.config.json 文件失败,请检查其内容或删除此文件。
787 0
配置project.config.json文件报错 解析 project.config.json 文件失败,请检查其内容或删除此文件。
Request failed with status code 400,使用axios.post要发送参数,认真比对原项目,看看有没有忘记什么?
Request failed with status code 400,使用axios.post要发送参数,认真比对原项目,看看有没有忘记什么?
|
机器学习/深度学习 数据采集 算法
【机器学习】K-Means聚类的执行过程?优缺点?有哪些改进的模型?
K-Means聚类的执行过程、优缺点,以及改进模型,包括K-Means++和ISODATA算法,旨在解决传统K-Means算法在确定初始K值、收敛到局部最优和对噪声敏感等问题上的局限性。
318 2
|
Linux API 图形学
深度探索Linux操作系统 —— Linux图形原理探讨2
深度探索Linux操作系统 —— Linux图形原理探讨
211 3
|
算法 计算机视觉 Python
YOLOv8优改系列二:YOLOv8融合ATSS标签分配策略,实现网络快速涨点
本文介绍了如何将ATSS标签分配策略融合到YOLOv8中,以提升目标检测网络的性能。通过修改损失文件、创建ATSS模块文件和调整训练代码,实现了网络的快速涨点。ATSS通过自动选择正负样本,避免了人工设定阈值,提高了模型效率。文章还提供了遇到问题的解决方案,如模块载入和环境配置问题。
676 0
YOLOv8优改系列二:YOLOv8融合ATSS标签分配策略,实现网络快速涨点
|
传感器 数据采集 物联网
探索未来:.NET nanoFramework引领嵌入式设备编程革新之旅
【8月更文挑战第28天】.NET nanoFramework 是一款专为资源受限的嵌入式设备设计的轻量级、高性能框架,基于 .NET Core,采用 C# 进行开发,简化了传统底层硬件操作的复杂性,极大提升了开发效率。开发者可通过 Visual Studio 或 Visual Studio Code 快速搭建环境并创建项目,利用丰富的库和驱动程序轻松实现从基础 LED 控制到网络通信等多种功能,显著降低了嵌入式开发的门槛。
320 0
|
Docker 容器
如何解决Docker容器和宿主机时间同步问题
在使用了Docker以后,大家可能遇到的一个问题就是Docker容器的时间和宿主机时间不同步。造成这个问题的主要原因是宿主机设置了时区,而Docker容器并且设置,导致两者相差8小时。 接下来,我们通过在在宿主机和容器里分别执行date命令来看下实际的情况。 在宿主机执行date命令的结果:
33966 0
|
JSON API 数据格式
uniapp-获取手机型号
uniapp-获取手机型号
653 0
|
弹性计算 运维 负载均衡
中国公有云网络边缘安全即服务第一! SECaaS云上落地
近日,国际权威分析机构IDC最新发布《IDC MarketScape: 中国公有云网络边缘安全即服务(NESaaS)市场,2022 年厂商评估》报告,阿里云在报告中处于绝对领导者位置,营收和能力均位列第一。
557 0