Как автоматически обрезать и центрировать изображение


159

Для любого произвольного изображения я хочу обрезать квадрат от центра изображения и отобразить его в пределах данного квадрата.

Этот вопрос похож на этот: CSS отображает изображение, измененное и обрезанное , но я не знаю размер изображения, поэтому я не могу использовать заданные поля.


1
Должен ли элемент быть тегом изображения, или это может быть div со свойством background-image?
Расс Ферри

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

Ответы:


320

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


Основной пример

.center-cropped {
  width: 100px;
  height: 100px;
  background-position: center center;
  background-repeat: no-repeat;
}
<div class="center-cropped" 
     style="background-image: url('http://placehold.it/200x200');">
</div>


Пример с imgтегом

Эта версия сохраняет imgтег, чтобы мы не теряли возможность перетаскивать или щелкать правой кнопкой мыши, чтобы сохранить изображение. Благодарим Паркера Беннетта за трюк с непрозрачностью.

.center-cropped {
  width: 100px;
  height: 100px;
  background-position: center center;
  background-repeat: no-repeat;
  overflow: hidden;
}

/* Set the image to fill its parent and make transparent */
.center-cropped img {
  min-height: 100%;
  min-width: 100%;
  /* IE 8 */
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
  /* IE 5-7 */
  filter: alpha(opacity=0);
  /* modern browsers */
  opacity: 0;
}
<div class="center-cropped" 
     style="background-image: url('http://placehold.it/200x200');">
  <img src="http://placehold.it/200x200" />
</div>


object-fit/-position

Смотрите поддерживаемые браузеры .

Спецификации CSS3 изображений определяют object-fitи object-positionсвойство , которые позволяют вместе для большего контроля над масштабом и положения содержания изображения в imgэлементе. С их помощью можно будет достичь желаемого эффекта:

.center-cropped {
  object-fit: none; /* Do not scale the image */
  object-position: center; /* Center the image within the element */
  height: 100px;
  width: 100px;
}
<img class="center-cropped" src="http://placehold.it/200x200" />


45
Вы можете использовать background-size: cover;изображение, чтобы уменьшить или заполнить div соответствующим образом, сохраняя при этом исходное соотношение сторон.
Ник

7
При использовании background-image вы должны добавить background-size: cover для правильного размера обрезанного изображения: см. Jsfiddle.net/bw6ct
Крис Эриксон

2
Я сказал , что Nowdays Google знает о прозрачных и скрытых изображений, так что img«s altмуравей titleатрибуты будут потеряны для SEO.
Виктор Сергиенко

6
в webkit вы также можете использовать object-fit: cover;непосредственно тег img, который выглядит немного более семантическим.
Бен

2
Я использовал объектную подгонку: обложка, чтобы получить желаемый эффект: не терять пропорции, не покрывать квадрат и не обрезать, если нужно
Даниэль Хандожо,

79

Я искал чистое решение CSS с использованием img тегов (а не фоновое изображение).

Я нашел этот блестящий способ достижения цели на миниатюрах обрезки с помощью CSS :

.thumbnail {
  position: relative;
  width: 200px;
  height: 200px;
  overflow: hidden;
}
.thumbnail img {
  position: absolute;
  left: 50%;
  top: 50%;
  height: 100%;
  width: auto;
  -webkit-transform: translate(-50%,-50%);
      -ms-transform: translate(-50%,-50%);
          transform: translate(-50%,-50%);
}
.thumbnail img.portrait {
  width: 100%;
  height: auto;
}

Это похоже на ответ @Nathan Redblur, но также учитывает портретные изображения.

Работает как шарм для меня. Единственное, что вам нужно знать об изображении - это портрет или пейзаж, чтобы установить .portraitкласс, поэтому мне пришлось использовать немного Javascript для этой части.


3
Просто учтите, что CSS-преобразования доступны только в IE 9 и выше.
Саймон Ист

5
Это должно быть ответом.
Уэс Модс

OP сказал «произвольное изображение», поэтому не знал бы заранее, было ли изображение выше, чем оно было широким.
Опять

11
Если вы установите min-height: 100%, min-width: 100%; вместо высоты: 100%; ширина: авто; вам не нужен класс img.portrait.
user570605

1
лучшее решение в сочетании с предложением @ user570605
albanx

45

Попробуйте это: установите размеры изображения и используйте эту строку в своем CSS:

object-fit: cover;

3
не очень хорошо поддерживается: caniuse.com/#feat=object-fit РЕДАКТИРОВАТЬ: фактически, как обычно, только браузеры MS терпят неудачу в этом ... это действительно представляет большую часть использования, хотя: /
Брайан Х.

1
Это именно то, что мне нужно :)
hcarreras

1
Единственными широко используемыми браузерами, которые не поддерживают это, являются Internet Explorer 11 и Edge. В зависимости от вашей аудитории, поддержка сейчас составляет около 85-90%, что может сделать это жизнеспособным для некоторых сценариев.
Хаски

король! классное решение !!
ижар

1
Вот хороший урок об этом: medium.com/@chrisnager/…
Пьетро Ла Гротта

23

Пример с imgтегом, но безbackground-image

Это решение сохраняет imgтег, чтобы мы не теряли возможность перетаскивать или щелкать правой кнопкой мыши, чтобы сохранить изображение, но без background-imageцентрирования и обрезки с помощью css.

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

(посмотреть в действии)

наценка

<div class="center-cropped">
    <img src="http://placehold.it/200x150" alt="" />
</div>

CSS

div.center-cropped {
  width: 100px;
  height: 100px;
  overflow:hidden;
}
div.center-cropped img {
  height: 100%;
  min-width: 100%;
  left: 50%;
  position: relative;
  transform: translateX(-50%);
}

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

9

Я создал директиву angularjs, используя ответы @ Russ's и @ Alex

Может быть интересно в 2014 году и далее: P

HTML

<div ng-app="croppy">
  <cropped-image src="http://placehold.it/200x200" width="100" height="100"></cropped-image>
</div>

JS

angular.module('croppy', [])
  .directive('croppedImage', function () {
      return {
          restrict: "E",
          replace: true,
          template: "<div class='center-cropped'></div>",
          link: function(scope, element, attrs) {
              var width = attrs.width;
              var height = attrs.height;
              element.css('width', width + "px");
              element.css('height', height + "px");
              element.css('backgroundPosition', 'center center');
              element.css('backgroundRepeat', 'no-repeat');
              element.css('backgroundImage', "url('" + attrs.src + "')");
          }
      }
  });

скриптовая ссылка


3
Привет даунотерс. Пожалуйста, оставьте комментарий, чтобы я мог обновить свой ответ, если есть ошибка. Я не люблю давать ложную информацию. Приветствия.
mraaroncruz

Не плохо, но это не англоязычный вопрос, и ваш ответ не имеет значения. @pferdefleisch
Мауберн

1
@Murn, что имеет смысл. Прошло 3 года, и сейчас это выглядит немного неуместно или неприятно. Я оставлю это, хотя, потому что положительные отзывы в моем комментарии говорят мне, что по крайней мере пара людей может найти это полезным (или они просто не любят понижающие голоса без комментариев).
mraaroncruz

2

Попробуй это:

#yourElementId
{
    background: url(yourImageLocation.jpg) no-repeat center center;
    width: 100px;
    height: 100px;
}

Имейте в виду , что widthи heightбудет работать только если ваш DOM элемент имеет раскладку (блок - элемент отображается, подобно divили img). Если это не так (диапазон, например), добавьте display: block;в правила CSS. Если у вас нет доступа к файлам CSS, удалите стили, встроенные в элемент.


в большинстве случаев этот CSS используется неоднократно с разными изображениями. поэтому, неизбежно установить фоновое изображение встроенным.
Хищник

0

Есть еще один способ обрезать изображение по центру:

.thumbnail{position: relative; overflow: hidden; width: 320px; height: 640px;}
.thumbnail img{
    position: absolute; top: -999px; bottom: -999px; left: -999px; right: -999px;
    width: auto !important; height: 100% !important; margin: auto;
}
.thumbnail img.vertical{width: 100% !important; height: auto !important;}

Единственное, что вам нужно, это добавить класс «вертикальный» к вертикальным изображениям, вы можете сделать это с помощью этого кода:

jQuery(function($) {
    $('img').one('load', function () {
        var $img = $(this);
        var tempImage1 = new Image();
        tempImage1.src = $img.attr('src');
        tempImage1.onload = function() {
            var ratio = tempImage1.width / tempImage1.height;
            if(!isNaN(ratio) && ratio < 1) $img.addClass('vertical');
        }
    }).each(function () {
        if (this.complete) $(this).load();
    });
});

Примечание: «! Important» используется для переопределения атрибутов width, height в теге img.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.