Як автоматично обрізати та центрувати зображення


158

З огляду на будь-яке довільне зображення, я хочу обрізати квадрат із центру зображення і відобразити його в межах заданого квадрата.

Це питання схоже на це: CSS Відображає розміри та обрізані зображення , але я не знаю розмір зображення, тому я не можу використовувати встановлені поля.


1
Чи повинен елемент бути тегом зображення чи це може бути поділка з властивістю background-image?
Russ Ferri

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

Відповіді:


318

Одним із варіантів є використання фонового зображення, зосередженого в межах елемента, розміщеного на обрізані розміри.


Основний приклад

.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 Images визначає властивості 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;зображення, щоб зменшити або заповнити діл належним чином, зберігаючи початкове співвідношення сторін.
Нік

7
Під час використання фонового зображення слід додати фоновий розмір: обкладинка для належного розміру обрізаного зображення: Див. Jsfiddle.net/bw6ct
Kris Erickson

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

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

2
Я використовував об'єкт: fit, щоб отримати бажаний ефект не втратити співвідношення сторін, покрити квадрат і обрізати, якщо потрібно
Daniel Handojo

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
Це має бути відповіддю.
Wes Modes

ОП заявила, що "довільне зображення", тому не знало б, якщо зображення було б вище, ніж широке.
opyate

11
Якщо покласти міні-висоту: 100%; міні-ширину: 100%; замість висоти: 100%; ширина: авто; вам не потрібен клас img.portrait.
user570605

1
найкраще рішення в поєднанні з пропозицією @ user570605
albanx

45

Спробуйте: Встановіть розміри обрізання зображення та використовуйте цей рядок у своєму CSS:

object-fit: cover;

3
не дуже добре підтримується: caniuse.com/#feat=object-fit EDIT: насправді, як завжди, лише веб-переглядачі MS не спрацьовують у цьому ... це все ж представляє собою цілий куточок використання, хоча: /
Брайан Х.

1
Це саме те, що мені потрібно :)
hcarreras

1
Єдині широко використовувані браузери, які не підтримують це, - Internet Explorer 11 та Edge. Залежно від вашої аудиторії, підтримка зараз, ймовірно, становить близько 85-90%, що може зробити це життєздатним у деяких сценаріях.
Хаскі

королю! приголомшливе рішення !!
ітжар

1
є хороший підручник з цього приводу: medium.com/@chrisnager/…
Pietro La Grotta

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

8

Я створив директиву angularjs, використовуючи відповіді @ Russ та @ 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
Hiya похідні. Залиште коментар, щоб я міг оновити свою відповідь, якщо є помилка. Мені не подобається давати неправдиву інформацію. Ура.
mraaroncruz

Це не прихильник, але це не кутове питання, і ваша відповідь не має значення. @pferdefleisch
mawburn

1
@mburn, що має сенс. Минуло 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();
    });
});

Примітка: "! Важливо" використовується для заміщення можливих атрибутів ширини та висоти на тезі img.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.