Пропорции для 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. Магия отступов
Как сохранить пропорции изображения в адаптивном веб-дизайне
Рассмотрим типичный набор миниатюр изображений:
<ul> <li><a href="#"><img src="http://lorempixel.com/320/180/sports" /></a></li> <li><a href="#"><img src="http://lorempixel.com/320/180/city" /></a></li> <li><a href="#"><img src="http://lorempixel.com/352/198/technics" /></a></li> </ul>
Мы можем показать эту галерею в любом размере в адаптивном шаблоне страницы, используя CSS (показаны основные свойства):
ul { width: 100%; padding: 0; margin: 0 0 2em 0; list-style-type: none; } li { float: left; width: 33.
3%; padding: 0; margin: 0; background-color: #000; border: 10px solid #fff; -moz-box-sizing: border-box; box-sizing: border-box; overflow: hidden; } li a { display: block; width: 100%; } img { display: block; max-width: 100%; } Это хорошо работает, потому что все наши изображения имеют одинаковое соотношение сторон 16: 9. Высота изображения составляет ровно 56,25% от ширины (9, деленное на 16, выраженное в процентах).
Однако мы, веб-дизайнеры, параноики: люди сговариваются против нас и предоставляют фотографии в бесконечном диапазоне размеров и соотношений сторон, например
<ul> <li><a href="#"><img src="http://lorempixel.com/320/180/sports" /></a></li> <li><a href="#"><img src="http://lorempixel.com/320/320/city" /></a></li> <li><a href="#"><img src="http://lorempixel.com/200/150/technics" /></a></li> </ul>
Существуют различные решения этой проблемы:
- Мы можем изменить размер каждого изображения вручную.
Это отнимает много времени и утомительно. - Мы могли бы реализовать умное решение для автоматического изменения размера изображения на сервере. Это может занять некоторое время, и получающиеся изображения могут быть не такими полированными или оптимизированными, как нам нравится.
- Мы могли бы устроить подобную диве истерику и отказаться работать в таких условиях. Конечно, это непрофессионально, и никто из нас не прибегнет к такой тактике (слишком часто).
Или мы можем использовать CSS для решения проблемы?
Мы можем, но это не так просто, как вы можете ожидать. В старые времена проектирования фиксированной ширины мы знали бы ширину нашего заполнителя изображения. Если бы это было 160px, мы могли бы сделать высоту 90px и рано уйти на пиво. В этом примере наша ширина составляет 33,3% от контейнера минус 20 пикселей для границы на левом и правом краях. Это может быть любой размер, поэтому установка фиксированной высоты будет препятствовать нашему требуемому соотношению сторон.
Малоизвестная особенность отступов заключается в том, что установка верхнего или нижнего процентного соотношения основывается на padding-top: 30%; слой padding-top: 30%; будет равняться 30 пикселям. Я подозреваю, что это было сделано для облегчения вычислений рендеринга, поскольку высота элементов обычно определяется их содержимым. Кроме того, если у вас был родитель с фиксированной высотой 300px и установлен padding-top: 200%; на ребенке родитель становится размером не менее 600 пикселей, что приводит к рекурсивному каскаду, который разрушает сеть.
Безотносительно причины это очень полезно, так как это позволяет Вам установить внутреннее отношение, например
#element { position: relative; height: 0; padding: 56.25% 0 0 0; } Этот элемент будет сохранять соотношение 16: 9 в зависимости от ширины контейнера. Высота была установлена в 0px, но, поскольку мы установили position: relative; Мы можем абсолютно позиционировать любой дочерний элемент.
Насколько я знаю, трюк с отступами был впервые выделен Тьерри Кобленцем для создания адаптивного видео , но ту же концепцию можно применить к изображениям или любому другому контенту. Давайте обновим наш эскиз CSS:
li a { display: block; width: 100%; position: relative; height: 0; padding: 56.25% 0 0 0; overflow: hidden; } img { position: absolute; display: block; max-width: 100%; max-height: 100%; left: 0; right: 0; top: 0; bottom: 0; margin: auto; } Результат покажет изображение с черными полями, если оно не имеет соответствующего размера 16: 9:
Посмотреть код демонстрации …
Поиграйте с CSS. При удалении изображения max-width или max-height могут применяться эффекты обрезки, а не изменения размера. Я надеюсь, что вы найдете это полезным.
Если вам интересно узнать больше об адаптивном веб-дизайне, ознакомьтесь с нашей новой книгой Jump Start Responsive Web Design .
html — заставить изображение соответствовать размеру и сохранить соотношение сторон
Задавать вопрос
спросил
Изменено 4 года, 1 месяц назад
Просмотрено 67 тысяч раз
Я хочу, чтобы изображение заполняло 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%;
} <дел>дел>
0
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
html — автоматическое масштабирование изображения с сохранением соотношения сторон
Задавать вопрос
спросил
Изменено 3 года, 2 месяца назад
Просмотрено 2к раз
У меня есть img внутри тега div, и в настоящее время я использую CSS
img {
максимальная высота: 100%;
максимальная ширина: 100%;
}
В настоящее время изображения помещаются внутри div, чего я и хотел.
Однако, если файл изображения меньше, чем div, изображение не будет иметь максимально возможный размер. Есть ли простой способ максимизировать изображение, сохраняя при этом изображение внутри div и сохраняя исходное соотношение сторон?
Я попытался установить высоту на 100% с максимальной шириной 100%, но это искажает изображение, а это не то, что мне нужно.
Я также пробовал object-fit: contains; , но это, похоже, ничего не делает.
Спасибо 🙂
- HTML
- CSS
2
Попробуйте добавить его в качестве фона, тогда вы можете сделать это:
div {
фон: url(images/bg.jpg) фиксированный центр без повторов;
-webkit-background-size: обложка;
-moz-background-size: обложка;
-o-background-size: обложка;
размер фона: обложка;
}
8
Ответ @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
Если вы хотите сохранить изображение как элемент 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%;
объект-подгонка: уменьшение масштаба;
} <дел>

jpeg" alt="">
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%;
}
25
3%; padding: 0; margin: 0; background-color: #000; border: 10px solid #fff; -moz-box-sizing: border-box; box-sizing: border-box; overflow: hidden; } li a { display: block; width: 100%; } img { display: block; max-width: 100%; }
Это отнимает много времени и утомительно.
дел> 