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

Как центрировать и обрезать изображение, чтобы всегда отображаться в квадратной форме с помощью CSS?

Мне нужно всегда обрезать изображение случайного размера до квадрата 160x160, используя только CSS. Изображения должны оставаться по центру при обрезке.

Моя разметка должна быть:

<a href="#" class="cropper">
   <img src="image" alt="description" />
</a>

Поиск в Qaru Я нашел несколько ответов (например, CSS - Как обрезать изображение до квадрата, если оно уже квадратное, а затем изменить его размер), но они не работают в тех случаях, когда Ваше изображение может быть больше по горизонтали (широко) или по вертикали (высоко).

В частности, я должен быть в состоянии представить оба широких изображения, как это:

wide image

и высокое изображение, подобное этому:

tall image

в квадратной форме, не зная заранее, какой из них горизонтальный или вертикальный. Он также должен поддерживать уже квадратные изображения.

4b9b3361

Ответ 1

Демоверсия jsFiddle

div
{
    width: 200px;
    height: 200px;
    overflow: hidden;
    margin: 10px;
    position: relative;
}
img {
    position: absolute;
    margin: auto; 
    min-height: 100%;
    min-width: 100%;

    /* For the following settings we set 100%, but it can be higher if needed 
    See the answer update */
    left: -100%;
    right: -100%;
    top: -100%;
    bottom: -100%;
}

Обновление - улучшение

Как Салман А упомянул в комментариях, исходное решение имеет недостаток - оно не работает, если высота или ширина img (или оба) (как минимум) в 3 раза * больше, чем содержащий div.

Проблема отображается здесь.

Салман также дал действительно простое и элегантное решение. Нам просто нужно обновить координаты позиции img (сверху, слева, снизу, справа), чтобы работать с более высокими процентами. Следующее исправление работает с 1000%, но, конечно, вы можете настроить его в соответствии с вашими потребностями.

рабочая версия показана здесь.

Before and after the fix

* Причина в том, что когда мы устанавливаем img влево и вправо (или: верх и низ) координаты равными -100% (от содержащего div), общая допустимая ширина (или: высота) img может быть равна самое большее 300% содержащей ширину div (или: высоту), потому что это сумма ширины div (или: высоты) и левой и правой (или: верхней и нижней) координат.

Ответ 2

Свойство object-fit делает волшебство. На JsFiddle.

CSS

.image {
  width: 160px;
  height: 160px;
}

.object-fit_fill {
  object-fit: fill
}

.object-fit_contain {
  object-fit: contain
}

.object-fit_cover {
  object-fit: cover
}

.object-fit_none {
  object-fit: none
}

.object-fit_scale-down {
  object-fit: scale-down
}

HTML

<div class="original-image">
  <p>original image</p>
  <img src="http://lorempixel.com/500/200">
</div>

<div class="image">
  <p>object-fit: fill</p>
  <img class="object-fit_fill" src="http://lorempixel.com/500/200">
</div>

<div class="image">
  <p>object-fit: contain</p>
  <img class="object-fit_contain" src="http://lorempixel.com/500/200">
</div>

<div class="image">
  <p>object-fit: cover</p>
  <img class="object-fit_cover" src="http://lorempixel.com/500/200">
</div>

<div class="image">
  <p>object-fit: none</p>
  <img class="object-fit_none" src="http://lorempixel.com/500/200">
</div>

<div class="image">
  <p>object-fit: scale-down</p>
  <img class="object-fit_scale-down" src="http://lorempixel.com/500/200">
</div>

Результат

How the rendered images look (in a browser that supports <code>object-fit</code>)

Ответ 3

<div>
    <img class="crop" src="http://lorempixel.com/500/200"/>
</div>

<img src="http://lorempixel.com/500/200"/>




div {
    width: 200px;
    height: 200px;
    overflow: hidden;
    margin: 10px;
    position: relative;
}
.crop {
    position: absolute;
    left: -100%;
    right: -100%;
    top: -100%;
    bottom: -100%;
    margin: auto; 
    height: auto;
    width: auto;
}

http://jsfiddle.net/J7a5R/56/

Ответ 4

С учетом того, что он не работает в IE и некоторых старых мобильных браузерах, простой object-fit: cover; часто является лучшим вариантом.

.cropper {
  position: relative;
  width: 100px;
  height: 100px;
  overflow: hidden;
}
.cropper img {
  position: absolute;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

Без поддержки object-fit: cover изображение будет странным образом растягиваться, чтобы соответствовать рамке, поэтому, если требуется поддержка IE, я бы рекомендовал использовать один из подходов с другими ответами с -100% сверху, слева, справа и нижние значения как запасной вариант.

http://caniuse.com/#feat=object-fit

Ответ 5

Попробуйте помещать изображение в контейнер следующим образом:

HTML:

<div>
    <img src="http://www.testimoniesofheavenandhell.com/Animal-Pictures/wp-content/uploads/2013/04/Dog-Animal-Picture-Siberian-Husky-Puppy-HD-Wallpaper.jpg" />
</div>

CSS

div
{
    width: 200px;
    height: 200px;
    overflow: hidden;
}

div > img
{
    width: 300px;
}

Здесь fiddle.

Ответ 6

clip свойство с position может помочь вам

a{
position:absolute;
clip:rect(0px,200px,200px,0px);
}

a img{
position:relative;
left:-50%;
top:-50%;
 }

РАБОЧИЙ FIDDLE

Ответ 7

HTML:

<div class="thumbnail">
</div>

CSS

.thumbnail { 
background: url(image.jpg) 50% 50% no-repeat; /* 50% 50% centers image in div */
width: 250px;
height: 250px;
}

Ответ 9

<div style="specify your dimension:overflow:hidden">
    <div style="margin-top:-50px">
       <img ...  />
    </div>
</div>

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

Чтобы обрезать снизу, просто укажите высоту внешнего div и удалите внутренний div. Примените тот же принцип к обрезке с боков.