Object fit css что это
Перейти к содержимому

Object fit css что это

  • автор:

object-fit

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

Интерактивный пример

Синтаксис

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

Значения

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

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

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

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

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

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

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

Пример

HTML Контент

div> h2>object-fit: fillh2> img src="mdn_logo_only_color.png" alt="MDN Logo" class="fill" /> img src="mdn_logo_only_color.png" alt="MDN Logo" class="fill narrow" /> h2>object-fit: containh2> img src="mdn_logo_only_color.png" alt="MDN Logo" class="contain" /> img src="mdn_logo_only_color.png" alt="MDN Logo" class="contain narrow" /> h2>object-fit: coverh2> img src="mdn_logo_only_color.png" alt="MDN Logo" class="cover" /> img src="mdn_logo_only_color.png" alt="MDN Logo" class="cover narrow" /> h2>object-fit: noneh2> img src="mdn_logo_only_color.png" alt="MDN Logo" class="none" /> img src="mdn_logo_only_color.png" alt="MDN Logo" class="none narrow" /> h2>object-fit: scale-downh2> img src="mdn_logo_only_color.png" alt="MDN Logo" class="scale-down" /> img src="mdn_logo_only_color.png" alt="MDN Logo" class="scale-down narrow" /> div> 

CSS Контент

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

Результат

Технические параметры

Specification
CSS Images Module Level 3
# the-object-fit
Начальное значение fill
Применяется к заменяемые элементы
Наследуется нет
Обработка значения как указано
Animation type discrete

Как использовать object-fit и background-size в CSS

Как использовать object-fit и background-size в CSS

Мы не всегда можем предоставить для HTML элемента изображение нужного размера. Если же мы используем контейнер с шириной и высотой, которые не пропорциональны соотношению сторон изображения, то изображение будет либо сжато, либо растянуто. Это выглядит нехорошо, однако решить эту проблему можно либо применив свойство object-fit к элементу img , либо с помощью свойства background-size .

Для начала давайте определимся с проблемой. Посмотрите на следующий рисунок:

Нормальное и сжатое изображение

Почему это происходит?

Браузер заполняет содержащий изображение элемент заданным изображением. При этом у любого изображения есть свое соотношение сторон. И если соотношение сторон изображения отличается от указанных для него ширины и высоты, то результатом будет либо сжатое, либо растянутое изображение.

Мы видим это на следующем рисунке:

Нормальное и растянутое изображение

Решение проблемы

Нам не всегда нужно добавлять изображение другого размера, если соотношение сторон изображения не совпадает с шириной и высотой контейнера. Прежде чем погрузиться в CSS-решения, мы хотим показать вам, как мы делали это в приложениях для редактирования изображений:

Пример изображения, обрезанного по маске сверху и снизу

Теперь, когда мы понимаем, как это работает, давайте разберемся, как это работает в браузере.

CSS свойство object-fit

Свойство object-fit определяет, как должен измениться размер содержимого заменяемого элемента, например, img или video , чтобы подстроиться под контейнер. По умолчанию object-fit имеет значение fill , что может привести к сжиманию или растягиванию изображения.

Давайте рассмотрим возможные значения.

object-fit: contain

В этом случае размер изображения будет изменен в соответствии с соотношением сторон контейнера. Если соотношение сторон изображения не совпадает с соотношением сторон контейнера, то оно будет дополнено черными каше.

object-fit: contain

object-fit: cover

В этом случае размер изображения также будет изменен в соответствии с соотношением сторон контейнера, и если соотношение сторон изображения не соответствует размеру контейнера, оно будет обрезано по размеру.

object-fit: cover

object-fit: fill

При этом значении размер изображения будет изменен в соответствии с соотношением сторон контейнера, и если соотношение сторон изображения не соответствует размеру контейнера, оно будет либо сжато, либо растянуто. Но мы этого не хотим.

object-fit: fill

object-fit: none

В этом случае размер изображения вообще не будет изменен, ни растянут, ни сжат. Это значение работает так же, как значение cover , но при этом не учитывается соотношение сторон контейнера.

object-fit: none

Кроме свойства object-fit , еще есть свойство object-position , которое отвечает за положение изображения внутри контейнера.

Возможные значения свойства object-position

Свойство object-position работает аналогично свойству CSS background-position :

object-position: center, left, right

Ключевые слова top и bottom также работают, когда соотношение сторон контейнера по вертикали больше:

object-position: top и bottom

Свойство background-size

Основное отличие свойства background-size заключается в том, что мы имеем дело с фоном, а не с HTML элементом ( img ).

Возможные значения background-size

Свойство background-size может принимать значения auto , contain и cover .

background-size: auto

При значении auto изображение сохраняет свой оригинальный размер:

background-size: auto

background-size: cover

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

background-size: cover

background-size: contain

В этом случае размер изображения будет изменен таким образом, чтобы оно помещалось в контейнер. Если соотношение сторон не совпадает, то изображение будет дополнено черными полосами (каше), как показано в следующем примере:

background-size: contain

Что касается background-position , то оно работает также, как object-position . Единственное отличие состоит в том, что позиция по умолчанию object-position отличается от позиции по умолчанию background-position .

Когда не следует использовать object-fit или background-size

Если элементу или изображению задана фиксированная высота и установлено свойство background-size: cover или object-fit: cover , то появится момент, когда изображение станет слишком широким, что приведет к потере важных деталей, которые могут повлиять на восприятие изображения пользователем.

Рассмотрим следующий пример, в котором изображению задана фиксированная высота:

 .card__thumb

Пример, где изображение слишком растянуто в ширину из-за фиксированной высоты и слишком широкого контейнера

Если контейнер слишком широк, это приведет к результату, который мы видим на рисунке справа (изображение слишком широкое). Это происходит потому, что мы не задаем соотношение сторон.

Решить эту проблему можно только двумя способами. Первый — это использовать трюк под названием «padding hack», чтобы создать внутреннее соотношение сторон.

 .card__thumb < position: relative; padding-bottom: 75%; height: 0; >.card__thumb img

Второй способ это использовать новое CSS свойство aspect-ratio :

 .card__thumb img < aspect-ratio: 4 / 3; >

Случаи использования и примеры

Аватары пользователей

Идеальный вариант использования object-fit: cover — это аватары пользователей. Обычно соотношение сторон, допустимое для аватара, квадратное. Размещение изображения в квадратном контейнере может исказить изображение.

Аватар пользователя без object-fit и с object-fit: cover

 .c-avatar

Список логотипов

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

К счастью, для этого отлично подходит object-fit: contain .

 .logo__img

Список логотипов: Airbnb, Domino’s Pizza, Apple Pay, Amazon

Миниатюра для статьи

Это очень распространенный вариант использования. Контейнер для миниатюры статьи может не всегда содержать изображение с одинаковым соотношением сторон. Эта проблема в первую очередь должна устраняться системой управления контентом (CMS), но это происходит не всегда.

 .article__thumb

Миниатюра статьи

Задний фон заголовка статьи

В этом случае решение о том, использовать элемент img или фон CSS будет зависеть от следующего:

  • Имеет ли изображение важное значение? Если CSS по какой-то причине будет отключен, хотим ли мы, чтобы пользователь видел изображение?
  • Или же у изображения просто декоративное назначение?

Основываясь на ответе на эти вопросы, мы можем решить, какой способ использовать. Если изображение важно:

Задний план для заголовка статьи

  
 .hero < position: relative; >.hero__thumb

Если изображение имеет чисто декоративную функцию, то мы можем использовать свойство background-image :

 .hero

В этом случае код CSS будет короче. Стоит убедиться, что весь текст, отображаемый поверх изображения, хорошо виден.

Добавление фона к изображению при помощи object-fit: contain

А вы знаете, что вы можете добавить цвет фона для img ? Это еще один плюс при использовании object-fit: contain .

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

Добавления фонового цвета изображения при помощи object-fit: contain

Видеоэлемент

Требовалось ли вам когда-нибудь установить видео в качестве фона? Если да, то вы, вероятно, хотели бы, чтобы оно занимало бы всю ширину и высоту родительского элемента.

 .hero < position: relative; background-color: #def4fd; >.hero__video

Рисунок, где видео не заполняет полностью фон заголовка

Чтобы видео полностью заполнило родительский элемент, нам нужно переопределить значение по умолчанию у object-fit :

 .hero__video < /* другие стили */ object-fit: cover; >

Заключение

Как вы, наверное, убедились, свойства object-fit и background-size очень полезны для обработки изображений с различными соотношениями сторон. Мы не всегда можем контролировать настройку идеальных размеров для каждого изображения, и именно здесь эти два CSS свойства незаменимы.

И еще стоит дружески напомнить о выборе между элементом img и фоном CSS: Если изображение является чисто декоративным, выбирайте фон CSS. В противном случае более подходит элемент img .

Надеемся, что данная статья была вам полезна. Спасибо, что дочитали ее до конца.

CSS свойство object-fit

Свойство object-fit определяет, как должен измениться размер элемента, чтобы он поместился в блоке.

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

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

Синтаксис

object-fit: fill | contain | cover | scale-down | none | initial | inherit;

Пример

html> html> head> title>Заголовок документа title> style> img.tree < width: 200px; height: 400px; object-fit: fill; > style> head> body> h2>Пример свойства object-fit h2> h3>Оригинальное изображение: h3> img src="/uploads/media/default/0001/01/b408569013c0bb32b2afb0f0d45e93e982347951.jpeg" alt="Tree" width="300" height="200"> h3>Значение fill: h3> img class="tree" src="/uploads/media/default/0001/01/b408569013c0bb32b2afb0f0d45e93e982347951.jpeg" alt="Tree" width="300" height="200"> body> html>

Пример со значением «cover», где края изображения обрезаны, а пропорции сохранены:

Пример

html> html> head> title>Заголовок документа title> style> img.tree < width: 200px; height: 400px; object-fit: cover; > style> head> body> h2>Пример свойства object-fit h2> h3>Оригинальное изображение: h3> img src="/uploads/media/default/0001/01/b408569013c0bb32b2afb0f0d45e93e982347951.jpeg" alt="Tree" width="300" height="200"> h3>Значение cover: h3> img class="tree" src="/uploads/media/default/0001/01/b408569013c0bb32b2afb0f0d45e93e982347951.jpeg" alt="Tree" width="300" height="200"> body> html>

Пример со значением «contain»:

Пример

html> html> head> title>Заголовок документа title> style> img.tree < width: 200px; height: 400px; object-fit: contain; > style> head> body> h2>Пример свойства object-fit h2> h3>Оригинальное изображение: h3> img src="/uploads/media/default/0001/01/b408569013c0bb32b2afb0f0d45e93e982347951.jpeg" alt="Tree" width="300" height="200"> h3>Значение contain: h3> img class="tree" src="/uploads/media/default/0001/01/b408569013c0bb32b2afb0f0d45e93e982347951.jpeg" alt="Tree" width="300" height="200"> body> html>

Пример со значением «scale-down», где размер изображения уменьшен:

Пример

html> html> head> title>Заголовок документа title> style> img.tree < width: 200px; height: 400px; object-fit: scale-down; > style> head> body> h2>Пример свойства object-fit h2> h3>Оригинальное изображение: h3> img src="/uploads/media/default/0001/01/b408569013c0bb32b2afb0f0d45e93e982347951.jpeg" alt="Tree" width="300" height="200"> h3>Значение scale-down: h3> img class="tree" src="/uploads/media/default/0001/01/b408569013c0bb32b2afb0f0d45e93e982347951.jpeg" alt="Tree" width="300" height="200"> body> html>

Значения

Значение Описание
fill Размер контента изменяется таким образом, чтобы заполнить блок. Значение по умолчанию.
contain Контент масштабируется таким образом, чтобы заполнить блок, сохраняя свои пропорции.
cover Пропорции контента меняются при заполнении блока. Контент будет обрезан для заполнения блока.
none Размер контента не меняется.
scale-down Соответствует значению none или contain. Контент элемента будет иметь наименьший размер.
initial Устанавливает свойство в значение по умолчанию.
inherit Значение элемента наследуется от родительского элемента.

Поддержка браузера

31.0+ 16.0 partial 36.0+ 10.0+ 19.0+
11.5-12.1 -o-

object-fit

fill Элемент масштабируется, чтобы соответствовать заданным размерам, при этом пропорции игнорируются. contain Элемент масштабируется, чтобы целиком уместиться в заданные размеры с соблюдением пропорций. cover Элемент увеличивается или уменьшается, чтобы целиком заполнить заданную область с сохранением пропорций. none Сохраняются исходные пропорции элемента, установленные значения ширины или высоты не влияют на содержимое.

Влияние разных значений на фотографии продемонстрировано на рис. 1. Был использован следующий стиль.

Рис. 1. Фотографии с разным значением object-fit

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *