Сосредоточьте изображения разного размера в одном размере блока

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

Я сделал пример того, что происходит со мной в подобном дизайне. Обратите внимание, что продукт (гриль) на самом деле не находится по центру контейнера imgblock.

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

.imgBlock {
  width:100px;
  height:100px;
  border:2px solid black;
  margin:1px;
  padding:4px;
}

.imgBlock img{
  max-height:100%;
  max-width:100%;
  margin:auto;
  display:block;
}
<div class = "container">
  <div class = "imgBlock">
    <img src = "https://cdn.shopify.com/s/files/1/1150/2512/t/41/assets/WG-logo-short-black.png?43066">
  </div>
  <div class = "imgBlock">
    <img src = "https://cdn.shopify.com/s/files/1/1150/2512/t/41/assets/M1-Grill-FAQ.jpg?43066">
  </div>
</div>

Хорошо прочитано: alligator.io/css/cropping-images-object-fit

FeaturedSpace 30.05.2019 19:12

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

Robolisk 30.05.2019 19:16

используйте object-fit и object-position - см. jsfiddle.net/uq8mta0L

kukkuz 30.05.2019 19:16

@kukkuz сделай это ответом, чтобы я мог его проверить :)

Robolisk 30.05.2019 19:18

Обновлен мой ответ для сосредоточения на imgBlock

seantunwin 30.05.2019 19:28
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
5
177
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете добавить display: flex к imgBlock, затем отцентрировать по горизонтали с помощью justify-content и по вертикали с помощью align-items.

.imgBlock {
  display: flex;
  align-items: center;
  justify-content: center;

  width:100px;
  height:100px;
  border:2px solid black;
  margin:1px;
  padding:4px;
}

.imgBlock img{
  max-height:100%;
  max-width:100%;
  margin:auto;
  display:block;
}
<div class = "container">
  <div class = "imgBlock">
    <img src = "https://cdn.shopify.com/s/files/1/1150/2512/t/41/assets/WG-logo-short-black.png?43066">
  </div>
  <div class = "imgBlock">
    <img src = "https://cdn.shopify.com/s/files/1/1150/2512/t/41/assets/M1-Grill-FAQ.jpg?43066">
  </div>
</div>

если позволите, изображение должно быть в центре imgBlock

kukkuz 30.05.2019 19:18

@kukkuz Почему? Вы устанавливаете imgBlock на 100x100px и imgBlock img на 100x100%, чтобы изображение всегда было того же размера, что и imgBlock.

seantunwin 30.05.2019 19:19

Да, @kukkuz прав. Проблема, с которой я столкнулся, заключалась в том, что динамический ассортимент размеров изображений соответствовал заданному размеру контейнера (в данном случае imgBlock 100 на 100 пикселей).

Robolisk 30.05.2019 19:20

@kukkuz @robert-ochinski Я обновил свой ответ в центре imgBlock.

seantunwin 30.05.2019 19:26

@seantunwin теперь это работает :) - в вашем предыдущем ответе container был flexbox, теперь вы правильно сделали imgBlock flexbox...

kukkuz 30.05.2019 19:29
Ответ принят как подходящий

Сначала установите изображение на полную ширину и высоту (или по желанию). Теперь вы можете добавить object-fit: contain, чтобы поместить изображение в imgBlock, а затем использовать object-position: center, чтобы выровнять его — см. демонстрацию ниже:

.imgBlock {
  width:100px;
  height:100px;
  border:2px solid black;
  margin:1px;
  padding:4px;
}

.imgBlock img{
  height:100%; /* set full height */
  width:100%; /* set full width */
  display:block;
  object-fit: contain; /* constrains the image maintaining aspect ratio */
  object-position: center; /* default position is center - so optional in this case */
}
<div class = "container">
  <div class = "imgBlock">
    <img src = "https://cdn.shopify.com/s/files/1/1150/2512/t/41/assets/WG-logo-short-black.png?43066">
  </div>
  <div class = "imgBlock">
    <img src = "https://cdn.shopify.com/s/files/1/1150/2512/t/41/assets/M1-Grill-FAQ.jpg?43066">
  </div>
</div>

Мне это нравится. У него тоже хорошая поддержка -- могу ли я использовать

seantunwin 30.05.2019 19:36

Красивый. Это решение, которое я искал!

Robolisk 30.05.2019 20:05

Вы можете установить позицию относительно вашего div .imgBlock. После этого установите абсолютную позицию на вашу <img/> со всеми координатами на 0 и автоматическим полем.

Помните, что абсолютная позиция относится к ближайшему родителю с относительной позицией.

.imgBlock {
  width:100px;
  height:100px;
  border:2px solid black;
  margin:1px;
  padding:4px;
  position:relative;
}

.imgBlock img{
  max-height:100%;
  max-width:100%;
  position: absolute;
  margin: auto;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
}
<div class = "container">
  <div class = "imgBlock">
    <img src = "https://cdn.shopify.com/s/files/1/1150/2512/t/41/assets/WG-logo-short-black.png?43066">
  </div>
  <div class = "imgBlock">
    <img src = "https://cdn.shopify.com/s/files/1/1150/2512/t/41/assets/M1-Grill-FAQ.jpg?43066">
  </div>
</div>

Вы можете использовать старые атрибуты позиционирования, а также методы Flex. Сделайте положение основного блока относительным. Затем установите img внутри этого блока в position: absolute. Поместите этот блочный элемент вверху: 50% слева: 50% родительского элемента. Так как это идет по верхнему левому углу, это будет немного центр. Затем мы будем использовать transform: translate(-50%, -50%), чтобы вернуть его в истинный центр.

Подробнее о позиция здесь, на MDN.

.imgBlock {
  position: relative;
  width:100px;
  height:100px;
  border:2px solid black;
  margin:1px;
  padding:4px;
}

.imgBlock img{
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  max-height:100%;
  max-width:100%;
  display:block;
}
<div class = "container">
  <div class = "imgBlock">
    <img src = "https://cdn.shopify.com/s/files/1/1150/2512/t/41/assets/WG-logo-short-black.png?43066">
  </div>
  <div class = "imgBlock">
    <img src = "https://cdn.shopify.com/s/files/1/1150/2512/t/41/assets/M1-Grill-FAQ.jpg?43066">
  </div>
</div>

не кажется ли этот метод своего рода взломом по сравнению с реальным решением? Я знаю, что это работает, и я использовал это в прошлом, но если это так неправильно.

Robolisk 30.05.2019 20:04

То, что мы используем сегодня, появилось благодаря хакерству и построено на таких основах и принципах. Вы можете аргументировать один метод другим, но я думаю, что все сводится к контексту и его использованию. Кроме того, я упомянул еще один метод и заявил, что это более старый способ сделать это. Можем ли мы без полного решения сказать, что такое взлом и что такое исправление, чтобы перейти к следующей версии проекта? :)

HeroZero 30.05.2019 20:11

Другие вопросы по теме