Як мені помістити зображення (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 щодо розміру зображення (і якщо ви не знаєте розмір зображення заздалегідь, ви це зробите), це шлях.
Rémy DAVID

2
Не можете використовувати максимальну висоту: 100%; максимальна ширина: 100%; мінімальна ширина: 100%; мінімальна висота: 100% і тоді ви отримаєте такий же результат? Чесне запитання.
Даніель Кассерлі

Ні, тим самим ви змушуєте ширину та висоту становити 100%, тому ви змінюєте співвідношення сторін зображення.
gztomas

onload не буде викликано, коли зображення буде кешоване у веб-переглядачі, тому це працюватиме лише тоді, коли зображення завантажується вперше.
Редтопія

314

Використовуйте max-height:100%; max-width:100%;для зображення всередині діл.


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

5
Для мене це не працює ... Це робить зображення на 100% власного розміру (наприклад: ширина 300 пікселів для зображення, яке насправді становить ширину 300 пікселів).
Томаш Зато - Відновити Моніку

1
Це викликає певну помилку, пов’язану з Chrome-on-Windows. Можливо, якась погана взаємодія з певними плагінами плавного прокрутки у мене є. Закінчується намаганням прокрутити тіло, навіть якщо миша над overflow:scrollдівом з великим зображенням. Цікавий. Ще дивніше: рішення Макса насправді це виправляє. Я дуже втомився від CSS, справді. Звик бути потужним і крутим. Тепер реалізація просто призводить до невідповідності баггі після невідповідності баггі.
Стівен Лу

21
працює лише при зменшенні розміру зображення. якщо ви хочете помістити маленьке зображення у більший контейнер, це не вийде
Yossi Shasho

2
Це не зберігає початкове співвідношення сторін зображення.
Ĭsααc t ի ε βöss

78

На жаль, max-width + max-height не повністю покривають моє завдання ... Тож я знайшов інше рішення:

Для збереження співвідношення зображень при масштабуванні ви також можете використовувати object-fitвластивість CSS3.

Корисна стаття: Контроль співвідношення сторін зображення за допомогою 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.
Кріс Рае

Це єдина відповідь, яка допомогла мені створити чуйний фон зображення, який заповнив екран, зберігаючи співвідношення сторін зображення.
Рей Лі

39

Лише за допомогою CSS:

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

не збільшує масштаб
JFFIGK

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%, це скаже співвідношення зображень - ОП хоче зберегти співвідношення.
casablanca

Я не впевнений, що означав ОП, але там ви не дотримаєтеся співвідношення?
Труфа

що я можу зробити, щоб зберегти співвідношення? Якщо я видалю висоту: 100% зображення буде обрізане.
Бін Чен

7

У мене виникло багато проблем, щоб зробити це робочим, кожне знайдене нами рішення, здається, не спрацювало.

Я зрозумів, що мені потрібно налаштувати дівовий дисплей на згинання, тому в основному це мій CSS:

div{
display: flex;
}

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

Мої зображення спотворені цим рішенням у версії Chrome Chrome 61
Євген Афанасьєв

Можливо, у вашого діва встановлено максимальну висоту / висоту чи ширину, і це спричиняє спотворення зображення.
Барто Бернсман

Точно моя думка .. Зображення спотворене, тому що ви встановлюєте ширину та висоту на <div class = "w">
Bartho Bernsmann

Для вашого прикладу .. Я вважаю, що ви шукаєте щось на зразок вашого зображення 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%;центром його
  • 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 - це невелике прозоре зображення з тим самим співвідношенням сторін, як фото.jpg. Якщо фотографія є квадратом, це заповнення 1px x 1px, якщо фотографія - це мініатюра відео, це заповнення 16x9 тощо.

Специфічне для питання, використовуйте заповнювач 1х1, щоб підтримувати квадратний коефіцієнт діва, фонове зображення використовуйте background-sizeдля підтримки співвідношення сторін фотографії.

Я використав, background-position: center center;щоб фото було по центру в діві. (Вирівнювання фотографії у вертикальному центрі чи внизу стає некрасивим із фотографією у тезі 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, перетворіть зображення заповнювача у дані: URL .

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

0

ви можете використовувати клас "img-fluid" для нової версії, тобто Bootstrap v4 .

і може використовувати клас "img-respovable" для старішої версії, наприклад Bootstrap v3 .

Використання : -

тег img з: -

class = "img-fluid"

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 був необхідний, щоб зображення не виходило за межі діва.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.