使图像完全填充div而不拉伸

IT技术 javascript html css image
2021-03-14 00:39:59

我有不同尺寸的大图像,需要在两个尺寸上完全填充 240 像素 x 300 像素的容器。这是我现在得到的,仅适用于一维:

http://jsfiddle.net/HsE6H/

HTML

<div class="container">
    <img src="http://placehold.it/300x1500">
</div>
<div class="container">
    <img src="http://placehold.it/1500x300">
</div

CSS

.container {
height: 300px;
width: 240px;
background-color: red;
float: left;
overflow: hidden;
margin: 20px;
}

img {
max-width: 100%;
height: auto;
}

比例应该保持不变。本质上,宽图像应该在宽度上被切断,而highcharts像需要在高度上被切断。因此,只需根据需要放大以填充容器。

不知道为什么我不能让它工作,我需要 JavaScript 吗?

编辑:要清楚。我需要小提琴上的所有红色东西都消失了。进来的图像是动态的,因此我不能使用背景图像。我愿意使用 JavaScript。谢谢!:)

6个回答

自动调整图像大小以适合 Div - 使 CSS 工作

这是一种方法,从以下 HTML 开始:

<div class="container portrait">
    <h4>Portrait Style</h4>
    <img src="http://placekitten.com/150/300">
</div>

和 CSS:

.container {
    height: 300px;
    width: 240px;
    background-color: red;
    float: left;
    overflow: hidden;
    margin: 20px;
}
.container img {
    display: block;
}

.portrait img {
    width: 100%;
}
.landscape img {
    height: 100%;
}

和演示小提琴:http : //jsfiddle.net/audetwebdesign/QEpJH/

当您将图像定向为纵向时,您需要将宽度缩放到 100%。相反,当图像为横向时,您需要缩放高度。

不幸的是,CSS 中没有针对图像纵横比的选择器组合,因此您无法使用 CSS 来选择正确的缩放比例。

此外,由于图像的左上角固定在包含块的左上角,因此您无法轻松地将图像居中。

jQuery 助手

您可以使用以下 jQuery 操作根据图像的纵横比确定要设置的类。

$(".container").each(function(){
    // Uncomment the following if you need to make this dynamic
    //var refH = $(this).height();
    //var refW = $(this).width();
    //var refRatio = refW/refH;

    // Hard coded value...
    var refRatio = 240/300;

    var imgH = $(this).children("img").height();
    var imgW = $(this).children("img").width();

    if ( (imgW/imgH) < refRatio ) { 
        $(this).addClass("portrait");
    } else {
        $(this).addClass("landscape");
    }
})

对于 中的每个图像.container,获取高度和宽度,测试是否width<height然后设置适当的类。

另外,我添加了一个检查以考虑包含块的纵横比。之前,我隐含地假设了一个方形的视图面板。

乐意效劳!如果需要,您可以修饰 jQuery 以将图像居中。
2021-04-26 00:39:59
@User 其中一张图片坏了,这是您看到的问题吗?
2021-05-01 00:39:59
你好。谢谢,这很好用 - 很好的解释,也是!
2021-05-06 00:39:59
然而,div 的尺寸是 240x300,所以如果图像是例如 250x300,那么简单的 imgW < imgH 不起作用。在这种情况下它应该是横向的,但已经被处理为纵向图像。有什么办法可以在那个 JS 中包含 4:5 的比例?
2021-05-13 00:39:59
我扩展了 jQuery 代码以考虑视图面板的纵横比。
2021-05-21 00:39:59

对于没有动态图像的任何人来说,这里有一个使用 background-image 的全 CSS 解决方案。

<div class="container" 
    style="background-image: url('http://placehold.it/300x1500'); 
    background-size: cover; background-position: center;">
</div>
<div class="container" 
    style="background-image: url('http://placehold.it/1500x300'); 
    background-size: cover; background-position: center;">
</div>

"background-size: cover" 使图像缩放以覆盖所有 div,同时保持纵横比。CSS 也可以移动到 CSS 文件中。尽管如果它是动态生成的,则 background-image 属性将必须保留在 style 属性中。

在 CSS 文件中取出一行:max-width:100% 似乎可以解决问题。

.container {
height: 300px;
width: 240px;
background-color: red;
float: left;
overflow: hidden;
margin: 20px;
}

img {
height: auto;
}

您也可以将 > 添加到 HTML 文件中的结束 div 可以使代码更整洁。

<div class="container">
    <img src="http://placehold.it/300x1500">
</div>
<div class="container">
    <img src="http://placehold.it/1500x300">
</div>

这是一个有效的 JSFiddle 链接:http : //jsfiddle.net/HsE6H/19/

是的,占位符图像在那里有点误导。这只是使图像全尺寸,而我希望它们尽可能小,同时仍然填充整个容器。
2021-04-24 00:39:59

这是我发现的另一个解决方案,不需要单独的肖像或风景或脚本。

  <div class="container">
    <img src="http://placehold.it/500x500" class="pic" />
  </div>

CSS

.container{
  position: relative;
  width: 500px;
  height: 300px;
  margin-top: 30px;
  background: #4477bb;
}
.pic{
    max-width: 100%;
    width: auto;
    max-height: 100%;
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    margin: auto;
}

在这里,它运行良好......

https://jsfiddle.net/efirat/17bopn2q/2/

正是我正在寻找的解决方案。可惜它没有回答上面的问题。我认为他们想要完全填满容器,即使部分图像被裁剪。所以蓝色区域不应该是可见的。
2021-04-24 00:39:59
@Rubiksmomo 对不起,我刚刚解决了我自己的问题,你是对的。问题不同,但是,此代码对其他人也有效...谢谢。
2021-05-07 00:39:59

后台可以这样做

  1. 将图像设置为背景

2.

div {
   -webkit-background-size: auto 100%;
   -moz-background-size: auto 100%;
   -o-background-size: auto 100%;
   background-size: auto 100%;
}

或者

div {
  -webkit-background-size: cover;
  -moz-background-size: cover;
  -o-background-size: cover;
  background-size: cover;
}
谢谢你,先生!我不敢相信没有人提出这个……这是一个测试:jsfiddle.net/yrrncees/8
2021-05-14 00:39:59
请注意,截至 2017/Sep 背景图像不打印,在 chrome 中,您可以设置样式以使其打印,但在其他浏览器中则不然。
2021-05-16 00:39:59
值得注意的是,在使用此解决方案时,为了便于访问,最好在 div 中包含图像的隐藏版本。这样你就可以设置 alt 标签,禁用 CSS 的用户仍然可以查看站点和查看图像。如果这样做,最好避免,display: none因为某些屏幕阅读器会跳过具有这些样式的元素。
2021-05-17 00:39:59