CSS: 100% ширина або висота, зберігаючи співвідношення сторін?


174

Наразі за допомогою STYLE я можу використовуватись width: 100%і autoпо висоті (або навпаки), але все ще не можу обмежувати зображення у певному положенні, будь то занадто широке або занадто високе відповідно.

Будь-які ідеї?


3
ви можете опублікувати посилання або скріншот, щоб показати приклад проблеми?
Мауро

Відповіді:


138

Якщо ви визначите лише один вимір на зображенні, співвідношення сторін зображення завжди буде збережене.

Чи питання в тому, що зображення більше / вище, ніж вам подобається?

Ви можете помістити його всередині DIV, встановленого на максимальну висоту / ширину, яку ви хочете для зображення, а потім встановити переповнення: приховано. Це може обрізати все, що ви хочете.

Якщо зображення на 100% шириною та висотою: автоматично, і ви вважаєте, що воно занадто високе, це пов'язано саме з тим, що співвідношення сторін збережене. Вам потрібно буде обрізати або змінити співвідношення сторін.

Будь ласка, надайте додаткову інформацію про те, що ви конкретно намагаєтеся зробити, і я спробую допомогти більше!

--- РЕДАКЦІЯ НА ОСНОВІ ЗВЕРНЕННЯ ---

Чи знайомі ви з властивостями максимальної ширини та максимальної висоти ? Ви завжди можете їх встановити. Якщо ви не встановите мінімум і встановите максимальну висоту та ширину, то зображення не буде спотворене (співвідношення сторін буде збережене), і воно не буде більшим, ніж той розмір, який є найдовшим, і досяг його макс.


16
якщо зображення вище, ніж широке, я б використовував висоту = 100% і ширину = авто, якщо зображення ширше, ніж високе, я б використовував ширину = 100%, висоту = авто. я просто ніколи не знаю, у чому справа? обрізання на максимальну висоту / ширину спрацювало б - але якщо є спосіб не - я б скоріше скористався цим ...
Weston Watson

2
Що ж, ви проектуєте флюїдну або фіксовану ширину? Якщо ви маєте макет фіксованої ширини, ви завжди можете встановити свою ширину на 100%, і зображення буде масштабуватися належним чином, але воно може бути дуже високим. Ви намагаєтесь розмістити зображення в текстовому блоці або використовуєте його як банер або як фон? Якщо ви могли б показати сторінку, де ви плануєте її використовувати, або описати контекст, я можу вам більше допомогти. Дивіться також зміни, наведені вище.
Андрій

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

2
object-fitнемає користі?
LeeGee

77

Через кілька років, шукаючи ту саму вимогу, я знайшов варіант CSS, використовуючи розмір фону.

Він повинен працювати в сучасних браузерах (IE9 +).

<div id="container" style="background-image:url(myimage.png)">
</div>

І стиль:

#container
{
  width:  100px; /*or 70%, or what you want*/
  height: 200px; /*or 70%, or what you want*/
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}

Довідка: http://www.w3schools.com/cssref/css3_pr_background-size.asp

І демонстрація: http://www.w3schools.com/cssref/playit.asp?filename=playcss_background-size


3
ідеальне рішення, яке, на жаль, не підтримується IE8 :(
japrescott

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

58

Встановивши max-widthвластивість CSS на 100%, зображення заповнить ширину батьківського елемента, але не зробить більшим за його фактичний розмір, зберігаючи роздільну здатність.

Встановлення heightвластивості autoпідтримувати співвідношення сторін зображення, використовуючи цю техніку, дозволяє перекрити статичну висоту і дозволяє зображенню пропорційно згинатися у всіх напрямках.

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

1
поки установка heightдля autoпричин REflow коли зображення плавало
Григорій Pakosz

42

Просте елегантне робоче рішення:

img {
  width: 600px;  /*width of parent container*/
  height: 350px; /*height of parent container*/
  object-fit: contain;
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

3
Дякуємо, що нагадали про мене object-fit. Саме те, що мені було потрібно.
Еш Кларк

5
Це ідеальне рішення, але, на жаль object-fit, не підтримується жодними версіями IE і Edge станом на 28 березня 2017 року.
Simon G

2
Станом на березень 2019 року ця функція підтримує 90%, тому це дійсно слід вважати правильною відповіддю.
Hampus Ahlgren

Крім того , зверніть увагу , що object-fit: containі object-fit: coverне полюбить , widthяк 100% - ви повинні використовувати конкретні блоки , якpx
FlameStorm

Я спробував object-fitз max-widthі max-heightвикористовується в інших відповідях, але це не спрацювало. це ідеально підходить для випадкових розмірів зображень навіть з widthтаheight 100%
Halfacht

27

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

.img{
    max-width: 100%;
    max-height: 100%;
    height: inherit !important;
}

Саме те, що я шукав. Дякую мільйон чувак.
Лондон Сміт

Ідеально, коли розмір зображення може бути меншим або більшим, ніж батьківський поділ, і він буде змінено в ідеальний центр з максимальною шириною АБО максимальною висотою. Вам не доведеться використовувати зображення як фон, який просто переповнить батьківський, якщо встановлено значення "cover".
Рехмат

9

Просте рішення:

min-height: 100%;
min-width: 100%;
width: auto;
height: auto;
margin: 0;
padding: 0;

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

position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);

Це дійсно має працювати так, як очікувалося :)


схвалив першу частину. друга частина для мене не вийшла ... :(
Вікас Бансал

Лише одна проблема - якщо зображення більше 100% контейнера, воно розпливеться і вимагатиме прокрутки або обрізання. Не впевнений, як досягти того ж і все-таки обмежити максимальний розмір контейнера. Якщо встановити максимальну ширину та висоту, це більше не зберігає співвідношення сторін.
JustAMartin

5

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

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

Тож скажімо, що у вас є контейнер, який чуйний, але він має чітко визначені межі для мінімальної та максимальної ширини та висоти.

.photo {
  max-width: 150px;
  min-width: 75px;
  max-height: 150px;
  min-height: 75px;
}

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

У img слід також визначати максимальну ширину 100%, щоб по-перше дозволяти виводити менші ширини, а по-друге, на основі відсотків, що робить його параметричним.

.photo > img {
  max-width: 100%;
  max-height: 150px;
  -webkit-box-shadow: 0 0 13px 3px rgba(0,0,0,1);
  -moz-box-shadow:    0 0 13px 3px rgba(0,0,0,1);
  box-shadow:         0 0 13px 3px rgba(0,0,0,1);
}

Зауважте, що він має приємну тінь;)

Насолоджуйтесь живим прикладом у цій скрипці: http://jsfiddle.net/pligor/gx8qthqL/2/


Ура - саме те, що я шукав.
Елі

Дякуємо за це рішення та посилання jsdfiddle. Це фактично працювало для моєї галереї реакцій-зображень, де я використовую і те, і інше: зображення більшої висоти та зображення з більшою шириною. :)
Євгеніюс С.

4

Я використовую це для прямокутного контейнера з фіксованою висотою та шириною, але із зображеннями різних розмірів.

img {
  max-width: 95%;
  max-height: 15em;
  width: auto !important;
}

3

Найкраще використовувати авто на розмір, який повинен дотримуватися співвідношення сторін. Якщо ви не встановите інше властивість для автоматичного, більшість браузерів сьогодні вважають, що ви хочете поважати пропорції, але не всі (наприклад, IE10 на Windows Phone 8).

width: 100%;
height: auto;

2

Це дуже просте рішення, яке я придумав після переходу посилання на conca та перегляду розміру фону. Він підірває зображення вгору, а потім вписує його по центру у зовнішній контейнер без його масштабування.

<style>
#cropcontainer
{
  width:  100%; 
  height: 100%; 
  background-size: 140%;
  background-position: center;
  background-repeat: no-repeat;
}
</style>

<div id="cropcontainer" style="background-image: url(yoururl); />

Гарне та розумне рішення! З додатковими 40% ви компенсуєте співвідношення сторін. Дякую!
Саша

Ви також можете просто скористатися background-size: contain;зображенням на задньому плані.
Simon G

1

Не заскочити в старе питання, але ...

#container img {
      max-width:100%;
      height:auto !important;
}

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


1

В даний час можна використовувати vwі vhблоки, які представляють собою 1% проти iewport - х ш IDþ і ч вісім відповідно.

https://css-tricks.com/fun-viewport-units/

Так, наприклад:

img {
  max-width: 100vw;
  max-height: 100vh;
}

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


0

Використовуйте JQuery чи інше, оскільки CSS - це загальне неправильне уявлення (про це свідчать незліченні питання та дискусії щодо простих цілей дизайну).

Не можна з CSS робити те, що вам здається: зображення має мати ширину 100%, але якщо ця ширина призводить до занадто великої висоти, застосовується максимальна висота - і, звичайно, правильні пропорції повинні бути збереглися.


-2

Я думаю, що це те, що ти шукав, я шукав його сам, але потім я згадав це знову, поки я знайшов код.

background-repeat: repeat-x;
background-position: top;
background-size:auto;
background-attachment: fixed;

Цифрова еволюція на шляху.

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