Статьи

Использование CSS-подбора объектов и свойств объекта-позиции

Видео и изображения могут создавать проблемы при размещении сайта.

Допустим, вы явно указали ширину изображения в своем CSS. Если ширина указана в процентах или единицах просмотра, а высота изображения установлена ​​на auto , изменение размера окна браузера сохранит соотношение сторон изображения.

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

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

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

Оба свойства работают на замененных элементах. Однако, для краткости, в этой статье я буду использовать термин «изображение» вместо заменяемых элементов.

Зачем использовать object-fit object-position ?

Вы можете спросить, зачем вообще использовать эти два свойства, если вы можете использовать background-size и background-position . На самом деле, есть как минимум две веские причины.

Сначала рассмотрим сценарий, в котором у вас есть изображение, которое должно быть частью статьи. Если размеры изображения установлены в CSS, как в случае, описанном во введении, изменение размера окна браузера приведет к ухудшению его пропорций. В таком случае у вас возникнет соблазн использовать div со свойствами background-size и background-position поскольку простого использования тега img будет недостаточно.

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

Другая причина в том, что свойства фона нельзя применять к видео, тогда как object-fit object-position могут. Таким образом, при отображении видео, object-fit object-position являются вашими единственными вариантами.

Свойство object-fit

Это свойство определяет, как заменяемое содержимое, например изображения и видео, занимают пространство внутри их поля содержимого. У него есть пять возможных значений:

  • fill
  • contain
  • cover
  • none
  • scale-down

Синтаксис для использования этого свойства показан ниже:

 .fit-image { object-fit: fill|contain|cover|none|scale-down; } 

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

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

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

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

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

Наше окончательное значение object-fit это scale-down . Как следует из названия, оно уменьшает изображение. Это означает, что его размер будет изменен, как если бы он был установлен равным none или contain зависимости от того, какое значение приводит к уменьшению изображения. Другими словами, если ни одно из измерений нашего изображения не превышает соответствующие размеры содержащего его блока, значение none применяется.

Свойство object-position

Как мы видели ранее, свойство cover заполняет все пространство внутри контейнера, сохраняя при этом собственное соотношение сторон изображений. Изображения также размещены в центре по умолчанию. В ситуациях, когда точка фокусировки находится в центре, это будет вам полезно. Но что, если точка фокусировки изображений находится не в центре?

Здесь вам может помочь свойство object-position . Это работает так же, как background-position . Фрагмент кода ниже устанавливает положение изображения слева вверху:

 .zero-zero { object-position: 0px 0px; } 

Вместо указания размеров в пикселях вы можете использовать проценты. Например, object-position: 0% 0% вверху слева и object-position: 100% 100% внизу справа. Это может быть полезно, когда вы не знаете размеры изображения.

Когда пропорции вашего изображения и содержащего его блока схожи, установка object-position не будет иметь большого значения. Тем не менее, результаты улучшаются, когда соотношения сторон заметны. Демонстрация CodePen ниже иллюстрирует мою точку зрения.

Установка положения в верхнем левом углу во втором случае возвращает солнце в фокус.

Еще одна вещь, о которой стоит упомянуть о свойстве object-position это то, что оно является анимируемым и может создавать потрясающие эффекты при правильном использовании. Рассмотрим код ниже:

 img { /* other CSS here... */ object-fit: cover; object-position: 0% 0%; animation: ltr 5s alternate infinite; } @keyframes ltr { 0% { object-position: 0% 0%; } 25% { object-position: 20% 0%; } 100% { object-position: 100% 100%; } } 

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

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

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

Хотя эти свойства могут оказаться очень полезными, возможность их использования в реальных условиях зависит от поддерживаемых вами браузеров . object-fit поддерживается во всех основных браузерах, кроме IE / Edge, а object-position поддерживается во всех основных браузерах, кроме IE / Edge и Safari.

Как правило, вам может понадобиться свойство object-fit . Если вы готовы пожертвовать пользовательским интерфейсом некоторых пользователей, вы можете воспользоваться этим свойством. Когда вам нужно поддерживать старые браузеры, вы можете попробовать полифилл от Федерико Бриганте .

Вывод

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