CSS Object-fit и Object-position
object-fit и object-position — это CSS свойства, которые позволяют контролировать, как содержимое (изображения, видео) отображается внутри своего контейнера, сохраняя при этом соотношение сторон.
Что такое object-fit?
object-fit определяет, как содержимое (обычно <img> или <video>) должно масштабироваться и размещаться внутри своего контейнера.
Значения object-fit
| Значение | Описание | Поведение |
|---|---|---|
fill | Заполняет весь контейнер | Растягивается, может искажаться |
contain | Вписывается в контейнер | Сохраняет пропорции, могут быть пустые области |
cover | Заполняет контейнер с сохранением пропорций | Может обрезаться, но заполняет весь контейнер |
none | Оригинальный размер | Не масштабируется, может обрезаться |
scale-down | Уменьшает, если нужно | Как none или contain, выбирает меньший размер |
Примеры использования
fill — заполнение контейнера
.image-container {
width: 300px;
height: 200px;
border: 2px solid #333;
}
.image-fill {
width: 100%;
height: 100%;
object-fit: fill;
}
Результат: Изображение растягивается на весь контейнер, может искажаться.
contain — вписывание в контейнер
.image-contain {
width: 100%;
height: 100%;
object-fit: contain;
}
Результат: Изображение вписывается в контейнер, сохраняя пропорции. Могут остаться пустые области.
cover — заполнение с обрезкой
.image-cover {
width: 100%;
height: 100%;
object-fit: cover;
}
Результат: Изображение заполняет весь контейнер, сохраняя пропорции. Может обрезаться, но не искажается.
none — оригинальный размер
.image-none {
width: 100%;
height: 100%;
object-fit: none;
}
Результат: Изображение сохраняет оригинальный размер, может обрезаться.
scale-down — уменьшение при необходимости
.image-scale-down {
width: 100%;
height: 100%;
object-fit: scale-down;
}
Результат: Изображение ведет себя как none или contain, выбирая меньший размер.
Визуальное сравнение
<div class="gallery">
<div class="image-box">
<img src="photo.jpg" class="img-fill" alt="Fill">
<p>fill</p>
</div>
<div class="image-box">
<img src="photo.jpg" class="img-contain" alt="Contain">
<p>contain</p>
</div>
<div class="image-box">
<img src="photo.jpg" class="img-cover" alt="Cover">
<p>cover</p>
</div>
<div class="image-box">
<img src="photo.jpg" class="img-none" alt="None">
<p>none</p>
</div>
</div>
.gallery {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 1rem;
}
.image-box {
width: 200px;
height: 150px;
border: 2px solid #ddd;
overflow: hidden;
}
.image-box img {
width: 100%;
height: 100%;
}
.img-fill { object-fit: fill; }
.img-contain { object-fit: contain; }
.img-cover { object-fit: cover; }
.img-none { object-fit: none; }
Object-position
object-position определяет позицию содержимого внутри контейнера (аналогично background-position).
Значения object-position
/* Ключевые слова */
object-position: center; /* по умолчанию */
object-position: top;
object-position: bottom;
object-position: left;
object-position: right;
object-position: top left;
object-position: bottom right;
/* Проценты */
object-position: 50% 50%; /* центр */
object-position: 0% 0%; /* верхний левый угол */
object-position: 100% 100%; /* нижний правый угол */
/* Пиксели */
object-position: 20px 30px;
Примеры с object-position
/* Фокус на лице человека */
.portrait {
object-fit: cover;
object-position: center top;
}
/* Фокус на правой части изображения */
.focus-right {
object-fit: cover;
object-position: right center;
}
/* Кастомная позиция */
.custom-position {
object-fit: cover;
object-position: 30% 70%;
}
Практические примеры
Карточка товара
<div class="product-card">
<div class="product-image">
<img src="product.jpg" alt="Товар">
</div>
<div class="product-info">
<h3>Название товара</h3>
<p>Описание товара</p>
</div>
</div>
.product-card {
width: 300px;
border: 1px solid #ddd;
border-radius: 8px;
overflow: hidden;
}
.product-image {
width: 100%;
height: 200px;
background: #f0f0f0;
}
.product-image img {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
}
Аватар пользователя
.avatar {
width: 100px;
height: 100px;
border-radius: 50%;
overflow: hidden;
}
.avatar img {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
}
Галерея изображений
.gallery-item {
width: 100%;
aspect-ratio: 16 / 9;
overflow: hidden;
}
.gallery-item img {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
transition: transform 0.3s;
}
.gallery-item:hover img {
transform: scale(1.1);
}
Работа с видео
object-fit также работает с элементами <video>:
<video class="video-player" controls>
<source src="video.mp4" type="video/mp4">
</video>
.video-player {
width: 100%;
height: 400px;
object-fit: cover;
object-position: center;
}
Совместимость с aspect-ratio
object-fit отлично работает вместе с aspect-ratio:
.image-wrapper {
width: 100%;
aspect-ratio: 16 / 9;
overflow: hidden;
}
.image-wrapper img {
width: 100%;
height: 100%;
object-fit: cover;
}
Поддержка браузерами
object-fit и object-position поддерживаются во всех современных браузерах:
- Chrome 31+
- Firefox 36+
- Safari 7.1+
- Edge 16+
Для старых версий IE можно использовать полифилл или fallback.
Совет:
Используйте object-fit: cover для создания красивых карточек и галерей, где изображения должны заполнять контейнер без искажений. Комбинируйте с object-position для контроля фокуса изображения.