Подтвердить что ты не робот

Центрируйте большое изображение неизвестного размера внутри меньшего div с переполнением скрытого

Я хотел бы центрировать img внутри div без javascript и без фоновых изображений.

Вот пример кода

<div> 
    <img src="/happy_cat.png"/> 
</div>
  • Я не знаю размер img, и он должен иметь возможность превышать ширину родительского
  • Я не знаю ширину родительского div (это 100%)
  • Родительский div имеет фиксированную высоту
  • Изображение больше родительского и родительский имеет переполнение: hidden
  • Только для поддержки современных браузеров

Желаемый результат. (Игнорируйте непрозрачность и т.д., Просто обратите внимание на позиционирование).

enter image description here

Я знаю, что это можно легко сделать с помощью фоновых изображений, но это не вариант для меня. Я мог бы также использовать javascript, но это похоже на очень тяжелый способ добиться этого.

Спасибо!

Джек

4b9b3361

Ответ 1

Как насчет этого:

.img {
   position: absolute;
   left: 50%;
   top: 50%;
   -webkit-transform: translateY(-50%) translateX(-50%);
}

Это предполагает, что родительский div расположен относительно. Я думаю, что это работает, если вы хотите, чтобы .IMG был относительно позиционирован, а не совсем. Просто удалите position: absolute и измените верхнюю/левую сторону на margin-top и margin-left.

Возможно, вам захочется добавить поддержку браузера с помощью transform, -moz-transform и т.д.

Ответ 2

Старый вопрос, новый ответ:

Когда изображение больше, чем оберточный div, выравнивание по центру: центр или маржа: авто не будет работать. Но если изображение меньше, то решения с абсолютным позиционированием или отрицательным левым полем будут создавать странные эффекты.

Итак, когда размер изображения на самом деле не известен заранее (например, на CSM), и он может быть больше или меньше, чем div для обертывания, есть элегантное решение CSS3, которое служит всем целям:

div {
    display: flex;
    justify-content: center;
    height: 400px; /* or other desired height */
    overflow: hidden;
}
img {
    flex: none; /* keep aspect ratio */
}

Обратите внимание, что в зависимости от других правил в таблице стилей вам может потребоваться добавить ширину: auto и/или max-width: none к img.

Ответ 3

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

CSS

#container {
    height: 400px;
    width: 400px;
}
.image {
    background: white;
    width: 100%;
    height: 100%;
    position: relative;
    overflow: hidden;
}

.left {
    width: 100px;
    height: 100%;
    z-index: 2;
    background: white;
    top: 0px;
    position: absolute;
    left: 0px;
}
.right {
    width: 100px;
    height: 100%;
    z-index: 2;
    position: absolute;
    background: white;
    top: 0px;
    right: 0px;
}
.image img {
    margin: auto;
    display: block;
}

HTML

    <div id="container">
<div class="image">
    <div class="left"></div>
    <div class="right"></div>
    <img width="500" src="https://www.google.com.au/images/srpr/logo11w.png" />
</div>

См. скрипку

несколько другой метод: Fiddle

Ответ 4

Спасибо всем за вашу помощь. Я собираюсь считать это недостижимым только в CSS.

Я перейду к решению jQuery. Вот несколько [псевдо] кода для заинтересованных.

Я собирался отказаться от решения CSS, но похоже, что это можно сделать (см. принятый ответ). Вот решение JS, с которым я собирался пойти.

var $img = $('img'),
    w = $img.width();

$img.css({marginLeft: -w});

И сопровождающий css

img{
  position:absolute;
  left:50%;
}

Ответ 5

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

.parent {
    float: left;
    position: relative;
    width: 14.529%; // Adjust to your needs
}

.parent img {
    margin: auto;
    max-width: none; // this was needed for my particular instance
    position: absolute;
    top: 11px; right: -50%; bottom: 0; left: -50%;
    z-index: 0;
}

Ответ 6

Просто выполните инициализацию положения изображения следующим образом.

HTML:

<div> 
    <img id="img" src="/happy_cat.png"/> 
</div>

CSS:

#img {
    left: 0;
    right: 0;
}

Или посмотрите с margin: auto;

Это для горизонтального выравнивания. Чтобы выровнять его по вертикали, вы можете сделать display: table-cell; на <div> а затем vertical-align: middle;, но это не очень хорошая практика, потому что ваш <div> не является таблицей.