Пропорции для 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%; объект-подгонка: уменьшение масштаба; }
<дел>