Как центрировать обрезку изображения (<img>) в контейнере с шириной жидкости

Как получить изображение, чтобы оно оставалось по центру, когда его контейнер ширины жидкости (в процентах) слишком мал, чтобы показать все изображение целиком?

Как я могу центрировать изображение внутри его контейнера

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

3 ответа

Решение

Когда это работает

У вас может быть контейнер, который содержит некоторый контент, такой как два <div> с шириной 50%, сидящие рядом. В этом примере мы можем проиллюстрировать только один дочерний элемент контейнера:

Назовем внешний прямоугольник .container внутренний прямоугольник .content и изображение img, Эта договоренность прекрасно, пока .content всегда шире чем img ,

Когда это ломается

Поскольку мы имеем дело с процентами и, возможно, работаем с адаптивным дизайном, это не всегда так. Если .content всегда тоньше img, будет происходить обрезка:

Эта проблема

Если самая интересная часть img находится в центре, нам нужно, чтобы браузер равномерно обрезал оба края, оставляя лучшую его часть видимой, независимо от ширины .content является.

Решение

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

.content {
    width: 90%; /* or whatever is required */
    text-align: center; /* ensures the image is always in the h-middle */
    overflow: hidden; /* hide the cropped portion */
}

img {
    position: relative; /* allows repositioning */
    left: 100%; /* move the whole width of the image to the right */
    margin-left: -200%; /* magic! */
}

Для новых браузеров вы можете перевести его

figure{
    width: 100%;
    text-align: center;
    overflow: hidden;
}
img{
    position: relative;
    left: 50%;
    transform: translate(-50%,0)
}

Для поддержки IE8 вы все еще можете использовать метод, представленный выше @BryceHanscomb.

.no-csstransforms figure img {
    left: 100%; /* move the whole width of the image to the right */
    margin-left: -200%; /* magic! */
}

Если вы ожидаете, что отображаемое изображение будет намного длиннее, чем контейнер с дисплеем, установка влево: 100%; и маржа слева: -200%; (из ответа Брайса) может быть недостаточно, чтобы получить центральную часть изображения. Просто поставьте больший процент для обоих. Удостоверьтесь, что другой - половина другого все же.

left: 500%;
margin-left: -1000%;

У меня была та же проблема, но решения здесь мне не помогли (потому что я отображаю внутри таблицы и потому что я хотел, чтобы изображение изменялось без необходимости масштабировать его вручную каждый раз, когда изображение было отправлено клиентами)

Вот что я нашел, намного эффективнее и проще:

img {
 object-fit: cover;
 width: 150px;
 height: 150px;
 }
Другие вопросы по тегам