Изменить размер изображения пропорционально с помощью CSS?

Есть ли способ пропорционально изменять размер (уменьшать масштаб) изображений, используя ТОЛЬКО CSS?

Я использую JavaScript, но просто пытаюсь понять, возможно ли это с помощью CSS.


person codingbear    schedule 24.04.2009    source источник
comment
Этан Маркотт недавно очень тщательно исследовал эту проблему. Короткий ответ - да, это возможно, но не во всех браузерах.   -  person Mark Hurd    schedule 25.04.2009
comment
Если вы не хотите сжигать полосу пропускания, вам может помочь slimmage.js; он считывает результирующее значение max-width, чтобы указать, какой размер изображения запрашивается.   -  person Lilith River    schedule 08.07.2013
comment
Вы можете просто установить ширину изображения, высота регулируется автоматически.   -  person Rik Telner    schedule 08.04.2014


Ответы (18)


Чтобы пропорционально изменить размер изображения с помощью CSS:

img.resize {
    width:540px; /* you can use % */
    height: auto;
}
person Mkk    schedule 26.04.2010
comment
Это работает, даже если тег img имеет атрибуты высоты и ширины. +1 - person Surreal Dreams; 11.06.2012
comment
+1 При желании вы также можете использовать max-width вместо width. Ключ в том, чтобы использовать height:auto для переопределения любого атрибута height="...", уже присутствующего на изображении. - person Phrogz; 30.07.2012
comment
В моем случае я использовал фиксированную высоту и установил ширину автоматически :) Спасибо! - person KarenAnne; 28.01.2013
comment
Обычно используется установка max-width: 100%; height: auto;, чтобы большие изображения не превышали ширину своих контейнеров. - person OdraEncoded; 27.10.2013
comment
Это не сработает, если вы хотите увеличить изображение. Изображение теряет свое соотношение сторон. Если, конечно, у контейнера такое же соотношение сторон изображения, как у изображения. - person GetFree; 21.05.2014
comment
У меня это не работает в IE. - person Chase Roberts; 21.01.2015
comment
как насчет auto\9 для IE, это все еще работает? - person Peter; 22.05.2018
comment
Этот не работает с изображениями с высотой ›шириной (например, Портрет) - person Raynal Gobel; 28.08.2018
comment
@SurrealDreams Я думаю, это потому, что второе объявление свойства переопределяет первое объявление, поэтому здесь браузер получит только второе объявление height:auto - person Webwoman; 23.06.2019
comment
Это неверный ответ. Нигде OP не говорит пропорционально содержащему его div. Поэтому мы должны предположить, что он / она имеет в виду масштабировать изображение пропорционально самому себе. Это означает, что transform: scale ответы - единственно правильные. - person clayRay; 18.05.2020

Контролируйте размер и сохраняйте пропорции:

#your-img {
    height: auto; 
    width: auto; 
    max-width: 300px; 
    max-height: 300px;
}
person Cherif    schedule 19.03.2013
comment
Дело в том, что max-width и max-height не интерпретируются всеми браузерами, как IE, верно? - person alexserver; 09.04.2014
comment
@alexserver Работает в MSIE ›= 7: cssportal.com/css-properties/ max-width.php - person gouessej; 17.06.2015
comment
Этот ответ намного лучше ... Вы можете установить максимальную границу как для ширины, так и для высоты, сохраняя соотношение. - person olivarra1; 30.10.2015
comment
Да, это правильный ответ на вопрос, поскольку он учитывает ориентацию изображения (то есть альбомную или портретную). Спасибо! - person katamayros; 14.12.2015

Если это фоновое изображение, используйте background-size: contain.

Пример css:

#your-div {
  background: url('image.jpg') no-repeat;
  background-size:contain;
}
person lenooh    schedule 20.12.2013
comment
Или background-size:cover;, который покроет всю площадь. - person Turion; 17.05.2014
comment
размер фона: содержать; работает на меня. - person jasonleonhard; 25.11.2014
comment
Также добавьте желаемую ширину и высоту = 100%. - person Guy Lowe; 28.04.2015
comment
@Turion Awesome, спасибо, отлично работает и исправляет проблемы масштабирования, вызванные max-width: 300px; - person Underverse; 14.09.2016

Пытаться

transform: scale(0.5, 0.5);
-ms-transform: scale(0.5, 0.5);
-webkit-transform: scale(0.5, 0.5);
person orome    schedule 17.01.2014
comment
На самом деле это работает очень хорошо, если вам нужно уменьшить каждое изображение пропорционально его размеру. С этим кодом изображения становятся в 2 раза меньше. +1 НО! С этим решением изображения по-прежнему занимают место! - person Mārtiņš Briedis; 26.02.2014
comment
@ МартиньшБриедис: Разве не в этом дело? Есть ли способ получить изображения на сервере, чтобы они занимали меньше места, используя ТОЛЬКО CSS (см. OP) ?! - person orome; 30.09.2014
comment
Не такое пространство. У изображений в документе те же границы, ширина и высота, только они выглядят в 2 раза меньше. Представьте себе - изображение размером 100х100. Затем вы применяете масштаб (0,5), и он такой же, как изображение 50x50, но с невидимыми границами 25 пикселей с обеих сторон. Изображение все равно будет занимать пространство 100x100. - - person Mārtiņš Briedis; 30.09.2014
comment
@ МартиньшБриедис: Хммм. Надо будет попробовать. Прошло какое-то время, и казалось, что он сделал то, что от него требовалось. - person orome; 30.09.2014
comment
Вот вам jsfiddle: jsfiddle.net/oy6t2xgL - person Mārtiņš Briedis; 30.09.2014
comment
если оба значения одинаковы, нужно указать только одно. он будет применен к обеим осям. https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/scale - person clayRay; 18.05.2020
comment
Это и ответ от cREcker - единственно правильные. Нигде OP не говорит пропорционально содержащему его div. Таким образом, мы должны предположить, что они означают масштаб изображения пропорционально самому себе. - person clayRay; 18.05.2020

Вы можете использовать свойство object-fit:

.my-image {
    width: 100px;
    height: 100px;
    object-fit: contain;
}

Это подойдет под изображение, не меняя пропорционально.

person Andrii Bogachenko    schedule 08.09.2016
comment
Я использую ширину 100% и высоту 100%, а также размер объекта. и это работает как шарм :). И объект подходит, чтобы содержать решение просто - person Faris Rayhan; 20.11.2016
comment
обратите внимание на поддержку браузера: developer.mozilla.org/en-US / docs / Web / CSS / object-fit на данный момент нет IE и android 4.4.4+. - person qix; 06.02.2017
comment
Это должен быть принятый ответ - person Zack Shapiro; 05.07.2017
comment
object-fit работает хорошо - просто, похоже, требуется, чтобы и height, и width, или оба max-height и max-width не заставляли изображение переполнять контейнер в любом направлении. - person tschumann; 19.11.2018

Обратите внимание, что width:50% изменит его размер до 50% доступного пространства для изображения, а max-width:50% изменит размер изображения до 50% от его естественного размера. Это очень важно учитывать при использовании этих правил для мобильного веб-дизайна, поэтому для мобильного веб-дизайна всегда следует использовать max-width.

ОБНОВЛЕНИЕ. Вероятно, это была старая ошибка Firefox, которая, похоже, уже исправлена.

person andreszs    schedule 29.09.2013
comment
Эм ... похоже, что на настольном компьютере это не так: jsfiddle.net/nLh1oh5e - person Campbeln; 09.10.2014
comment
Для меня это тоже не похоже. - person jasonleonhard; 25.11.2014
comment
Спасибо, что позвонили. Это большая разница. (по крайней мере, я заметил) - person contactmatt; 24.02.2016
comment
Правда спасибо. Но как вы справляетесь с оберткой размера изображения? Он по-прежнему действует так, как будто изображение имеет ширину 100% вместо 50%, вызывая нежелательные границы. Я бы хотел, чтобы он плотно прилегал к уменьшенному изображению. - person Micros; 09.06.2016
comment
Проблема с этим подходом в том, что max-width не имеет ничего общего с исходными размерами изображения. max-width из 50% означает 50% ширины содержащего блока. (Документы на width) - person rinogo; 28.02.2020

Чтобы масштабировать изображение с сохранением его соотношения сторон

Попробуй это,

img {
  max-width:100%;
  height:auto;
}
person Prasanth K C    schedule 10.12.2013

Повторно посещено в 2015 году:

<img src="http://imageurl" style="width: auto; height: auto;max-width: 120px;max-height: 100px">

Я пересмотрел его, так как все распространенные браузеры теперь работают автоматически, предложенные Шерифом выше, так что это работает даже лучше, поскольку вам не нужно знать, если изображение шире, чем выше.

более старая версия: если вы ограничены рамкой 120x100, например, вы можете сделать

<img src="http://image.url" height="100" style="max-width: 120px">
person PetrV    schedule 12.01.2012

Свойства css max-width и max-height работают отлично, но не поддерживаются IE6, и я считаю, что IE7. Вы можете использовать это по высоте / ширине, чтобы случайно не увеличить изображение. Вам просто нужно пропорционально ограничить максимальную высоту / ширину.

person Shawn    schedule 24.04.2009
comment
Кажется, это лучший способ для браузеров с поддержкой HTML5. - person Nestor; 15.09.2010
comment
Он работает в MSIE ›= 7: cssportal.com/css-properties/max- width.php - person gouessej; 17.06.2015
comment
Я так рад, что старые браузеры IE теряют актуальность. - person Aran Mulholland; 08.02.2018

<img style="width: 50%;" src="..." />

у меня отлично сработало ... Или я что-то упустил?

Изменить: Но обратите внимание на предупреждение Шона о случайном увеличении размера.

person Adrien    schedule 24.04.2009
comment
извините, мне нравится разделять содержание и дизайн сайта. Я полностью знаю, что правило добавления ширины работает нормально, что у меня изначально было. Спасибо :) - person codingbear; 25.04.2009
comment
почему-то это единственный вариант, который у меня сработал .. спасибо :) - person Mano Haran; 17.02.2017

img{
    max-width:100%;
    object-fit: scale-down;
}

работает на меня. Он уменьшает большие изображения, чтобы поместиться в рамку, но оставляет меньшим изображениям их исходный размер.

person pheon    schedule 21.06.2017
comment
Интересное решение, хотя важно отметить, что размер изображения по-прежнему занимает независимо от атрибута height. Например, изображение размером 100x100 может быть уменьшено до 80x80, но затем центрировано в середине посадочного места 100x100. - person Scott Leonard; 19.12.2019
comment
Этот ответ - лучшее и масштабируемое решение. - person Sleek Geek; 16.03.2021

Я считаю, что это самый простой способ сделать это, также можно использовать встроенный атрибут style в теге <img>.

.scaled
{
  transform: scale(0.7); /* Equal to scaleX(0.7) scaleY(0.7) */
}

<img src="flower.png" class="scaled">

or

<img src="flower.png" style="transform: scale(0.7);">
person cREcker    schedule 23.07.2018
comment
Я тестировал его, но считаю, что это очень неэффективно, потому что при этом модель с рамкой остается прежней. Вы, вероятно, этого не захотите, но я понимаю, что это может быть полезно, возможно - person Leonardo Maffei; 19.09.2018

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

img {
    max-width: 100%;
    height: auto;
}
@media {
  img { 
    width: auto; /* for ie 8 */
  }
}
person Geniusknight    schedule 01.07.2014

img {
    max-width:100%;
}

div {
    width:100px;
}

с этим фрагментом вы можете сделать это более эффективно

person Lenin Zapata P    schedule 21.05.2013

Мы можем изменить размер изображения с помощью CSS в браузере, используя медиа-запросы и принцип адаптивного дизайна.

    @media screen and (orientation: portrait) {
img.ri {
    max-width: 80%;
  }
}

@media screen and (orientation: landscape) {
  img.ri { max-height: 80%; }
}

person Moh K    schedule 23.08.2017

Вам всегда нужно что-то подобное

html
{
    width: 100%;
    height: 100%;
}

в верхней части вашего файла css

person MikeStr    schedule 24.06.2014
comment
это отличный ответ, почему это было отклонено? это плохая практика или что-то в этом роде? - person OKGimmeMoney; 07.05.2015

Попробуй это:

div.container {
    max-width: 200px;//real picture size
    max-height: 100px;
}

/* resize images */
div.container img {
    width: 100%;
    height: auto;
}
person ovod    schedule 06.03.2016

image_tag("/icons/icon.gif", height: '32', width: '32') Мне нужно установить высоту: '50px', ширину: '50px' для тега изображения, и этот код работает с первой попытки, обратите внимание, я попробовал весь приведенный выше код, но не повезло, поэтому он работает, и вот мой код из моего _nav.html .erb:
<%= image_tag("#{current_user.image}", height: '50px', width: '50px') %>

person neo7    schedule 29.01.2018
comment
Пожалуйста, добавьте также несколько пояснений. - person BlackBeard; 29.01.2018