Оригинальный ответ:
Если вы готовы выбрать CSS3, вы можете использовать свойство css3 translate. Измените размер в зависимости от того, что больше. Если ваша высота больше, а ширина меньше контейнера, ширина будет увеличена до 100%, а высота будет обрезана с обеих сторон. То же самое и с большей шириной.
Ваша потребность, HTML:
<div class="img-wrap">
<img src="http://lorempixel.com/300/160/nature/" />
</div>
<div class="img-wrap">
<img src="http://lorempixel.com/300/200/nature/" />
</div>
<div class="img-wrap">
<img src="http://lorempixel.com/200/300/nature/" />
</div>
И CSS:
.img-wrap {
width: 200px;
height: 150px;
position: relative;
display: inline-block;
overflow: hidden;
margin: 0;
}
div > img {
display: block;
position: absolute;
top: 50%;
left: 50%;
min-height: 100%;
min-width: 100%;
transform: translate(-50%, -50%);
}
Вуаля! Работает: http://jsfiddle.net/shekhardesigner/aYrhG/
Объяснение
DIV установлен в relative
позицию. Это означает, что все дочерние элементы получат начальные координаты (исходные точки), откуда начинается этот DIV.
Изображение устанавливается как элемент BLOCK, min-width/height
оба значения установлены на 100%, что означает изменение размера изображения, независимо от его размера, как минимум 100% от его родительского элемента. min
это ключ. Если по min-height высота изображения превысила высоту родителя, проблем нет. Он будет искать if min-width и пытаться установить минимальную высоту, равную 100% от родителей. Оба варианта идут наоборот. Это гарантирует, что вокруг div нет пробелов, но изображение всегда немного больше и обрезаетсяoverflow:hidden;
Теперь image
он установлен в absolute
положение с помощью left:50%
и top:50%
. Значит, сдвиньте изображение на 50% сверху и слева, убедившись, что исходная точка взята из DIV. Левая / верхняя единицы отсчитываются от родительской.
Волшебный момент:
transform: translate(-50%, -50%);
Теперь эта translate
функция transform
свойства CSS3 перемещает / перемещает рассматриваемый элемент. Это свойство имеет дело с применяемым элементом, поэтому значения (x, y) OR (-50%, -50%) означают перемещение негативного изображения влево на 50% от размера изображения и перемещение к верхнему негативу на 50% размера изображения. .
Например. если размер изображения был transform:translate(-50%, -50%)
200 пикселей × 150 пикселей , будет рассчитан перевод (-100 пикселей, -75 пикселей). Единица% помогает, когда у нас есть изображения разного размера.
Это просто хитрый способ определить центроид изображения и родительского DIV и сопоставить их.
Приносим извинения за то, что слишком долго объясняли!
Ресурсы, чтобы узнать больше:
background-size: cover;
?