Пропорции для img — dr.Brain
В этом очень небольшом обзоре мы изучим, как установить соотношение сторон (пропорции) для изображения, размещаемого на HTML-странице. Для чего это нужно? К примеру, полученные знания будут полезны, если возникает необходимость уместить картинки различных размеров и пропорций в квадратный блок (или любой другой блок с четко определенными размерами и соотношением сторон), не искажая изображения.
Следует понимать, что в данном случае мы будем манипулировать CSS-свойствами, ни одно изображении не пострадает и сохранит свое первозданное состояние.
Содержание
Изображение фиксированного размера
Если на страницу нужно вывести картинку заранее определенных размеров, можно воспользоваться атрибутами width
и height
.
Так как мы не знаем размеры и пропорции исходного изображения, применим CSS-свойство object-fit
. Таким образом, мы сможем быть уверены, что картинка не деформируется.
HTML:
<img src="/path/to/image. jpeg" alt="">
CSS:
img { object-fit: cover; }
Результат можно увидеть на нижеприведенной иллюстрации. Заметьте: исходное изображение имеет большую ширину, но оно не подверглось искажениям, вместо этого оно “обрезано” по центру:
object-fit: cover
Свойство object-fit
принимает значения fill
, contain
, cover
, none
, scale-down
. Подробно информацию можно изучить на сайте MDN.
Изображение нефиксированного размера
Чтобы привести картинку, изменяющую свои размеры вместе с родительским блоком, к определенным пропорциям нужно воспользоваться оберткой. Оборачивающий элемент заставит изображение сохранять определенные пропорции, так как само изображение заполнит всю его площадь.
HTML:
<div> <img src="/media/desk.jpg" alt=""/> </div>
CSS:
/* Position child elements relative to this element */ .aspect-ratio-box { position: relative; } /* Create a pseudo element that uses padding-bottom to take up space */ . aspect-ratio-box::after { display: block; content: ''; /* 16:9 aspect ratio */ padding-bottom: 56.25%; } /* Image is positioned absolutely relative to the parent element */ .aspect-ratio-box img { /* Image should match parent box size */ position: absolute; left: 0; top: 0; width: 100%; height: 100%; }
Приблизительно так будет выглядеть результат при соотношении сторон 16:9:
16:9
Свойство padding-bottom
определяет высоту родительского контейнера, выраженную в процентах от его ширины. Например, при ширине блока 400px результирующая высота составит 56,25% от 400px, то есть около 225px.
Для того, чтобы определить нужное нам значение padding-bottom
необходимо разделить высоту на ширину.
Например, при соотношении сторон 16:9, арифмитические манипуляции будут выглядеть так:
9 / 16 = 0.5625
Выразим результ в процентах (умножим полученное число на 100):
0.5625 * 100 = 56. 25
Результат: 56.25%
Вот и все.
Заключение
Мы научились выводить на HTML-изображение в различных пропорциях без деформации исходной картинки. Предложенные варианты работы с изображениями фиксированных и нефиксированных охватывают значительную часть стандартных ситуаций, возникающих при верстке.
Полезно прочитать
- Как управлять размерами изображения с помощью CSS?
- CSS. Магия отступов
Свойства object-fit и object-position | GoIT HTML+CSS textbook
Бывают ситуации, когда контентное изображение больше или меньше, чем контейнер, в который его необходимо поместить, или изображение имеет другие пропорции. Например, частая задача в карточках товара это «тумба» фиксированной высоты, в которую необходимо красиво вместить фотографию товара произвольного размера, то есть подогнать картинку под контейнер.
Определяет каким образом содержимое <img>
(или <video>
) будет вмещаться в
контейнер, когда их размеры или пропорции не совпадают. Свойство object-fit
обрезает, растягивает или масштабирует контентное изображение. Это похоже на background-size
, но для контентных изображений.
object-fit: fill | contain | cover | scale-down | none
fill
— изображение масштабируется без сохранения пропорций, чтобы полностью заполнить контейнер. Значение по умолчанию.contain
— изображение масштабируется с сохранением пропорций, чтобы максимально заполнить контейнер.cover
— изображение масштабируется с сохранением пропорций, чтобы полностью заполнить контейнер.scale-down
— будет выбрано значениеnone
илиcontain
, чтобы изображение было наименьшего размера.none
— сохраняются исходные размеры изображения, заданная высота и ширина не имеют эффекта.
Для того, чтобы эта техника работала необходимы два обязательных шага.
<div>
<img src="" alt="" />
</div>
Первый — у контейнера (тумбы) должна быть явно указана фиксированная высота. Ширина может быть по ширине родителя, как в примере.
.thumb {
height: 400px;
width: 300px;
}
Второй — изображение необходимо «вместить» в контейнер, задав высоту и ширину 100%
.
.thumb > img {
display: block;
height: 100%;
width: 100%;
}
После этого к изображению можно применять свойство object-fit
.
.thumb > img {Полезно
display: block;
height: 100%;
width: 100%;object-fit: cover;
}
Можно не использовать «тумбу», задав фиксированные размеры самому элементу <img>
, но чаще всего вы столкнётесь именно с такой разметкой. «Тумба» служит
контейнером для создания анимаций и других декоративных эффектов связанных с
областью изображения.
Дополняет свойство object-fit
позволяя задать положение изображения в
контейнере по осям X и Y. Это похоже на background-position
, но для контентных
изображений.
object-position: position | initial | inherit
Значением свойства могут быть зарезервированные слова, абсолютные или относительные единиицы измерения.
По умолчанию значение50% 50%
, то есть
вертикально и горизонтально по центру.Обрезать изображения, встроенные в HTML
Опубликовано 12 февраля 2020 г.
Купить электронную книгу
Получите мою электронную книгу, посвященную разработке современного веб-интерфейса CSS3 и
.
Узнать больше
Свойства object-fit
и object-position
используются для указания размера и положения внешних медиафайлов, вставленных в HTML, в основном изображений в теге
, но также и содержимого тега .0014
Свойства не поддерживаются Internet Explorer, поэтому они более полезны для проектов, где это не так важно.
object-fit
и object-position
можно рассматривать как параллельные свойства изображения
и background-position
. Только то, что они предназначены для элементов, вставленных непосредственно в HTML.
Рисунок: Свойства object-fit и object-position определяют поведение вставленного носителя, когда его выделенное пространство становится меньше или больше.
Покажем на простом примере.
У нас есть следующий HTML:
CSS:
.img--cut { объект подходит: обложка; положение объекта: снизу; }
И поясним:
- Изображение имеет естественные размеры 300×300 пикселей, но в HTML ему разрешено занимать только высоту 200 пикселей, см.
высота
свойство. -
object-fit:cover
указывает, что изображение должно быть растянуто на всю площадь элементаобъектная подгонка
. -
object-position:bottom
указывает выравнивание по нижнему краюобъект-позиция
.
Указывает, как разместить внешний носитель в области, заданной ширина
и высота
свойства в HTML или CSS.
Рисунок: Значения свойства Object-fit применены к изображению размером 150 × 150 пикселей.
Это очень похоже на встраивание изображений в фон с использованием свойства background-size
.
Значения | Что он делает? |
---|---|
заполнить (по умолчанию) | Заполняет всю область. Он может искажать соотношение сторон контента, но не обрезать его. |
содержат | Не всегда заполняет всю область. Контент не искажается и не обрезается, он отображает весь контент. |
в уменьшенном масштабе | То же, что и , содержит , но никогда не увеличивает изображение сверх натурального размера. |
крышка | Заполняет всю область. Не оставляет пустого места, не искажает контент, только обрезает его. |
нет | Сохраняет исходный размер и соотношение сторон. Иногда обрезаю, иногда оставляю свободное место. |
Рис. На практике наиболее полезным значением является object-fit:cover
.
Определяет, где будет располагаться элемент, используя вписывание объекта
. Он имеет те же значения, что и свойство background-position
.
Рисунок: Примеры значений свойства object-position.
Давайте рассмотрим примеры значений.
Пример значения | Что он делает? |
---|---|
50% 50% (по умолчанию) | Центрирует объект в центре визуализируемого блока. |
0 0 | Помещает объект в левый верхний угол. |
0 -50px | 0 пикселей сверху и 50 пикселей слева от визуализируемого поля. |
вверху справа | В правый верхний угол. |
дно | По нижнему краю. Второе значение принимается по умолчанию, т.е. center . |
- Оба свойства очень полезны для обеспечения соотношения сторон, когда на сервере хранятся изображения разных форм и размеров.
- Фоновое видео, вписывающееся в объект, также работает. То же самое с iframe нет.
Поскольку обозреватель Edge был обновлен до механизма рендеринга Chromium, только Internet Explorer 11 не поддерживает эти свойства.
К тому моменту, как я пишу эту статью, Internet Explorer все еще имеет значительную долю пользователей в некоторых странах (как например здесь, в Чехии), так что придется перебирать запасной вариант.
caniuse.com/object-fit
Как решить проблему в Internet Explorer:
- Вместо
object-fit
/object-position
встроить изображение в фон, используяbackground-size
/background-position.
Кроме того, вы можете поиграть со свойством преобразования и с абсолютным позиционированием (см. StackOverflow). - Для IE11 используйте polyfill — fregante/object-fit-images. Очень не рекомендую, потому что замедляет рендеринг в и без того медленном Проводнике.
- Обнаружение неподдерживающего браузера (например, с помощью библиотеки Modernizr) и развертывание обходного пути. Например, StackOverflow предлагает решение для изменения
Мартин Михалек
Автор: Мартин Михалек
Внештатный фронтенд-дизайнер из Праги, Чехия.
Технический писатель, который читает лекции о CSS3, адаптивном дизайне и разработке современного веб-интерфейса.
Электронная почта –
Фейсбук –
Твиттер
Купить электронную книгу
Получите мою электронную книгу, посвященную CSS3 и
разработка современного веб-интерфейса.
Узнать больше
fit — CSS: каскадные таблицы стилей
Свойство CSS object-fit
определяет, как содержимое замененного элемента, например
или , должно быть изменено по размеру его контейнер.
Вы можете изменить выравнивание объекта содержимого замененного элемента в поле элемента, используя свойство object-position
.
Исходный код этого интерактивного примера хранится в репозитории GitHub. Если вы хотите внести свой вклад в проект интерактивных примеров, клонируйте https://github.com/mdn/interactive-examples и отправьте нам запрос на включение.
Синтаксис
Свойство object-fit
задается как одно ключевое слово, выбранное из списка значений ниже.
Значения
-
содержат
- Заменяемое содержимое масштабируется, чтобы сохранить соотношение сторон и вписаться в поле содержимого элемента. Весь объект заполняет поле, сохраняя при этом его соотношение сторон, поэтому объект будет помещен в «почтовый ящик», если его соотношение сторон не соответствует соотношению сторон поля.
-
крышка
- Размер замененного содержимого соответствует соотношению сторон при заполнении всего поля содержимого элемента. Если соотношение сторон объекта не соответствует соотношению сторон его блока, то объект будет обрезан по размеру.
-
заполнение
- Размер замененного содержимого соответствует размеру поля содержимого элемента. Весь объект полностью заполнит поле. Если соотношение сторон объекта не соответствует соотношению сторон его блока, то объект будет растянут до нужного размера.
-
нет
- Размер замененного содержимого не изменяется.
-
в уменьшенном масштабе
- Содержимое имеет размер, как если бы было указано
нет
илисодержит
, в зависимости от того, что приведет к меньшему размеру конкретного объекта.
Формальное определение
Начальное значение | Заполнение | |
---|---|---|
Применяется к | Замененные элементы | |
Унаследованные | .0097 | нет |
Расчетное значение | как указано | |
Тип анимации | дискретный |
заполнение | содержать | крышка | нет | в уменьшенном масштабе
Примеры
Настройка соответствия объекта для изображения
HTML
<раздел>соответствие объекта: заливка
соответствует объекту: содержит
png" alt="Логотип MDN">object-fit: обложка
соответствие объекту: нет
объектное соответствие: уменьшение
раздел>
УСБ
ч3 { семейство шрифтов: Courier New, моноширинный; размер шрифта: 1em; поле: 1эм 0 0,3эм; } дел { дисплей: гибкий; flex-направление: столбец; flex-wrap: обернуть; выравнивание элементов: flex-start; высота: 940 пикселей; } картинка { ширина: 150 пикселей; высота: 100 пикселей; граница: 1px сплошная #000; } . узкий { ширина: 100 пикселей; высота: 150 пикселей; поле сверху: 10px; } .наполнять { объект-подгонка: заполнить; } .содержать { подходит для объекта: содержит; } .крышка { объект подходит: обложка; } .никто { соответствие объекту: нет; } .уменьшать { объект-подгонка: уменьшение масштаба; }
Результат
Технические характеристики
Спецификация | Статус | Комментарий |
---|---|---|
Модуль изображений CSS Уровень 4 Определение «подгонки объекта» в этой спецификации. | Рабочий проект | |
Модуль изображений CSS, уровень 3 Определение «подгонки объекта» в этой спецификации. | Кандидат в рекомендации | Исходное определение |
Совместимость с браузером
Таблица совместимости на этой странице создана на основе структурированных данных. Если вы хотите внести свой вклад в данные, посетите https://github.com/mdn/browser-compat-data и отправьте нам запрос на включение.
Рабочий стол | Мобильный | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | Веб-просмотр Android | Chrome для Android | Firefox для Android | Opera для Android | Safari на iOS | Samsung Internet | |
подходит для объектов | Chrome Полная поддержка 31 | Край Полная поддержка 16 Примечания
| Firefox Полная поддержка 36 | ИЭ Без поддержки № | Опера Полная поддержка 19
| Сафари Полная поддержка 10 | Веб-просмотр Android Полная поддержка 4.4.3 | Chrome Android Полная поддержка 31 | Firefox Android Полная поддержка 36 | Opera Android Полная поддержка 19
| Safari iOS Полная поддержка 10 | Samsung Интернет Android Полная поддержка 2. |