Розмір зображення CSS, як заповнити, а не розтягнути?


415

У мене є зображення, і я хочу встановити його конкретну ширину та висоту (у пікселях)

Але якщо я встановлю ширину та висоту за допомогою css ( width:150px; height:100px), зображення буде розтягнуте, і воно може бути некрасивим.

Як заповнити зображення до певного розміру за допомогою CSS, не розтягуючи його?

Приклад заповнення та розтягування зображення:

Оригінальне зображення:

Оригінал

Розтягнуте зображення:

Розтягнуті

Заповнене зображення:

Заповнений

Зауважте, що у прикладі Заповнене зображення вище: спочатку зображення змінюється до 150x255 (підтримується співвідношення сторін), а потім обрізається до 150x100.


Спробуйте просто встановити widthі heightслід відповідно відрегулювати
NewInTheBusiness

3
Це розтягує зображення. дивіться це: jsfiddle.net/D7E3E
Махді Гхіасі

Вона займає частину зображення, не змінюючи розмір!
Алі Бен Мессауд

3
Кріс Койєр також має кілька хороших рішень для цього: css-tricks.com/perfect-full-page-background-image
неоднозначнемая

1
ДУЖЕ ВАЖЛИВО: це надзвичайно погана практика для цілей SEO. Якщо ви використовуєте його як фонове зображення, тоді він працює нормально, але якщо ви хочете, щоб зображення було знайдено Google, воно НЕ буде індексуватися, якщо це лише фонове зображення.
Алекс Банман

Відповіді:


395

Якщо ви хочете використовувати зображення як фон CSS, є елегантне рішення. Просто використовуйте coverабо containу background-sizeвластивості CSS3.

.container {
  width: 150px;
  height: 100px;
  background-image: url("http://i.stack.imgur.com/2OrtT.jpg");
  background-size: cover;
  background-repeat: no-repeat;
  background-position: 50% 50%;
}
<div class="container"></div>

Поки coverдасть вам зменшене зображення, containдасть вам зменшене зображення. Обидва збережуть співвідношення пікселів.

http://jsfiddle.net/uTHqs/ (використовуючи обкладинку)

http://jsfiddle.net/HZ2FT/ (з використанням містити)

Такий підхід має перевагу в тому, що він є привітним до дисплеїв Retina згідно швидкого керівництва Томаса Фукса.

Варто зазначити, що підтримка браузера для обох атрибутів виключає IE6-8.


1
Оскільки ви можете просто змінити розмір зображення в CSS, це дозволяє використовувати велике зображення, а потім масштабувати його відповідно до щільності пікселів кожного пристрою, використовуючи медіа-запити.
Марсело Де Поллі

1
Чи можете ви пояснити, чому в цьому випадку позиція фону, схоже, вказує на розташування центру зображення, а не на верхній лівий кут? Це наслідок розміру тла: обкладинка?
Маттео

1
міна просто охоплює весь DIV розширює зображення. Я не бачу, як крива закінчується.
SearchForKnowledge

3
Для чого background-repeat: no-repeat;? Якщо зображення охоплює контейнер, воно все одно не повториться.
lurkit

3
"background-position" також може бути встановлено як "center center". напр .: .container {... background-position: центр центру; }
Лев Рібейро

556

Ви можете використовувати властивість css object-fit.

.cover {
  object-fit: cover;
  width: 50px;
  height: 100px;
}
<img src="http://i.stack.imgur.com/2OrtT.jpg" class="cover" width="242" height="363" />

Дивіться приклад тут

Існує поліфайл для IE: https://github.com/anselmh/object-fit


11
Цікаво побачити, що це можна зробити і за допомогою imgтегів (не тільки background-imageметод, як описано у відповіді вище). Дякую :)
Махді Гхіасі

44
Розглядаючи це як варіант, майте на увазі, що object-fit він не підтримується у дуже багатьох браузерах .
joshreesjones

2
На жаль background-size, рідко є життєздатним рішенням у моїх проектах. Ви рідше отримуєте будь-яку перевагу для SEO та не можете надавати тег, підпис ALT та ін., Щоб супроводжувати зображення, де ви можете надати додатковий контекст для читачів екрану.
Маркус

3
Це круто, але немає підтримки IE. Жоден з поліфілів більше не працює.
Джейк

3
Просто використання object-fit: cover;робить це. Велике спасибі
Лука

67

Доповнення до вищевказаної відповіді від @afonsoduarte ( НЕ прийнятої) .
у випадку, якщо ви використовуєте завантажувальний пристрій


Є три відмінності:

  1. Забезпечення width:100%стилю.
    Це корисно, якщо ви використовуєте завантажувальний інструмент і хочете, щоб зображення розтягнуло всю наявну ширину.

  2. Вказати heightвластивість необов'язково. Ви можете його видалити / зберегти як потрібно

    .cover {
       object-fit: cover;
       width: 100%;
       /*height: 300px;  optional, you can remove it, but in my case it was good */
    }
  3. До речі, НЕ потрібно вказувати атрибути heightта widthатрибути на imageелементі, тому що вони будуть перекреслені стилем.
    тому досить написати щось подібне.

    <img class="cover" src="url to img ..."  />

1
Саме те, що я шукав.
Францис Лантіє

1
Вам потрібен поцілунок!
Цінь Ван

object-fit не працює з IE?
bgcode

1
це 2020 рік, я думаю, що саме час відмовитися від IE
Hakan Fıstık

56

Єдиний реальний спосіб - мати контейнер навколо зображення та використовувати overflow:hidden:

HTML

<div class="container"><img src="ckk.jpg" /></div>

CSS

.container {
    width: 300px;
    height: 200px;
    display: block;
    position: relative;
    overflow: hidden;
}

.container img {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
}

У CSS це болісно робити те, що ви хочете, і зосереджувати зображення. Швидке виправлення у jquery, наприклад:

var conHeight = $(".container").height();
var imgHeight = $(".container img").height();
var gap = (imgHeight - conHeight) / 2;
$(".container img").css("margin-top", -gap);

http://jsfiddle.net/x86Q7/2/


1
Дякую. це спрацювало, але воно обробляє зображення зверху . (див. це: jsfiddle.net/x86Q7 ) Чи немає способу обрізати зображення з центру ?
Махді Гіасі

1
@MahdiGhiasi: Зміна верхнього та лівого властивостей у .container img css !!
Алі Бен Мессауд

Я можу встановити margin-topзображення, наприклад 50px(див. Це: jsfiddle.net/x86Q7/1 ), але як обрізати його з реального центру ? (Без jQuery?)
Махді Гхіасі

2
Ах вибачте, що не побачив ваш коментар, але я додав jquery просто на випадок :)
Домінік Зелений

1
Чудове рішення! Для мене вертикальна заливка була важливішою за горизонтальну, тому мені довелося просто змінити "ширина: 100%" на "висота: 100%" для класу ".container img". Дякую!
поглиблення

26

CSS-рішення без JS та фонового зображення:

Спосіб 1 "автоматична маржа" (IE8 + - НЕ FF!):

div{
  width:150px; 
  height:100px; 
  position:relative;
  overflow:hidden;
}
div img{
  position:absolute; 
  top:0; 
  bottom:0; 
  margin: auto;
  width:100%;
}
<p>Original:</p>
<img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>

<p>Wrapped:</p>
<div>
  <img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
</div>

http://jsfiddle.net/5xjr05dt/

Спосіб 2 "перетворення" (IE9 +):

div{
  width:150px; 
  height:100px; 
  position:relative;
  overflow:hidden;
}

div img{
  position:absolute; 
  width:100%;
  top: 50%;
  -ms-transform: translateY(-50%);
  -webkit-transform: translateY(-50%);
  transform: translateY(-50%);
}
<p>Original:</p>
<img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>

<p>Wrapped:</p>
<div>
  <img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
</div>

http://jsfiddle.net/5xjr05dt/1/

Спосіб 2 може використовуватися для центрування зображення в контейнері з фіксованою шириною / висотою. Обидва можуть переповнюватись - і якщо зображення менше, ніж контейнер, воно все одно буде по центру.

http://jsfiddle.net/5xjr05dt/3/

Спосіб 3 "подвійний обгортка" (IE8 + - НЕ FF!):

.outer{
  width:150px; 
  height:100px; 
  margin: 200px auto; /* just for example */
  border: 1px solid red; /* just for example */
  /* overflow: hidden;	*/ /* TURN THIS ON */
  position: relative;
}
.inner { 
    border: 1px solid green; /* just for example */
    position: absolute;
    top: 0;
    bottom: 0;
    margin: auto;
    display: table;
    left: 50%;
}
.inner img {
    display: block;
    border: 1px solid blue; /* just for example */
    position: relative;
    right: 50%;
    opacity: .5; /* just for example */
}
<div class="outer">
  <div class="inner">
     <img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
  </div>
</div>

http://jsfiddle.net/5xjr05dt/5/

Спосіб 4 "подвійне обгортка та подвійне зображення" (IE8 +):

.outer{
  width:150px; 
  height:100px; 
  margin: 200px auto; /* just for example */
  border: 1px solid red; /* just for example */
  /* overflow: hidden;	*/ /* TURN THIS ON */
  position: relative;
}
.inner { 
    border: 1px solid green; /* just for example */
    position: absolute;
    top: 50%;
    bottom: 0;
    display: table;
    left: 50%;
}
.inner .real_image {
    display: block;
    border: 1px solid blue; /* just for example */
    position: absolute;
    bottom: 50%;
    right: 50%;
    opacity: .5; /* just for example */
}

.inner .placeholder_image{
  opacity: 0.1; /* should be 0 */
}
<div class="outer">
  <div class="inner">
    <img class="real_image" src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
    <img class="placeholder_image"  src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
  </div>
</div>

http://jsfiddle.net/5xjr05dt/26/

  • Спосіб 1 має трохи кращу підтримку - ви повинні встановити ширину АБО висоту зображення!
  • З методом префіксів 2 також є гідна підтримка (від ie9 вгору) - метод 2 не підтримує Opera mini!
  • Спосіб 3 використовує дві обгортки - можуть переповнювати ширину І висоту.
  • У способі 4 використовується подвійне зображення (одне як заповнювач), це дає додаткову накладну пропускну здатність, але ще кращу підтримку крос-браузера.

Спосіб 1 і 3, здається, не працює з Firefox


Це єдиний, який насправді працює (мінус js рішення). Дякую!
Джейк

Вона обмежується переповненням або висоти, або ширини, але цікавим рішенням.
Джейк

1
@Jake - Можна переповнювати ширину І висоту за допомогою способу 2 вище - див. Мою оновлену відповідь із додатковою скрипкою.
JT Houtenbos

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

1
@Jake - Cool - я знайшов 3-й метод зробити горизонтальне центрування. Я розширив цей метод і на підтримку вертикального центрування. Я опублікую своє доповнення як 3-й метод вище. Здається, це доказ IE7 + (можливо, навіть нижчий). Ось оригінальну відповідь: stackoverflow.com/questions/3300660 / ...
JT Houtenbos

10

Ще одне рішення - помістити зображення в контейнер з потрібною шириною і висотою. Використовуючи цей метод, вам не доведеться встановлювати зображення як фонове зображення елемента.

Тоді ви можете зробити це за допомогою imgтегу і просто встановити максимальну ширину та максимальну висоту на елементі.

CSS:

.imgContainer {
    display: block;
    width: 150px; 
    height: 100px;
}

.imgContainer img {
    max-width: 100%;
    max-height: 100%;
}

HTML:

<div class='imgContainer'>
    <img src='imagesrc.jpg' />
</div>

Тепер, коли ви зміните розмір контейнера, зображення автоматично зросте максимально великим, не виходячи за межі або спотворюючи.

Якщо ви хочете центрувати зображення вертикально і горизонтально, ви можете змінити css контейнера на:

.imgContainer {
    display: table-cell;
    width: 150px; 
    height: 100px;
    text-align: center;
    vertical-align: middle;
}

Ось JS Fiddle http://jsfiddle.net/9kUYC/2/


Це не те саме, що обкладинка в CSS, де один із результуючих розмірів завжди перевищує 100% (або рівний за краєм)
Miroshko

Ні, це рішення гарантує, що воно ніколи не тягнеться за межі 100%, саме про це було питання. Вони не хотіли, щоб зображення спотворювалося або зростало понад вихідні розміри.
Earl3s

3
Питання було «Як заповнити» прикладом заповненого зображення, яке, очевидно, обрізане.
Мирошко

Але що робити, якщо вам потрібно, щоб зображення відповідало? Визначення конкретної ширини та висоти не спрацює 😕
Рікардо Зее

2
Це було те, що мені було потрібно. Дякую!
Ніко Родзевич

5

Побудова відповіді @Dominic Green за допомогою jQuery, ось рішення, яке повинно працювати для зображень, які ширші, ніж вони високі або вищі, ніж вони широкі.

http://jsfiddle.net/grZLR/4/

Мабуть, є більш елегантний спосіб роботи з JavaScript, але це справді працює.

function myTest() {
  var imgH = $("#my-img").height();
  var imgW = $("#my-img").width();
  if(imgW > imgH) {
    $(".container img").css("height", "100%");
    var conWidth = $(".container").width();
    var imgWidth = $(".container img").width();
    var gap = (imgWidth - conWidth)/2;
    $(".container img").css("margin-left", -gap);
  } else {
    $(".container img").css("width", "100%");
    var conHeight = $(".container").height();
    var imgHeight = $(".container img").height();
    var gap = (imgHeight - conHeight)/2;
    $(".container img").css("margin-top", -gap);
  }
}
myTest();

5
  • Не використовується фон css
  • Лише 1 дів, щоб відключити його
  • Зменшено до мінімальної ширини, ніж зберегти правильне співвідношення сторін
  • Обрізання від центру (вертикально і горизонтально, ви можете налаштувати це зверху, ліворуч та перетворити)

Будьте обережні, якщо ви використовуєте тему чи щось таке, вони часто оголошують максимальну ширину img на 100%. Ви нічого не повинні робити. Перевірте :)

https://jsfiddle.net/o63u8sh4/

<p>Original:</p>
<img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>

<p>Wrapped:</p>
<div>
    <img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
</div>


div{
  width:150px; 
  height:100px; 
  position:relative;
  overflow:hidden;
}
div img{
  min-width:100%;
  min-height:100%;
  height:auto;
  position:relative;
  top:50%;
  left:50%;
  transform:translateY(-50%) translateX(-50%);
}

Це є відповіддю я шукав.
Маркос

Це я хотів зробити давно, дякую;)
Бос COTIGA

4

Я допоміг створити плагін jQuery під назвою Fillmore , який обробляє background-size: coverвеб-переглядачі, які його підтримують, і має сенс для тих, хто цього не робить. Подивіться!


4

Я думаю, що для цієї відповіді досить пізно. У будь-якому випадку сподіваюся, що це допоможе комусь у майбутньому. Я зіткнувся з проблемою розташування карт у кутовому. Існують картки для масиву подій. Якщо ширина зображення події для картки велика, зображення має бути показане обрізанням з двох сторін та висотою 100%. Якщо висота зображення довга, нижня частина зображення обрізається, а ширина - 100%. Ось моє чисте рішення css для цього:

введіть тут опис зображення

HTML:

 <span class="block clear img-card b-b b-light text-center" [ngStyle]="{'background-image' : 'url('+event.image+')'}"></span>

CSS

.img-card {
background-repeat: no-repeat;
background-size: cover;
background-position: 50% 50%;
width: 100%;
overflow: hidden;
}

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

Дякую за відгук, дорогий Майк, я радий, якщо це було корисно. Ви хочете, щоб я оновив відповідь вашим коментарем?
Nodirabegimxonoyim

3

Спробуйте щось подібне: http://jsfiddle.net/D7E3E/4/

Використання контейнера з переповненням: приховано

EDIT: @Dominic Green побив мене.


Дякую. це спрацювало, але воно обробляє зображення зверху . (див. це: jsfiddle.net/x86Q7 ) Чи немає способу обрізати зображення з центру ?
Махді Гхіасі

З CSS це може бути досить складно, це найкраще, що я міг би придумати jsfiddle.net/D7E3E/5
woutr_be

Так, для правильного його центрування вам слід використовувати jQuery, можливо, набагато простіше.
woutr_be

3

Це дозволить заповнити зображення до певного розміру, не розтягуючи його чи не обрізаючи

img{
    width:150px;  //your requirement size
    height:100px; //your requirement size

/*Scale down will take the necessary specified space that is 150px x 100px without stretching the image*/
    object-fit:scale-down;
}

2

Щоб розмістити зображення на повноекранному екрані, спробуйте це:

фон-повтор: круглий;


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