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


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.