Как установить ширину и высоту изображения, не растягивая его?

88

Если у меня есть:

#logo {
    width: 400px;
    height: 200px;
}

тогда

<img id="logo" src="logo.jpg"/>

растянется, чтобы заполнить это пространство. Я хочу, чтобы изображение оставалось того же размера, но занимало столько места в DOM. Мне нужно добавить инкапсулирующий <div>или <span>? Ненавижу добавлять разметку для стилизации.

Пол Тарджан
источник
Если вы все еще используете Stack Overflow, хотите ли вы обновить ответ?
mikemaccana

Ответы:

117

Да, вам нужен инкапсулирующий div:

<div id="logo"><img src="logo.jpg"></div>

с чем-то вроде:

#logo { height: 100px; width: 200px; overflow: hidden; }

Другие решения (отступы, поля) более утомительны (в том смысле, что вам нужно вычислить правильное значение на основе размеров изображения), но также не позволяют эффективно уменьшить размер контейнера, чем изображение.

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

#logo { position: relative; height: 100px; width: 200px; }
#logo img { position: absolute; right: 0; bottom: 0; }
Cletus
источник
5
Вы можете заменить тег <div> на <figure>: добавляет семантику, и при необходимости вы можете указать для него заголовок (<figcaption>). developer.mozilla.org/en-US/docs/Web/HTML/Element/figure
Матеус Леон
Кроме того, если это используется для брендинга, на презентации веб-сайта используйте <h1> (если индекс) или <p> (если другой), применяя атрибуты title и alt к <img>, чтобы вы могли добавить разметку, удобную для SEO. . Они также являются элементами уровня блока, например div, и могут быть оболочками для ваших функций обрезки.
Mateus Leon
3
Я понятия не имел, что Клетус был веб-разработчиком. Удивительно
Piyin
61

2017 ответ

Подгонка объекта CSS работает во всех текущих браузерах. Это позволяет imgэлементу быть больше, не растягивая изображение.

Вы можете добавить object-fit: cover;в свой CSS.

Данте
источник
2
Вероятно, вы должны упомянуть, в каких браузерах он работает.
Натан Тагги
2
проверьте эту ссылку на совместимость с браузером: caniuse.com/#search=object-fit
Alexee
28

Загрузите изображение в качестве фона для div.

Вместо того:

<img id='logo' src='picture.jpg'>

делать

<div id='logo' style='background:url(picture.jpg)'></div>

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

  1. Без дополнительной разметки. Div просто заменяет img.
  2. Легко центрируйте изображение или установите другое смещение. например.url(pic) center top;
  3. Повторите изображение, когда оно будет достаточно маленьким. (Хорошо, не знаю, зачем тебе это нужно)
  4. Установите цвет bg в том же операторе, легко примените одно и то же изображение к нескольким элементам и все, что применяется к изображениям bg.

Обновление: это ответ до объектной подгонки; теперь вам, вероятно, следует использовать объект-соответствие / положение-объекта.

Он по-прежнему полезен для старых браузеров, для дополнительных свойств (например, background-repeat) и для крайних случаев (например, обходные ошибки Chrome с flexbox и object-position и проблемы FF (бывшие?) С grid + autoheight + object- подходят. Обертки div в grid / flexbox часто дают ... неинтуитивные результаты.)

Сэм Гуди
источник
4
Те, кто поставил -1, должны объяснить в интересах других пользователей. Лично я сделал это с отличными результатами, даже в IE6 и Safari на iOS.
SamGoody
Сразу хотел добавить - это вообще хороший подход. Люди даже указывают координаты положения фона для листов спрайтов изображений в качестве оптимизации. Однако одно отличие состоит в том, что у него нет обработчика событий ошибки, который есть у <img>
badunk
Я также добавил класс в div со следующим содержанием:background-repeat:no-repeat !important; float:left; width:100px; height:100px;
Nils
2
Некоторые браузеры по умолчанию не печатают фоновые изображения, поэтому это может быть не лучшим подходом, если вы хотите разрешить пользователям распечатывать эту страницу.
Bennett McElwee
5
Это семантически неверно. Если это полезно, почему HTML5 размещает больше тегов, связанных с изображениями, для оптимизации семантики, с помощью figcaption, picture? Используйте тег img, для которого он был разработан, и прекратите заменять все на <div>.
Mateus Leon
23

Соответствие объекта CSS3

Не уверен, насколько это реализовано в webkit, IE и firefox. Но Opera работает как по волшебству

object-fitработает с содержимым SVG, но того же эффекта можно добиться, установив preserveAspectRatio=""атрибут в самом SVG.

img {
  height: 100px;
  width: 100px;
  -o-object-fit: contain;
}

Демо Криса Миллса здесь http://dev.opera.com/articles/view/css3-object-fit-object-position/

краб
источник
2
1+ Это действительно круто. Жаль, что поддержка ограничена ... Похоже, Chrome 32 - это первая версия, которая поддерживает его без префиксов поставщиков.
Джош Крозье
Это фантастика, работает как шарм. Все исправлено простым добавлением одного свойства. Мне просто нужен был Chrome, и он работает. И да, без префикса производителя. Спасибо.
whyAto8
9
#logo {
    width: 400px;
    height: 200px;

    /*Scale down will take the necessary specified space that is 400px x 200px without stretching the image*/
    object-fit:scale-down;
}
Манодж Селвин
источник
7

Создайте div и присвойте ему класс. Затем закинуть в него img.

<div class="mydiv">

<img src="location/of/your/image" ></img>

</div>

Установите размер вашего div и сделайте его относительным.

    .mydiv {
        position: relative;
        height:300px;
        width: 100%;
        overflow: hidden;
    }

затем создайте свое изображение

img {
    width: 100%;
    height: auto;
    overflow: hidden;
}

надеюсь, это поможет

Сабба Кейнеджад
источник
3

Вы можете использовать как показано ниже:

.width100 {
  max-width: 100px;
  height: 100px;
  width: auto;
  border: solid red;
}
<img src="https://www.gravatar.com/avatar/dc48e9b92e4210d7a3131b3ef46eb8b1?s=512&d=identicon&r=PG" class="width100" />

PurTahan
источник
1

Нужно ли мне добавлять инкапсулирующий <div> или <span>?

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

Пекка
источник
0

вы можете попробовать установить отступ вместо высоты / ширины.

Благослови Яху
источник
0

Что я могу придумать, так это растянуть ширину или высоту и позволить ему изменять размер в соотношении сторон. По бокам будет немного белого пространства. Примерно так, как на Широком экране отображается разрешение 1024x768.

Маурис
источник
0

Если использование flexbox является для вас допустимым вариантом (не нужно поддерживать старые браузеры), проверьте мой другой ответ здесь (который, возможно, является дубликатом этого):

В основном вам нужно обернуть свой тег img в div, и ваш css будет выглядеть так:

.img__container {
    display: flex;
    padding: 15px 12px;
    box-sizing: border-box;
    width: 400px; height: 200px;

    img {
        margin: auto;
        max-width: 100%;
        max-height: 100%;
    }
}
Рафаэльбитен
источник
-1

Это довольно старый вопрос, но у меня была точно такая же раздражающая проблема, когда все работало нормально для Chrome / Edge (со свойством объектного соответствия), но то же свойство css не работало в IE11 (поскольку оно не поддерживается в IE11), я закончил используя элемент HTML5 "figure", который решил все мои проблемы.

Я лично не использовал внешний тег DIV, так как в моем случае это совсем не помогло, поэтому я избегал внешнего DIV и просто заменил его элементом 'figure'.

Приведенный ниже код заставляет изображение красиво уменьшаться / масштабироваться (без изменения исходного соотношения сторон).

<figure class="figure-class">
  <img class="image-class" src="{{photoURL}}" />
</figure>

и классы css:

.image-class {
    border: 6px solid #E8E8E8;
    max-width: 189px;
    max-height: 189px;
}

.figure-class {
    width: 189px;
    height: 189px;
}
накуль2013
источник