ChatGPT解决这个技术问题 Extra ChatGPT

CSS图像大小,如何填充,但不拉伸?

我有一张图片,我想为它设置一个特定的宽度和高度(以像素为单位)

但是如果我使用 css (width:150px; height:100px) 设置宽度和高度,图像会被拉伸,并且可能很难看。

如何使用 CSS 将图像填充到特定大小,而不是拉伸它?

填充和拉伸图像的示例:

原图:

https://i.stack.imgur.com/2OrtT.jpg

拉伸图像:

https://i.stack.imgur.com/L1ihk.jpg

填充图像:

https://i.stack.imgur.com/vwi7R.jpg

请注意,在上面的填充图像示例中:首先,图像被调整为 150x255(保持纵横比),然后将其裁剪为 150x100。

尝试仅设置 widthheight 应相应调整
拉伸图像。看到这个:jsfiddle.net/D7E3E
它需要一部分图像而不是调整大小!
Chris Coyier 对此也有一些很好的解决方案:css-tricks.com/perfect-full-page-background-image
非常重要:对于 SEO 而言,这是一种非常糟糕的做法。如果您将它用作背景图像,那么它可以正常工作,但如果您希望 Google 找到该图像,如果它只是背景图像,它将不会被索引。

a
afonsoduarte

您可以使用 css 属性 object-fit("设置如何调整被替换元素的内容,例如 <img><video>,以适应其容器。")

.cover { 对象适合:封面;宽度:50px;高度:100px; }

See example here

IE 有一个 polyfill:https://github.com/anselmh/object-fit

相关: object-position (指定元素内容在其框内的对齐方式。)


有趣的是,这也可以使用 img 标签来完成(不仅仅是上面答案中描述的 background-image 方法)。谢谢 :)
不幸的是,background-size 在我的项目中很少是可行的解决方案。您不太可能获得任何 SEO 好处,并且无法提供 ALT 标签、标题等来伴随您可能希望为屏幕阅读器提供额外上下文的图像。
这很酷,但没有 IE 支持。所有的 polyfill 都不再起作用了。
只需使用 object-fit: cover; 即可。非常感谢
现在支持它的 2017 浏览器应该会增加。当图像更大时,“缩小”会提供更好的选择。 scale-down
j
johannchopin

如果你想将图像用作 CSS 背景,有一个优雅的解决方案。只需在 background-size CSS3 属性中使用 covercontain

.container { 宽度:150px;高度:100px;背景图片:url(“http://i.stack.imgur.com/2OrtT.jpg”);背景尺寸:封面;背景重复:不重复;背景位置:50% 50%; }

cover 会为您提供放大的图像,而 contain 将为您提供缩小的图像。两者都将保留像素纵横比。

http://jsfiddle.net/uTHqs/(使用封面)

http://jsfiddle.net/HZ2FT/(使用包含)

根据 Thomas Fuchs' quick guide.,这种方法的优点是对 Retina 显示器友好

值得一提的是,浏览器支持这两个属性 excludes IE6-8.


由于您可以完全在 CSS 中调整图像大小,因此您可以使用大图像,然后通过使用媒体查询根据每个设备的像素密度将其缩小。
你能解释一下为什么在这种情况下背景位置似乎表示图像中心的位置而不是左上角吗?这是背景大小的结果:封面吗?
我的只是覆盖整个 DIV 扩展图像。我没有看到曲线结束。
background-repeat: no-repeat; 有什么用?如果图像覆盖了它的容器,它无论如何都不会重复。
“背景位置”也可以设置为“中心中心”。例如:.container { ... 背景位置:中心中心; }
H
Hakan Fıstık

accepted answer by @afonsoduarte 的增强功能。
如果您使用的是 bootstrap

在样式上提供宽度:100%。如果您使用引导程序并希望图像拉伸所有可用宽度,这将很有帮助。指定高度属性是可选的,您可以根据需要删除/保留它 .cover { object-fit: cover;宽度:100%; /*高度:300px;可选的,你可以删除它,但在我的情况下它很好 */ } 顺便说一下,不需要在图像元素上提供高度和宽度属性,因为它们将被样式覆盖。所以写这样的东西就足够了。


正是我想要的。
你需要一个吻!
我必须使用 width: 100% 和 height: 100% 来占用两个方向的所有空间。
H
Hakan Fıstık

唯一真正的方法是在您的图像周围放置一个容器并使用 overflow:hidden

HTML

<div class="container"><img src="ckk.jpg" /></div>

CSS

.container {
    width: 300px;
    height: 200px;
    display: block;
    position: relative;
    overflow: hidden;
}

.container img {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
}

在 CSS 中做你想做的事情并将图像居中是一件痛苦的事情,在 jquery 中有一个快速修复,例如:

var conHeight = $(".container").height();
var imgHeight = $(".container img").height();
var gap = (imgHeight - conHeight) / 2;
$(".container img").css("margin-top", -gap);

http://jsfiddle.net/x86Q7/2/


谢谢。它有效,但它从 top 裁剪图像。 (请参阅:jsfiddle.net/x86Q7)是否有任何方法可以从 center 裁剪图像?
@MahdiGhiasi:更改 .container img css 中的顶部和左侧属性!
我可以通过例如 50px 设置 margin-top 的图像(参见:jsfiddle.net/x86Q7/1 ),但是如何从真正的 center 裁剪它? (没有jQuery?)
啊抱歉没有看到你的评论,但我添加了 jquery 以防万一:)
很好的解决方案!对我来说,垂直填充比水平填充更重要,所以我只需将“.container img”类的“宽度:100%”更改为“高度:100%”。谢谢!
H
Hakan Fıstık

CSS解决方案无JS无背景图:

方法 1“margin auto”(IE8+ - NOT FF!):

div{宽度:150px;高度:100px;位置:相对;溢出:隐藏; } div img{ 位置:绝对;顶部:0;底部:0;边距:自动;宽度:100%; }

原文:

image

包装:

image

http://jsfiddle.net/5xjr05dt/

方法2“转换”(IE9+):

div{宽度:150px;高度:100px;位置:相对;溢出:隐藏; } div img{ 位置:绝对;宽度:100%;最高:50%; -ms-transform: translateY(-50%); -webkit-transform: translateY(-50%);变换:translateY(-50%); }

原文:

image

包装:

image

http://jsfiddle.net/5xjr05dt/1/

方法 2 可用于在固定宽度/高度的容器中将图像居中。两者都可能溢出 - 如果图像小于容器,它仍然会居中。

http://jsfiddle.net/5xjr05dt/3/

方法 3“双重包装”(IE8+ - NOT FF!):

.outer{ 宽度:150px;高度:100px;边距:200px 自动; /* 仅举例 */ 边框:1px 纯红色; /* 只是举例 */ /* 溢出:隐藏; */ /* 开启此功能 */ position: relative; } .inner { 边框:1px 纯绿色; /* 举例 */ position: absolute;顶部:0;底部:0;边距:自动;显示:表格;左:50%; } .inner img { 显示:块;边框:1px 纯蓝色; /* 举例 */ position: relative;对:50%;不透明度:0.5; /* 只是举例 */ }

image

http://jsfiddle.net/5xjr05dt/5/

方法4“双包装和双图像”(IE8+):

.outer{ 宽度:150px;高度:100px;边距:200px 自动; /* 仅举例 */ 边框:1px 纯红色; /* 只是举例 */ /* 溢出:隐藏; */ /* 开启此功能 */ position: relative; } .inner { 边框:1px 纯绿色; /* 举例 */ position: absolute;最高:50%;底部:0;显示:表格;左:50%; } .inner .real_image { 显示:块;边框:1px 纯蓝色; /* 举例 */ position: absolute;底部:50%;对:50%;不透明度:0.5; /* 仅举例 */ } .inner .placeholder_image{ opacity: 0.1; /* 应该是 0 */ }

image image

http://jsfiddle.net/5xjr05dt/26/

方法 1 的支持稍好一些 - 您必须设置图像的宽度或高度!

带有前缀的方法 2 也有不错的支持(从 ie9 开始) - 方法 2 在 Opera mini 上不支持!

方法 3 使用两个包装器 - 可以溢出宽度和高度。

方法 4 使用双图像(一个作为占位符),这会带来一些额外的带宽开销,但更好的跨浏览器支持。

方法 1 和 3 似乎不适用于 Firefox


这是唯一真正有效的(减去 js 解决方案)。谢谢!
它仅限于溢出高度或宽度,但这是一个有趣的解决方案。
@Jake - 使用上面的方法 2 可能会溢出宽度和高度 - 请使用额外的小提琴查看我更新的答案。
是的。这绝对是一个很好的答案。我会再玩弄它一些。对于需要响应的宽而不是高的图像来说,这有点古怪,但是有很多应用程序可以做到这一点。
@Jake - 很酷 - 我找到了第三种方法来进行水平居中。我扩展了这种方法以支持垂直居中。我将把我的添加作为上面的第三种方法发布。似乎它是 IE7+ 证明(甚至可能更低)。这是原始答案:stackoverflow.com/questions/3300660/…
e
earl3s

不需要图像作为背景的解决方案,并且会自动调整大小而不会被切断或扭曲。

另一种解决方案是将图像放入具有所需宽度和高度的容器中。使用此方法,您不必将图像设置为元素的背景图像。

然后,您可以使用 img 标记并在元素上设置最大宽度和最大高度。

CSS:

.imgContainer {
    display: block;
    width: 150px; 
    height: 100px;
}

.imgContainer img {
    max-width: 100%;
    max-height: 100%;
}

HTML:

<div class='imgContainer'>
    <img src='imagesrc.jpg' />
</div>

现在,当您更改容器的大小时,图像将自动增长到尽可能大,而不会超出界限或扭曲。

如果要将图像垂直和水平居中,可以将容器 css 更改为:

.imgContainer {
    display: table-cell;
    width: 150px; 
    height: 100px;
    text-align: center;
    vertical-align: middle;
}

这是一个 JS Fiddle http://jsfiddle.net/9kUYC/2/


它与 CSS 中的封面不同,其中一个结果尺寸总是超过 100%(或在边缘情况下相等)
不,这个解决方案确保它永远不会超过 100%,这是问题的一部分。他们不想让图像扭曲或超出原始尺寸。
问题是“如何填充”,带有一个填充图像的例子,这显然是裁剪的。
但是,如果您需要图像具有响应性怎么办?定义特定的宽度和高度是行不通的😕
这正是我所需要的。谢谢!
d
dmegatool

不使用css背景

只有 1 个 div 可以剪辑它

调整到最小宽度而不是保持正确的纵横比

从中心裁剪(垂直和水平,您可以使用顶部、左侧和变换进行调整)

如果您使用主题或其他东西,请小心,他们通常会声明 img max-width 为 100%。你必须不做任何事情。测试一下:)

https://jsfiddle.net/o63u8sh4/

<p>Original:</p>
<img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>

<p>Wrapped:</p>
<div>
    <img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
</div>


div{
  width:150px; 
  height:100px; 
  position:relative;
  overflow:hidden;
}
div img{
  min-width:100%;
  min-height:100%;
  height:auto;
  position:relative;
  top:50%;
  left:50%;
  transform:translateY(-50%) translateX(-50%);
}

这是我一直在寻找的答案。
这是我很久以来想做的,谢谢;)
图像本身的 min-width:100% 和 min-height:100% 与此问题的所有音调和网络上的等效问题相比有所不同!
r
ramdog

使用 jQuery 建立@Dominic Green 的答案,这里有一个解决方案应该适用于比它们高或比它们宽的图像。

http://jsfiddle.net/grZLR/4/

可能有一种更优雅的方式来处理 JavaScript,但这确实有效。

function myTest() {
  var imgH = $("#my-img").height();
  var imgW = $("#my-img").width();
  if(imgW > imgH) {
    $(".container img").css("height", "100%");
    var conWidth = $(".container").width();
    var imgWidth = $(".container img").width();
    var gap = (imgWidth - conWidth)/2;
    $(".container img").css("margin-left", -gap);
  } else {
    $(".container img").css("width", "100%");
    var conHeight = $(".container").height();
    var imgHeight = $(".container img").height();
    var gap = (imgHeight - conHeight)/2;
    $(".container img").css("margin-top", -gap);
  }
}
myTest();

A
Aidan Feldman

我帮助构建了一个名为 Fillmore 的 jQuery 插件,它处理支持它的浏览器中的 background-size: cover,并为不支持它的浏览器提供了一个 shim。给它看看!


M
Manoj Selvin

这会将图像填充到特定大小,而不拉伸或裁剪

img{
    width:150px;  //your requirement size
    height:100px; //your requirement size

/*Scale down will take the necessary specified space that is 150px x 100px without stretching the image*/
    object-fit:scale-down;
}

O
Om Fuke

阅读 StackOverflow 的答案后,我得到的简单解决方案是

.profilePosts div {

background: url("xyz");
background-size: contain;
background-repeat: no-repeat;
width: x;
height: y;

}

w
woutr_be

尝试这样的事情:http://jsfiddle.net/D7E3E/4/

使用带有溢出的容器:隐藏

编辑:@Dominic Green 打败了我。


谢谢。它有效,但它从 top 裁剪图像。 (请参阅:jsfiddle.net/x86Q7)是否有任何方法可以从 center 裁剪图像?
CSS 可能相当困难,这是我能想到的最好的jsfiddle.net/D7E3E/5
是的,要使其正确居中,您应该使用 jQuery,可能会容易得多。
N
Nodira

我认为这个答案已经很晚了。无论如何,希望这将有助于未来的人。我遇到了以角度定位卡片的问题。显示了一系列事件的卡片。如果事件的图像宽度对于卡片来说很大,则图像应通过从两侧裁剪和高度为 100% 的方式显示。如果图像高度较长,则图像底部被裁剪,宽度为 100%。这是我的纯CSS解决方案:

https://i.stack.imgur.com/cNPxd.png

HTML:

 <span class="block clear img-card b-b b-light text-center" [ngStyle]="{'background-image' : 'url('+event.image+')'}"></span>

CSS

.img-card {
background-repeat: no-repeat;
background-size: cover;
background-position: 50% 50%;
width: 100%;
overflow: hidden;
}

我无法理解这是如何工作的,但确实如此。您需要在相对定位的父级内绝对定位跨度 top:0;right:0;bottom:0;left:0 以对其进行尺寸标注。
感谢您的反馈,亲爱的迈克,如果这有帮助,我很高兴。你想让我用你的评论更新答案吗?
M
Mohammadreza Askari

你可以通过'flex'显示来做到这一点。为了我!:

.avatar-img { 显示:弹性;证明内容:中心;对齐项目:拉伸;边界半径:50%;边框:1px 实心#dee2e6;高度:5.5rem;宽度:5.5rem;溢出:隐藏; } .avatar-img > img { flex-grow: 1;适合对象:封面; }

Test!'s个人资料照片
Test!'s profile photo


很简单也很有效,谢谢。
@mqbakamqbaka 欢迎您,并感谢您的反馈。
s
suyash1798

要全屏显示图像,请尝试以下操作:

背景重复:圆形;


u
user3181614
<div class="container">
     <img src="http://i.stack.imgur.com/2OrtT.jpg"/>
</div>

<style>
.container {
       width: 150px;
       height: 100px;
       overflow: hidden;
}
</style>

l
lewishole

据我所知,有一个插件可以使这变得简单。

jQuery Plugin: Auto transform <img> into background style

<img class="fill" src="image.jpg" alt="Fill Image"></img>

<script>
    $("img.fill").img2bg();
</script>

此外,这种方式也满足了可访问性的需求。由于此插件不会从您的代码中删除您的 标签,因此屏幕阅读器仍会告诉您 ALT 文本而不是跳过它。


R
Rohan Devaki

您必须在 css 中使用 background-size : cover

js代码

 <div>
   <div className={styles.banner}>banner</div>
 </div>

CSS代码

.banner{
  background: 
    url("./images/home-bg.jpg");
  background-size: cover;
  height: 53rem;
  width: 100%;
}

对象拟合不起作用

背景大小:包含也不起作用