Как изменить размер изображения, чтобы оно поместилось в окне браузера? - PullRequest
89 голосов
/ 29 мая 2011

Это кажется тривиальным, но после всех исследований и кодирования я не могу заставить его работать.Условия:

  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.

Ответы [ 11 ]

81 голосов
/ 05 февраля 2013

Обновление 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 на этой странице.

43 голосов
/ 11 февраля 2016

Вот простое решение только для CSS ( 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>
22 голосов
/ 27 сентября 2016

CSS3 вводит новые единицы измерения, которые измеряются относительно области просмотра, которая в данном случае является окном. Это vh и vw, которые измеряют высоту и ширину области просмотра соответственно. Вот простое решение только для CSS:

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

Единственное предостережение в том, что это работает, только если на странице нет других элементов, влияющих на высоту.

15 голосов
/ 03 октября 2015

Если вы хотите поместить контейнерный элемент вокруг вашего изображения, простое решение 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%;
}

Играть с на скрипке .

3 голосов
/ 05 апреля 2018

Изменение размера изображения по размеру экрана самой длинной стороной с сохранением соотношения сторон

img[src$="#fit"] {
    width: 100vw;
    height: auto;
    max-width: none;
    max-height: 100vh;
    object-fit: contain;
}
  • width: 100vw - ширина изображения будет составлять 100% от порта просмотра
  • height: auto - высота изображения будет пропорционально масштабирована
  • max-height: 100vw - если высота изображения станет больше, чем порт просмотра, она будет уменьшена до размера экрана, следовательно, ширина изображения будет уменьшена из-за следующего свойства

  • object-fit: contain - заменяемое содержимое масштабируется для поддержания его соотношения сторон, в то время как вписывается в поле содержимого элемента

    Примечание: object-fit полностью поддерживается только с IE16,0

3 голосов
/ 24 января 2017

Моё общее ленивое правило 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>
1 голос
/ 08 июня 2015

У меня было похожее требование, и я должен был сделать это с базовым CSS и JavaScript. Нет JQuery доступно.

Это то, что я получил работать.

<html>
      <head>
            <style>
                   img {
                          max-width: 95% !important;
                          max-height: 95% !important;
                       }
            </style>
            <script>
                   function FitImagesToScreen() {
                      var images = document.getElementsByTagName('img');
                      if(images.length > 0){
                         for(var i=0; i < images.length; i++){
                             if(images[i].width >= (window.innerWidth - 10)){
                                 images[i].style.width = 'auto';
                               }
                            }
                         }
                   }
             </script>
      </head>
      <body onload='FitImagesToScreen()'>
      ----    
      </body>
</html>

Примечание: Я не использовал 100% для ширины изображения, поскольку всегда нужно было учитывать некоторые отступы.

1 голос
/ 29 мая 2011
html, body{width: 99%; height: 99%; overflow: hidden}
img.fit{width: 100%; height: 100%;}

Или, возможно, проверьте это: http://css -tricks.com / how-to-resizeable-background-image /

1 голос
/ 29 мая 2011
width: 100%;
overflow: hidden;

Я считаю, что должно сработать.

0 голосов
/ 25 марта 2019

Сделай это просто. Спасибо

.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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...