css — Как вписать картинку в блок с сохранением пропорций

Вопрос задан

Изменён 2 года 1 месяц назад

Просмотрен 300 раз

Есть слайдер (не мною написанный). В нем есть родительский блок, который содержит флек-итемы. Этот блок прокручивается за пределы дисплея при нажатии на стрелки. В флекс-итемах (div, они расширены во весь дисплей) есть картинки обернутые в . Нужно вписать в блок картинку неизвестного размера (размер может быть гораздо больше размера дисплея или гораздо меньше). Блок же тоже может быть разного размера — по размеру дисплея (1920, 1200, 1024, 800 и т. д.). Это нужно для того чтобы этот блок использовался для десктопного и мобильного вида. Пропорции картинки тоже могут быть разные. Нужно чтобы картинка вписывалась в этот блок целиком (если размер картинки больше размера блок — сжималась, если меньше — расширялась до размеров блока), но с сохранением пропорций. Причем может быть так 3600px * 200px — нужно чтобы картинка вписалась в виде тонкой полоски (пропорционально уменьшившись).

Сейчас так:

  .imageLink: {
    max-height: 100%;
    margin: auto;
    display: flex;
    justifyContent: center;
    overflow: hidden;
  }
  .image: {
    object-fit: contain;
  },

На больших дисплеях картинка хорошо вписывается, но если ширина больше мобильного дисплея — обрезается по краям

1

Впишите картинку как background-image, no-repeat cover center, а родителю выставьте требуемый размер.

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

object-fit — CSS | MDN

Свойство object-fit определяет, как содержимое заменяемого элемента, такого как <img> или <video>, должно заполнять контейнер относительно его высоты и ширины.

Для object-fit можно указать одно из нижеперечисленных свойств.

Значения

fill

Смещаемый контент меняет свой размер таким образом, чтобы заполнить всю область внутри блока: используется вся ширина и высота блока.

contain

Смещаемый контент меняет свой размер таким образом, чтобы подстроиться под область внутри блока пропорционально собственным параметрам: окончательный размер контента будет определён как «помещённый внутрь» блока, ограничиваясь его шириной и высотой.

cover

Смещаемый контент меняет свой размер таким образом, чтобы сохранять свои пропорции при заполнении блока: окончательный размер контента будет определён как «покрытие» блока, ограничиваясь его шириной и высотой.

none

Смещаемый контент не изменяет свой размер с целью заполнить пространство блока: конечный размер контента будет определён с использованием алгоритма изменения размера по умолчанию, а также размер объекта по умолчанию равен ширине и высоте смещаемого контента.

scale-down

Контент изменяет размер, сравнивая разницу между none и contain, для того, чтобы найти наименьший конкретный размер объекта.

Правильный синтаксис

object-fit = 
fill | (en-US)
contain | (en-US)
cover | (en-US)
none | (en-US)
scale-down

HTML Контент

<div>
  <h3>object-fit: fill</h3>
  <img src="mdn_logo_only_color.png" alt="MDN Logo"/>
  <img src="mdn_logo_only_color.png" alt="MDN Logo"/>
  <h3>object-fit: contain</h3>
  <img src="mdn_logo_only_color.
png" alt="MDN Logo"/> <img src="mdn_logo_only_color.png" alt="MDN Logo"/> <h3>object-fit: cover</h3> <img src="mdn_logo_only_color.png" alt="MDN Logo"/> <img src="mdn_logo_only_color.png" alt="MDN Logo"/> <h3>object-fit: none</h3> <img src="mdn_logo_only_color.png" alt="MDN Logo"/> <img src="mdn_logo_only_color.png" alt="MDN Logo"/> <h3>object-fit: scale-down</h3> <img src="mdn_logo_only_color.png" alt="MDN Logo"/> <img src="mdn_logo_only_color.png" alt="MDN Logo"/> </div>

CSS Контент

h3 {
  font-family: Courier New, monospace;
  font-size: 1em;
  margin: 1em 0 0.3em;
}
div {
  display: flex;
  flex-direction: column;
  flex-wrap: wrap;
  align-items: flex-start;
  height: 940px;
}
img {
  width: 150px;
  height: 100px;
  border: 1px solid #000;
}
.narrow {
  width: 100px;
  height: 150px;
  margin-top: 10px;
}
.fill {
  object-fit: fill;
}
.contain {
  object-fit: contain;
}
.
cover { object-fit: cover; } .none { object-fit: none; } .scale-down { object-fit: scale-down; }

Результат

SpecificationStatusComment
CSS Images Module Level 4
Определение ‘object-fit’ в этой спецификации.
Рабочий черновикДобавлены ключевые слова from-image и flip
CSS Images Module Level 3
Определение ‘object-fit’ в этой спецификации.
Кандидат в рекомендацииПервоначальное определение
Начальное значениеfill
Применяется кзаменяемые элементы
Наследуетсянет
Обработка значениякак указано
Animation typediscrete

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

  • Другие свойства CSS, связанные с изображениями (картинками): object-position, image-orientation (en-US), image-rendering (en-US), image-resolution (en-US).
  • background-size

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.
Want to get more involved?

Learn how to contribute.

This page was last modified on by MDN contributors.

html — заставить изображение соответствовать размеру и сохранить соотношение сторон

Задавать вопрос

спросил

7 лет, 5 месяцев назад

Изменено 4 года, 9 месяцев назад

Просмотрено 74к раз

Я хочу, чтобы изображение заполняло 100% ширины своего контейнера, и я хочу, чтобы для него было установлено свойство max-heigth, сохраняя соотношение сторон, но позволяя потерять любую часть изображения.

 изображение {
   максимальная высота: 200 пикселей;
   ширина:100%;
}
 

Я знаю, что подобное можно сделать со свойством background-size

, но я хочу сделать это со встроенным тегом .

Любая идея о том, как я могу добиться этого с помощью CSS? или джаваскрипт?

  • HTML
  • CSS
0

Вы можете попробовать CSS3 object-fit и увидеть поддержку браузера таблицы .

CSS3 object-fit / object-position Метод определения того, как объект (изображение или видео) должен помещаться внутри его коробка. параметры объектной подгонки включают «содержать» (подгонка в соответствии с аспектом соотношение), «заливка» (растягивает объект до заполнения) и «обложка» (переполняет поле но сохраняет соотношение), где положение объекта позволяет объекту быть перемещается, как это делает background-image.

JSFIDDLE ДЕМО

 .контейнер {
  ширина: 200 пикселей; /*любого размера*/
  высота: 200 пикселей; /*любого размера*/
}

.object-fit-cover {
  ширина: 100%;
  высота: 100%;
  объект подходит: обложка; /*магия*/
} 
 <дел>
  

Связанная информация:

  • Изучение соответствия объекта ★ Взломы Mozilla

  • Polyfill для свойства соответствия объекту CSS

0

Вы можете добиться этого, используя свойства css flex. См. приведенный ниже код

 .img-container {
  ширина: 150 пикселей;
  высота: 150 пикселей;
  граница: 2 пикселя сплошного красного цвета;
  выравнивание содержимого: по центру;
  дисплей: гибкий;
  flex-направление: строка;
  переполнение: скрыто;
  
}
.img-контейнер .img-to-fit {
  гибкий: 1;
  высота: 100%;
} 
 <дел>
   pexels.com/photos/8633/nature-tree-green-pine.jpg" />
 
0

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

html — автоматическое масштабирование изображения с сохранением соотношения сторон

Задавать вопрос

спросил

Изменено 3 года, 10 месяцев назад

Просмотрено 4к раз

У меня есть img внутри тега div, и в настоящее время я использую CSS

 img {
    максимальная высота: 100%;
    максимальная ширина: 100%;
}
 

В настоящее время изображения помещаются внутри div, чего я и хотел. Однако, если файл изображения меньше, чем div, изображение не будет иметь максимально возможный размер. Есть ли простой способ максимизировать изображение, сохраняя при этом изображение внутри div и сохраняя исходное соотношение сторон?

Я пытался установить высоту 100% с максимальной шириной 100%, но это искажает изображение, а это не то, что мне нужно. я тоже пробовал подходит для объекта: содержит; , но это, похоже, ничего не делает.

Спасибо 🙂

  • HTML
  • CSS
2

Ответ @Michelangelo — еще один способ достичь цели. Если вы хотите, чтобы ваше изображение было внутри тега img (как и ваш исходный пост), сохраните значения max-width и max-height и поместите одно из них в свой класс CSS:

1) Keep соотношение сторон по ширине:

 ширина: 300 пикселей; /* Ваша предпочтительная ширина */
высота: авто;
 

2) Сохранить соотношение сторон в зависимости от высоты:

 ширина: авто;
высота: 300 пикселей; /* Ваша предпочтительная высота */
 

Я бы также посоветовал вам взглянуть на свойство object-fit здесь: https://www.w3schools.com/css/css3_object-fit.asp

Это своего рода свойство background-size , когда вы вводите такие значения, как , содержат или , покрывают , плюс вы можете указать ширина и высота без усложнения макета/иерархии DOM. Это очень удобно при работе с внутренними размерами элементов.

2

Попробуйте добавить его в качестве фона, тогда вы можете сделать это:

 div {
      фон: url(images/bg.jpg) фиксированный центр без повторов;
      -webkit-background-size: обложка;
      -moz-background-size: обложка;
      -o-background-size: обложка;
      размер фона: обложка;
}
 
6

Если вы хотите сохранить изображение как элемент HTML, а не как фон CSS, я бы использовал объектную подгонку. Существуют ограничения поддержки этого свойства CSS в браузерах.

https://caniuse.com/#search=object-fit

Для борьбы с этим можно использовать полифилл. Такой как: https://github.com/fregante/object-fit-images

Примером того, что, как мне кажется, вам нужно, может быть: https://codepen.io/bin-man/pen/NWKNWLm

 .image-контейнер img {
  объект подходит: обложка;
}
 

Вы можете поэкспериментировать с размерами изображения и удалить объектную подгонку, чтобы посмотреть, как оно себя ведет.

Надеюсь, это поможет.

Думаю, это то, что вам нужно… Пожалуйста, запустите фрагмент кода…

 раздел {
  ширина: 100 пикселей;
  высота: 100 пикселей;
}

раздел > изображение {
  максимальная ширина: 100%;
  максимальная высота: 100%;
  объект-подгонка: уменьшение масштаба;
} 
 <дел>