如何调整图片大小以适应浏览器窗口?

168

这似乎很琐碎,但经过所有的研究和编码后,我无法让它正常工作。条件如下:

  1. 浏览器窗口大小未知。因此,请不要提出涉及绝对像素大小的解决方案。
  2. 图像的原始尺寸未知,并且可能已经适合浏览器窗口。
  3. 图片在垂直和水平方向上居中显示。
  4. 必须保持图像比例。
  5. 图像必须完整地显示在窗口中(不剪裁)。
  6. 我不希望出现滚动条(如果图像适合,则不应出现滚动条)。
  7. 当窗口尺寸更改时,图像会自动调整大小,占用所有可用空间,而不超过其原始大小。

基本上我想要的是:

.fit {
  max-width: 99%;
  max-height: 99%;
}
<img class="fit" src="pic.png">

上述代码的问题在于它无法正常工作:图片会通过添加垂直滚动条来占用所有垂直空间。

我可以使用PHP、Javascript、JQuery,但我希望有一个仅基于CSS的解决方案。如果它不能在IE中工作也无所谓。


这是你想要的效果,对吧?我也是! - user938318
谢谢,那真的帮了我很多。你有什么建议可以让我把两张图片并排放置,同时保持调整大小的功能吗?谢谢。 - user1300142
14
我喜欢你的“非要求”:“我不在乎它在IE上是否能正常工作。” :) - Bastian
15个回答

180

更新于2018-04-11

以下是一种无需Javascript,仅使用CSS的解决方案。 图像将动态居中并调整大小以适应窗口。

<html>
<head>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .imgbox {
            display: grid;
            height: 100%;
        }
        .center-fit {
            max-width: 100%;
            max-height: 100vh;
            margin: auto;
        }
    </style>
</head>
<body>
<div class="imgbox">
    <img class="center-fit" src='pic.png'>
</div>
</body>
</html>

[另一种、旧的] 解决方案使用 JQuery,设置图像容器的高度(在下面的示例中为 body),以便 max-height 属性在图像上按预期工作。当客户端窗口调整大小时,图像也会自动调整大小。


<!DOCTYPE html>
<html>
<head>
    <style>
        * {
            padding: 0;
            margin: 0;
        }
        .fit { /* set relative picture size */
            max-width: 100%;
            max-height: 100%;
        }
        .center {
            display: block;
            margin: auto;
        }
    </style>
</head>
<body>

<img class="center fit" src="pic.jpg" >

<script src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript" language="JavaScript">
    function set_body_height() { // set body height = window height
        $('body').height($(window).height());
    }
    $(document).ready(function() {
        $(window).bind('resize', set_body_height);
        set_body_height();
    });
</script>

</body>
</html>

注意:用户gutierrezalex在此页面上将非常相似的解决方案制作为JQuery插件。


8
不需要 JavaScript,这里有一个纯 CSS 的解决方案 - Victor Zakharov
另外,如果不使用JS,可以选择使用flexbox - Jason Sturges
"*"(因此任何元素!)的样式让我感到不舒服。应该进行更改。 - Stefan Reich

67

这里有一个简单的CSS-only解决方案(JSFiddle),适用于各个平台,包括移动设备和IE浏览器:

CSS 2.0:

html, body {
    height: 100%;
    margin: 0;
    padding: 0;
}

img {
    padding: 0;
    display: block;
    margin: 0 auto;
    max-height: 100%;
    max-width: 100%;
}

HTML:

<body>
  <img src="images/your-image.png" />
</body>

3
好的。但它没有垂直居中。 - sebnukem
1
@sebnukem:这是应该的吗?我在需求中错过了这一点。这就是为什么人们使用屏幕截图/模型的原因。 :) 另外,我认为即使使用JS帮助,提供的任何答案都不能使其垂直居中。 - Victor Zakharov
3
我尝试了很多解决方案,甚至包括来自css-tricks的解决方案。你的方案完美地运行起来了! - Stephan
2
有史以来最好的解决方案! - iVela

33

CSS3引入了一些相对于视窗(即窗口)来测量的新单位,它们分别是vhvw,其中vh测量视口高度,vw测量视口宽度。下面是一个简单的仅使用CSS的解决方案:

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

唯一的限制是,只有在页面上没有其他元素贡献高度时才起作用。


谢谢,太好了。为什么100vh不能让图片适应,而97vh却可以? - Pavel
也许您有其他贡献高度的图像,例如在 body 上的 margin 和 padding?vh 字面意思是视图的高度,因此如果任何其他元素向您的页面添加高度,则整个页面将超过 100vh。这有意义吗? - Max
谢谢,问题已解决。如果有人遇到同样的问题(.svg文件渲染正常,但将其重命名为.html会导致不准确):浏览器会自动添加带有默认margin:8<body>标签,即使文件没有<body>标签。因此解决方案是添加<style>body{margin:0}</style> - Pavel

17
如果您愿意在图像周围放置容器元素,纯CSS解决方案很简单。您会发现,当父元素垂直扩展以包含其子元素时,99%的高度没有意义。父元素需要具有固定的高度,例如...视口的高度。 HTML
<!-- use a tall image to illustrate the problem -->
<div class='fill-screen'>
    <img class='make-it-fit' 
         src='https://upload.wikimedia.org/wikipedia/commons/f/f2/Leaning_Tower_of_Pisa.jpg'>
</div>

CSS

div.fill-screen {
    position: fixed;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    text-align: center;
}

img.make-it-fit {
    max-width: 99%;
    max-height: 99%;
}

使用这个代码片段进行操作。


你能用 <div> 代替 <img> 来实现这个吗? - StevoHN
@sebnukem 我之前没有注意到那个要求。我已经更新了我的答案。 - Mark E. Haase
这不会最大化我的宽图像的高度。 - Sridhar Sarnobat

11

对于未来的读者,如果您需要一个解决方案,回答1-6并以允许调整大小超出原始大小的方式进行7,我已经为此问题开发出完整的解决方案:

<!DOCTYPE html>
<html>
  <body style="overflow:hidden; margin:0; text-align:center;">
    <img src="https://file-examples-com.github.io/uploads/2017/10/file_example_JPG_2500kB.jpg" style="height:100vh; max-width:100%; object-fit: contain;">
  </body>
</html>


10

我知道这里已经有几个答案了,但以下是我使用的方法:

max-width: 100%;
max-height: 100vh;
width: auto;
margin: auto;

1
我不知道为什么,但这个代码非常有效。我希望能够得到解释! - SeedyROM
我也不是,但这是我经过大量搜索后找到的。 - TomC
太棒了,回答得非常好 :) - Alexandros Kourtis
似乎没有水平居中 - Stefan Reich
是的,哇,简单而且实用。虽然还不完全符合我的需求,但我正在调整期望值。我真正想要的是强制文档不要调整大小以适应过大的图像,而是将任何不适合的内容简单地推到页面顶部。我可以通过使用JS生成页面来实现这一点,但那对我来说似乎太hacky了,我希望有一个纯CSS和语义化HTML的解决方案。 - Nathaniel Hoyt

8

将图片调整大小以适应屏幕,通过保持长边的纵横比。

img[src$="#fit"] {
    width: 100vw;
    height: auto;
    max-width: none;
    max-height: 100vh;
    object-fit: contain;
}
  • width: 100vw - 图片宽度将会占据整个视口的宽度

  • height: auto - 图片高度将会等比例缩放

  • max-height: 100vw - 如果图片高度超过了视口的高度,那么图片高度将被调整以适应屏幕,所以图片宽度也会因为下面这条属性而被调整

  • object-fit: contain - 替换的内容按比例缩放,同时适应元素的内容框

    注意:只有 IE 16.0 及以上版本完全支持 object-fit


1
喜欢那个解决方案,但是你应该提到 object-fit 不兼容 IE11,而 IE11 仍然被广泛使用,不幸的是。 - Blackbam
@DivijSehgal 如果您不需要 object-fit,或者您可以明确使用 object-fit: fill;,这是 默认 的。 - am0wa
如果我们想要垂直居中怎么办? - Fmstrat
如果我们想要垂直居中怎么办?只需添加:margin: auto; - cat
解决方案与另一个答案中的html和body样式配合使用: html,body {       宽度:100%;       高度:100%;       边距:0;       填充:0;     } - Ivan Kovtun
这是我所期望的最接近的!谢谢。 - Ryan

7

让它简单易懂。谢谢。

.bg {
  background-image: url('https://images.unsplash.com/photo-1476820865390-c52aeebb9891?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&w=1000&q=80');
  background-repeat: no-repeat;
  background-size: cover;
  background-position: center;
  height: 100vh;
  width: 100vw;
}
<div class="bg"></div>


谢谢!在图片标签中添加style="height: 80vh;" 就解决了我的问题。 - Tobias J.

4

我的通用懒惰CSS规则:

.background{
width:100%;
height:auto;
background: url('yoururl.jpg') no-repeat center;
background-position: 50% 50%;
background-size: 100% cover!important;
overflow:hidden;
}

如果图片本身像素低,这可能会放大您的图像(这与图像质量和尺寸有关)。 要使图像居中,您也可以尝试在CSS中使用以下代码:

display:block;    
margin: auto 0; 

居中图片

在你的HTML代码中:

<div class="background"></div>

3
width: 100%;
overflow: hidden;

我相信那应该可以解决问题。


嗨,谢谢你的回答,但是当图像高度大于窗口时,它在逻辑上不起作用,也无法起作用。 - sebnukem
1
那么...你打算做什么?你想要拉伸它吗?还是应该保持原始比例不变(我猜这就是你想要的)? - RobinJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接