Как мне разместить изображение (img) внутри div и сохранить соотношение сторон?


136

У меня есть div 48x48, и внутри него есть элемент img, я хочу вставить его в div без потери какой-либо части, в то время как соотношение сохраняется, достижимо ли это с помощью html и css?

Ответы:


70

Вам понадобится JavaScript для предотвращения обрезки, если вы не знаете размер изображения во время написания CSS.

HTML & JavaScript

<div id="container">
    <img src="something.jpg" alt="" />
</div>

<script type="text/javascript">
(function() {

var img = document.getElementById('container').firstChild;
img.onload = function() {
    if(img.height > img.width) {
        img.height = '100%';
        img.width = 'auto';
    }
};

}());
</script>

CSS

#container {
   width: 48px;
   height: 48px;
}

#container img {
   width: 100%;
}

Если вы используете библиотеку JavaScript, вы можете воспользоваться ею.


2
Ответ Михаэля намного проще и не использует Javascript. Я не знаю о совместимости браузера, хотя.
weberc2

3
Нет, ответ Майкла работает, пока изображение больше, чем div. Если вы хотите, чтобы изображение заполняло элемент div относительно размера изображения (и, если вы заранее не знаете размер изображения, вы делаете это), то это путь.
Реми ДЭВИД

2
Не могли бы вы использовать максимальную высоту: 100%; макс-ширина: 100%; мин-ширина: 100%; min-height: 100% и получить тот же результат тогда? Честный вопрос.
Даниэль Кассерли

Нет, тем самым вы устанавливаете ширину и высоту равными 100%, поэтому вы меняете соотношение сторон изображения.
gztomas

onload не будет вызываться, когда изображение кэшируется в браузере, поэтому это будет работать только тогда, когда изображение загружается в первый раз.
Redtopia,

314

Используйте max-height:100%; max-width:100%;для изображения внутри div.


4
@ZoveGames Браузеры, не поддерживающие JS? Статистика Yahoo за 2010 год показывает в среднем 1,3%. Я думаю, что можно предположить, что сегодня, наверное, ниже и б. programmers.stackexchange.com/questions/26179/…
EasyCo

5
Это не работает для меня ... Это делает изображение 100% его собственного размера (например: ширина 300 пикселей для изображения шириной 300 пикселей).
Томаш Зато - Восстановить Монику

1
Это вызвало ужасную ошибку, специфичную для Chrome-on-Windows. Потенциально плохое взаимодействие с некоторыми плагинами плавной прокрутки у меня есть. В итоге он пытается прокрутить тело, даже если мышь находится над overflow:scrollэлементом с большим изображением. Любопытно. Еще более странно: решение Макса фактически исправляет это. Я действительно сыт по горло CSS. Раньше было мощно и круто. Теперь реализации просто создают ошибочное несоответствие после ошибочного несоответствия.
Стивен Лу

21
работает только при уменьшении изображения. если вы хотите поместить маленькое изображение в большую емкость, это не сработает
Йосси Шашо,

2
Это не сохраняет оригинальное соотношение сторон изображения.
αsααc t ի ε βöss

78

К сожалению, max-width + max-height не полностью покрывают мою задачу ... Поэтому я нашел другое решение:

Чтобы сохранить соотношение изображения при масштабировании, вы также можете использовать object-fitCSS3 propperty.

Полезная статья: Управление пропорциями изображения с помощью CSS3

img {
    width: 100%; /* or any custom size */
    height: 100%; 
    object-fit: contain;
}

Плохие новости: IE не поддерживается ( Могу ли я использовать )


6
Это должно быть помечено как ответ .. "объект-соответствие" работал отлично.
αsααc t ի ε βöss

Как ни странно, похоже, что поддержка этого была введена в iOS 8.1, а не в 8.0.
Луч

2
object-fit: cover; работал на меня. Здесь: stackoverflow.com/questions/9071830/…
Deke

1
Если вы хотите, чтобы изображение находилось в верхнем левом углу, а не по центру, вам также нужно использовать объектную позицию 0 0.
Крис Рей

Это единственный ответ, который помог мне создать адаптивный фоновый рисунок, который заполнил весь экран при сохранении соотношения сторон изображения.
Рэй Ли


17

HTML

<div>
    <img src="something.jpg" alt="" />
</div>

CSS

div {
   width: 48px;
   height: 48px;
}

div img {
   display: block;
   width: 100%;
}

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


2
Не добавляйте height: 100%, это изменит соотношение изображения - ОП хочет сохранить соотношение.
Касабланка

Я не уверен, что имел в виду ОП, но там вы не будете поддерживать правильное соотношение?
Труфа

что я могу сделать, чтобы сохранить соотношение? Если я удаляю высоту: 100% изображение будет обрезано.
Бен Чен

7

У меня было много проблем, чтобы заставить это работать, каждое решение, которое я нашел, казалось, не работало.

Я понял, что мне нужно настроить отображение div на flex, так что в основном это мой CSS:

div{
display: flex;
}

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

Мои изображения искажаются этим решением в Chrome Version 61
Евгений Афанасьев

Возможно ваш div имеет максимальную высоту / высоту или ширину, и это вызывает искажение вашего изображения.
Барто Бернсманн

Именно моя точка зрения .. Изображение искажено, потому что вы устанавливаете ширину и высоту на вашем <div class = "w">
Барто Бернсманн

Для вашего примера .. Я считаю, что вы ищете что-то вроде на вашем изображении CSS: height: auto; ширина: 100%;
Барто Бернсманн

задача состояла в том, чтобы поместить изображение в div, это означает, что div имеет размеры, а изображение имеет только пропорции. Мне нужно установить высоту на какое-то значение, иначе условия вопроса будут искажаться так же, как и мое изображение. Пожалуйста, посмотрите на скрипку JS и измените то, что, по вашему мнению, необходимо для его работы. Спасибо.
Евгений Афанасьев


3

Для меня работал следующий CSS (проверено в Chrome, Firefox и Safari).

Есть несколько вещей, работающих вместе:

  • max-height: 100%;, max-width: 100%;И height: auto;, width: auto;чтобы масштаб IMG в зависимости от того , простановки размеров впервые достигнет 100%, сохраняя при этом соотношение сторон
  • position: relative;в контейнере и position: absolute;в дочернем элементе вместе с top: 50%;и left: 50%;центрировать верхний левый угол img в контейнере
  • transform: translate(-50%, -50%); перемещает img назад влево и вверх на половину его размера, таким образом центрируя img в контейнере

CSS:

.container {
    height: 48px;
    width: 48px;

    position: relative;
}

.container > img {
    max-height: 100%;
    max-width: 100%;
    height: auto;
    width: auto;

    position: absolute;
    top: 50%;
    left: 50%;

    transform: translate(-50%, -50%);
}

1

Установка фотографии в качестве фонового изображения даст нам больше контроля над размером и размещением, оставляя тег img для других целей ...

Ниже, если мы хотим, чтобы размер div был таким же, как у фотографии, то placeholder.png - это маленькое прозрачное изображение с таким же соотношением сторон, что и у photo.jpg. Если фотография представляет собой квадрат, это заполнитель размером 1 × 1 пиксель, если фотография представляет собой миниатюру видео, это заполнитель размером 16 × 9 и т. Д.

В зависимости от вопроса, используйте заполнитель 1x1 для поддержания квадратного соотношения div, а фоновое изображение - background-sizeдля сохранения пропорций фотографии.

Я использовал, background-position: center center;так что фото будут по центру в div. (Выравнивание фотографии по вертикали по центру или снизу может быть уродливым с фотографией в теге img.)

div {
    background: url(photo.jpg) center center no-repeat;
    background-size: contain;
    width: 48px; // or a % in responsive layout
}
img {
    width: 100%;
}

<div><img src="placeholder.png"/></div>

Чтобы избежать лишнего http-запроса, преобразуйте изображение-заполнитель в data: URL .

<img src="data:image/png;base64,..."/>

0

Вы можете использовать класс "img-liquid" для более новой версии, т.е. Bootstrap v4 .

и может использовать класс «img-responseive» для более старой версии, такой как Bootstrap v3 .

Использование : -

img тег с: -

класс = "img-жидкость"

src = "..."


0

Вот весь подход JavaScript. Уменьшает изображение до тех пор, пока оно не будет правильно помещено. Вы выбираете, насколько уменьшить его каждый раз, когда он терпит неудачу. Этот пример уменьшает его на 10% каждый раз, когда он терпит неудачу:

let fit = function (el, w, h, percentage, step)
{
    let newH = h;
    let newW = w;

    // fail safe
    if (percentage < 0 || step < 0) return { h: h, w: w };
    if (h > w)
    {
        newH = el.height() * percentage;
        newW = (w / h) * newH;
        if (newW > el.width())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }
    else
    {
        newW = el.width() * percentage;
        newH = (h / w) * newW;
        if (newH > el.height())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }

    return { h: newH, w: newW };
};

img.bind('load', function ()
{
    let h = img.height();
    let w = img.width();
    let newFit = fit($('<img-wrapper-selector>'), w, h, 1, 0.1);

    img.width(newFit.w);
    img.height(newFit.h);
});

Не стесняйтесь копировать и вставлять напрямую.


0

Что сработало для меня:

<div style='display: inline-flex; width: 80px; height: 80px;'>
<img style='max-width: 100%; max-height: 100%' src='image file'>
</div>

inline-flex должен был препятствовать выходу изображений за пределы div.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.