Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >让图片完美适应:掌握 CSS 的object-fit与object-position

让图片完美适应:掌握 CSS 的object-fit与object-position

作者头像
前端小智@大迁世界
发布于 2024-02-12 00:40:15
发布于 2024-02-12 00:40:15
2.1K15
代码可运行
举报
文章被收录于专栏:终身学习者终身学习者
运行总次数:5
代码可运行

免费体验 Gpt4 plus 与 AI作图神器,我们出的钱 体验地址:体验

CSS中,我们可以使用 background-sizebackground-position属性为背景图像设置大小和位置。而 object-fitobject-position 属性则允许我们对嵌入的图像(以及其他替代元素,如视频)做类似的操作。在本文中,我们将深入探讨如何使用 object-fit 将图像适应到特定的空间中,以及如何使用 object-position 在该空间中进行精确定位。

object-fit 作用

有时,图像的大小超出了我们希望的空间。在过去,我们要么在图像编辑器中裁剪图像,要么通过设置宽度/或高度约束来调整图像大小(这不是一个完美的选择),或者执行某种复杂的裁剪,或者可能转而使用背景图像(如果图像不仅仅是为了装饰的话)。

object-fit 属性为图像提供了background-size为背景图像所做的功能:它为图像在指定区域内的显示提供了选项,如果需要,可以隐藏部分图像。这个指定的区域可能有固定的宽度和高度,或者可能是一个更具响应性的空间,如根据浏览器视口大小变化的网格区域。

object-fit 工作原理

每个HTML元素都有自己的“content box”,代表它所占据的空间。默认情况下,图像的内容框与图像的自然尺寸相匹配。

当我们为图像应用不同的宽度和/或高度时,我们实际上是在改变内容框的尺寸。如果内容框的尺寸发生变化,图像仍然会填充内容框。所以,如果我们有一个300px300px的图像,并将其尺寸设置为300px200px,图像会出现扭曲。

object-fit 属性为我们提供了图像在该调整后的内容框内显示的选项。而不是让它出现扭曲,我们可以隐藏图像的一部分,或者强制图像只部分填充其内容框,这样它就完全可见且不会扭曲。

设置

为了详细说明 object-fit 属性的工作原理,我们将图像放在一个使用Grid布局居中的 div 中。div 有一个棕色的背景,以及由::before伪元素提供的虚线边框,这将帮助我们理解图像发生了什么。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// html
<article>
  <div>
    
  </div>
</article>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// css
article {
  display: grid; 
  grid-template: 1fr 200px 1fr / 1fr 300px 1fr; 
  height: 100vh;
}

div {
  grid-row: 2; 
  grid-column: 2;
  background-color: brown;
  position: relative;
}

div::before {
  content: "";
  position: absolute;
  inset: -5px;
  border: 5px dashed white;
}

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  background: #30353b; 
}

在图像演示中,我们将使用以下图像,其自然尺寸为 400px x 600px .

我们的图像比我们的div大得多,如果我们将图像放在div内,它会溢出,如下所示。

我们的目标是防止图像从其容器中爆裂出来,但也要让它舒适地适应其中,object-fit 将帮助我们做到这一点。

如果我们使用背景图像,我们可以设置类似background-size: cover,背景图像将被限制在容器的区域内。但正如我们所看到的,为了让 object-fit 发挥作用,我们首先需要在图像的内容框上定义一个与其自然大小不同的高度和宽度。在下面的示例中,我们将图像的宽度和高度限制为100%,这样其内容框就与容器div的大小相匹配:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
img {
  width: 100%;
  height: 100%;
}

图像及其内容框现在紧密地适应容器,但图像严重扭曲。这就是object-fit的魔法来拯救我们的地方,所以让我们看看它有什么提供。

使用 object-fit 将图像适应容器

object-fit 属性为我们提供了五个主要的关键字值,以确定我们的图像如何在其容器内显示。其中两个关键字——covercontain——与它们的background-size对应项执行相同的角色。

object-fit: cover

cover 值强制图像完全覆盖容器的区域,尽可能多地显示图像,而不会扭曲它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

因为图像相当高,我们看到的是其完整的宽度,但不是其完整的高度,如下图所示。

cover 值确保图像的较窄部分完全填充容器。

值得注意的是,图像的定位。与background-position默认为0 0(从容器的左上角定位背景图像)不同,object-position 的默认值是50% 50%,将图像居中于其内容框。当我们稍后查看object-position属性时,我们将学习如何指定图像的可见部分。

object-fit: contain

contain 值强制图像完全适应其内容框,但不会扭曲。图像保持其自然的宽高比,因此不会填满其容器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
img {
  width: 100%;
  height: 100%;
  object-fit: contain;
}

你可能会认为,只需在图像上设置height: 100%就可以得到上面的相同结果。但实际上并不完全如此,因为这样会使图像定位到左边,而不是居中,这是object-fit的默认设置。结合object-positionobject-fit为图像在容器内的定位提供了更多的选项。

object-fit: none

none 属性允许图像保持其自然的原始尺寸。只有可以适应调整后的内容框的部分才是可见的。

object-fit: cover不同,我们的图像不会被强制在至少一个轴上完全可见。原始图像的宽度和高度都大于内容框,所以它在两个方向上都溢出,如下图所示。none 值保持图像的正常大小,因此在容器中看不到图像的顶部、底部和两侧。

再次注意,默认情况下,图像的中心与内容框的中心对齐。

还要注意,object-fit: none 并不意味着 object-fit 什么都不做。正如我们所看到的,与完全没有 object-fit 设置相比,它做了很多工作。(

object-fit: scale-down

scale-down 属性与 nonecontain 相同。它选择使图像显示得更小的那个。

显然,在我们当前的示例中,它会选择 contain,因为我们的容器比图像小。如果我们的容器比图像大,none 会占主导地位,图像会保持其自然大小,而不是在一个方向上填充容器

object-fit: fill

如果我们在演示中将 object-fit 值更改为 fill,就好像根本没有设置 object-fit。这是因为,默认情况下,图像无论设置了什么尺寸都会填充其内容框。

因为 fill 属性可能会扭曲图像,所以在大多数情况下,它可能不是最好的选择。

使用 object-fit 而不使用容器

在上面的示例中,我们一直在使用 object-fit 来调整 div 容器内的图像大小,但我们在实践中看到的原理在没有容器的情况下同样适用。重要的是图像的内容框的大小以及图像在该框内的显示方式。

例如,我们可以将以下CSS应用于图像,而不需要任何周围的 div

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
img {
  width: 300px;
  height: 300px;
  object-fit: contain;
}

尝试更改上面的Pen中object-fit属性的值为 coverfillscale-downnone,看看每个的行为如何。结果与图像设置为宽度和高度为 100% 并包含在一个设置为 300px300pxdiv 中的结果相同。

在响应式布局中使用 object-fit

object-fit 属性在图像的指定区域的尺寸响应浏览器视口大小的情况下可能最有用。以下演示将我们的图像分配给一个特定的、灵活的网格区域:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  grid-row: 2 / 3; 
  grid-column: 2 / 3;
}

article {
  display: grid; 
  grid-template: 5% 1fr 10% / 40% 1fr 40%; 
  height: 100vh;
}

随着视口和网格区域的扩展和收缩,cover 值确保图像始终很好地适应其网格区域,改变图像的可见部分,使其永远不会扭曲。

使用 object-position 设置图像的位置

正如 background-position 用于设置容器内背景图像的位置一样,object-position 属性用于控制图像元素在其自己的内容框内的位置。

正如我们所看到的,object-position 默认为 50% 50%,这意味着图像的中心与其内容框的中心对齐。我们可以使用一系列的关键字值(如 topbottomleftrightcenter)或使用长度值(如pxem%)或两者的组合来更改这一点。

假设我们现在想要从右下角定位我们的图像。我们可以使用关键字 right bottom,或百分比值100% 100%

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: right bottom; /* or 100% 100% */
}

我们还可以使用像像素或 ems这样的单位偏移图像从其容器。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 20px 2em; /* 20px from left and 2em from top */
}

我们可以通过结合单位和关键字来从右下角进行类似的偏移,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: right 20px bottom 2em; /* 20px from right and 2em from bottom */
}

我们已经看到,我们可以使用百分比来定位图像在其内容框中。与 background-position 属性一样,使用百分比与 object-position 可能会有点混淆。object-position50% 50% 意味着图像的中心与其内容框的中心在水平和垂直轴上对齐。

如果我们将 object-position 设置为 20% 40%,这意味着图像左边 20% 的垂直线与内容框左边20% 的垂直线重合,图像顶部40% 的水平线与内容框顶部40%的水平线重合,如下图所示。

图像和容器的20%40%的垂直和水平线对齐

结论

object-fit 属性设计用于与任何类型的替代元素一起工作,如图像、视频、iframes 和embeds。如何将像视频这样的元素适应到定义的区域(其中一些元素可能被隐藏)可能是一个值得讨论的问题,但毫无疑问,这里有可行的用例。更好的选择可能是将iframe的宽度设置为可用空间的width: 100%,然后使用aspect-ratio属性来保持其比例。

更常见的是,有一个图像需要适应的特定空间,所以 object-fit 对于允许图像适应该空间而不被扭曲(即使其中一部分必须被隐藏)非常有用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
可以,大佬,互粉一下
可以,大佬,互粉一下
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
简单说 CSS中的 object-fit 与 object-position
版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。 https://blog.csdn.net/FE_dev/article/details/78249063
FEWY
2019/05/26
1K0
简单说 CSS中的 object-fit 与 object-position
全栈之前端 | 9.CSS3基础知识之图像元素样式学习
描述: 好久没更新此《#前端学习之路》专栏文章了,不知道学习前端看友们想不想我,所以这一段时间又开始整理更新了。通过前面几章的学习,相信大家已经对CSS有了一个简单的了解吧,现在我们又回到使用频率较高的 文本 text、图像 images、媒体 media、表单 table 等元素CSS样式的设置,此章节主要讲解针对图像的相关CSS属性以其使用的示例演示。
全栈工程师修炼指南
2023/12/18
6330
全栈之前端 | 9.CSS3基础知识之图像元素样式学习
CSS3 object-fit和object-position
本文主要介绍了CSS3中的object-fit和object-position两个属性,它们可以用于处理替换元素的自适应问题。其中,object-fit属性控制替换元素在容器内的缩放和位置,而object-position属性则控制替换元素相对于容器的位置。这些属性可以为不同的替换元素设置不同的属性值,以实现不同的布局效果。
IMWeb前端团队
2018/01/08
1.2K0
CSS3 object-fit和object-position
img标签实现和背景图一样的显示效果——object-fit和object-position
不知大家在做前端页面的时候,有没有遇到类似这样的问题:有一个不是正方形的图片,可能是宽度大于高度的,也可能是高度大于宽度的,而你又并不想用背景图的方式来做,要实现用img标签来让此图片显示出一个正方形
用户1174387
2018/03/28
2.8K0
img标签实现和背景图一样的显示效果——object-fit和object-position
深入了解CSS中的object-fit和background-size——CSS图片尺寸控制&应用场景
摘要:在这篇文章中,我们将讨论object-fit和background-size是如何工作的,什么时候可以使用它们,为什么,以及一些实际的使用案例和建议。让我们深入了解一下。
智影Yodonicc
2022/05/07
3.3K0
深入了解CSS中的object-fit和background-size——CSS图片尺寸控制&应用场景
那些不常见,但却非常实用的css属性(整理不易)
可以把 块容器 中的内容限制为指定的行数。并且在超过行数后,在最后一行显示"..."
winty
2020/06/16
2.5K0
那些不常见,但却非常实用的css属性(整理不易)
使用 object-fit 属性完美过渡图片
5、 如果想改变图片的显示位置,我们可以对其设置 object-position: right top 属性:
白雾茫茫丶
2024/05/22
3140
使用 object-fit 属性完美过渡图片
CSS | object-fit: 炒鸡方便的图片居中方法
今天在项目中遇到图片居中的问题,嗯,之前也有写过解决这个问题的文章,有n种方法。不过今天要说一个新的方案:object-fit ,嗯,这个才是真的方便的方案啊。
疯狂的技术宅
2019/03/28
1.6K0
CSS | object-fit: 炒鸡方便的图片居中方法
「译」前端项目中常见的 CSS 问题
快速摘要:近年来,跨浏览器的渲染和交互已经愈加一致。不过,它仍然没有达到完全一致,有很多小问题会让你出错。除了这些问题之外,还有不同的屏幕尺寸、语言偏好和明显的人为错误等不确定因素,我们从中发现了许多会让开发者出错的小问题。
Chor
2019/11/07
2.4K0
现代图片性能优化及体验优化指南 - 缩放精细化展示及避免布局偏移、拉伸
图片资源,在我们的业务中可谓是占据了非常大头的一环,尤其是其对带宽的消耗是十分巨大的。
Sb_Coco
2023/03/01
1.3K0
现代图片性能优化及体验优化指南 - 缩放精细化展示及避免布局偏移、拉伸
22 个鲜为人知的 CSS 高招让你技高一筹
英文 | https://betterprogramming.pub/22-css-tricks-that-can-make-you-a-layout-ninja-452847fba639
前端达人
2021/09/08
1.1K0
小智在这3年开发中遇到的 CSS 问题及解决方案,有大佬帮他总结好了 !
在浏览器中实现用户界面时,请尽可能减少浏览器带来的差异,以使用户界面具有可预测性。 跟踪所有这些差异很困难,因此,我整理了一些常见问题及其解决方案方便大家查看。
前端小智@大迁世界
2020/06/16
4.2K0
小智在这3年开发中遇到的 CSS 问题及解决方案,有大佬帮他总结好了 !
【译】Web中的图像技术总结,前端开发中各种图片引入的优点缺点及实例
前端开发人员在构建网站时需要做出的决定之一就是添加图片的技术。它可以是HTML <img>,也可以是通过CSS背景生成的图片,也可以是SVG <image>。选择正确的技术很重要,并且可以在性能和可访问性方面发挥巨大作用。
张张
2020/04/27
6.1K0
【译】Web中的图像技术总结,前端开发中各种图片引入的优点缺点及实例
新提案,初识CSS的object-view-box属性
在开发时,一直希望有一种原生的CSS方式来裁剪图片,并将其定位在我需要的任何方向。这可以通过使用一个额外的HTML元素和不同的CSS属性来实现,后面解释。
前端小智@大迁世界
2022/06/12
1K0
新提案,初识CSS的object-view-box属性
前端系列第3集-如何理解css盒子型?
CSS盒子模型是一种设计网页布局的概念,它将每个HTML元素表示为一个盒子,该盒子由内容、内边距、边框和外边距组成,这些部分共同构成了一个完整的盒子模型。
达达前端
2023/10/08
6770
前端系列第3集-如何理解css盒子型?
img固定宽度和高度,不规则图片变形问题的解决方法
日常项目中,后端传图不规则,比例大小不一。前端又要去做适应,是一个让人非常头大的问题。
德顺
2019/11/12
10.9K0
不会 CSS 网格布局,你的网页可能会落伍!
友儿
2024/08/20
1970
前端运用图片的技巧总结
原文 | https://ishadeed.com/article/image-techniques/
前端老道
2022/03/29
2.9K0
前端运用图片的技巧总结
web 图像技术:前端引入图片的各种方式及其优缺点
前端开发人员在构建网站时需要做的一个决定是引入图片的方式。它可以是<img>标签,或者是通过CSS background 属性,还可以使用 SVG <image>。选择正确的方式是很重要的,它对性能和可访问性有很大的影响。
前端小智@大迁世界
2020/05/12
5.5K0
web 图像技术:前端引入图片的各种方式及其优缺点
图片布局的最全实现方式都在这了!附源码
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
六小登登
2019/10/25
1.5K0
推荐阅读
相关推荐
简单说 CSS中的 object-fit 与 object-position
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验