Як встановити ширину та висоту зображення, не розтягуючи його?


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; }

5
Ви можете замінити тег <div> на <figure>: додає семантичний, і ви можете вказати для нього підпис (<figcaption>), якщо це необхідно. developer.mozilla.org/en-US/docs/Web/HTML/Element/figure
Mateus Leon

Крім того, якщо для брендингу використовується, у презентації веб-сайту використовуйте <h1> (якщо індекс) або <p> (якщо інший), застосовуючи атрибути title і alt до <img>, щоб ви могли додати розмітку, зручну для SEO . Вони також є елементами рівня блоку, як div, і можуть бути обгортками для вашої функціональності обрізки.
Матеус Леон

3
Я навіть не підозрював, що Клетус є веб-розробником. Amazing
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.

Оновлення: Ця відповідь наведена раніше, ніж об'єкт впису; тепер ви, мабуть, повинні використовувати object-fit / object-position.

Це все ще корисно для старих браузерів, для додаткових властивостей (таких як фонове повторення) та для крайніх випадків (Наприклад, обхідні помилки Chrome з flexbox та позицією об'єкта та проблеми FF (колишні?) З grid + autoheight + object- обгорткові divs у grid / flexbox часто дають ... неінтуїтивні результати.)


4
Ті, хто дав -1, повинні пояснити на користь інших користувачів. Особисто я зробив це з чудовими результатами, навіть на IE6 та Safari на iOS.
SamGoody

Просто хотів додати - це, як правило, хороший підхід. Люди навіть вказують координати положення фону для листів спрайтів зображень як оптимізацію. Однак одна відмінність полягає в тому, що він не має обробника подій помилок, який має <img>
badunk

Я також додав клас до div із таким вмістом:background-repeat:no-repeat !important; float:left; width:100px; height:100px;
Нільс,

2
Деякі браузери за замовчуванням не друкують фонові зображення, тому це може бути не найкращим підходом, якщо ви хочете дозволити користувачам друкувати цю сторінку.
Bennett McElwee

5
Це не є семантично правильним. Якщо це корисно, чому HTML5 розміщує більше тегів, пов’язаних із зображеннями, для оптимізації семантики, з підписом, зображенням? Використовуйте тег img, як він був розроблений, і припиніть замінювати все на <div> s.
Матеус Леон

23

Об'єкт CSS3

Не впевнений, наскільки це було реалізовано webkit, IE та firefox. Але Opera працює як магія

object-fitпрацює зі вмістом SVG, але того ж ефекту можна також досягти, встановивши preserveAspectRatio=""атрибут у самому SVG.

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

Демо-версія Chris Mills тут 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" />


1

Чи потрібно додавати інкапсулюючий <div> або <span>?

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



0

Я можу придумати, щоб розтягнути або ширину, або висоту і дозволити їй змінювати розмір у співвідношенні-аспекті. З боків буде трохи пробілу. Щось на зразок того, як широкий екран відображає роздільну здатність 1024x768.


0

При використанні Flexbox є правильним вибором для вас (не потрібно SUPORT старих браузерів), перевірте мій інший відповідь тут (який, можливо , є дублікат цього):

В основному вам потрібно буде обернути свій тег 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 "фігура", який вирішив усі мої проблеми.

Я особисто не використовував зовнішній тег 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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.