Как да изрежете правоъгълно изображение в квадрат с CSS?

Знам, че е невъзможно действително да се промени изображение с CSS, поради което поставям изрязване в кавички.

Това, което бих искал да направя, е да взема правоъгълни изображения и да използвам CSS, за да изглеждат квадратни, без изобщо да изкривяват изображението.

По принцип бих искал да обърна това:

въведете описание на изображението тук

В това:

въведете описание на изображението тук


person novicePrgrmr    schedule 01.03.2013    source източник
comment
Тези изображения фонови изображения на divs ли са или е важно за SEO те да останат в таговете ‹img›?   -  person Michael    schedule 02.03.2013
comment
Опитахте ли нещо вече? Това е доста просто или с CSS3 background-position, или със старата обвивка div с overflow:hidden и изображение с относително позициониране.   -  person Fabrício Matté    schedule 02.03.2013
comment
Със сигурност може да са фонови изображения   -  person novicePrgrmr    schedule 02.03.2013
comment
Вижте моя отговор, мисля, че това е най-добрият ви вариант като цяло. Избягва позициониране на елементи.   -  person Michael    schedule 02.03.2013


Отговори (11)


Ако приемем, че не е задължително да са в IMG тагове...

HTML:

<div class="thumb1">
</div>

CSS:

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

.thumb1:hover { YOUR HOVER STYLES HERE }

РЕДАКТИРАНЕ: Ако div трябва да се свърже някъде, просто коригирайте HTML и стилове така:

HTML:

<div class="thumb1">
<a href="#">Link</a>
</div>

CSS:

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

.thumb1 a {
  display: block;
  width: 250px;
  height: 250px;
}

.thumb1 a:hover { YOUR HOVER STYLES HERE }

Обърнете внимание, че това също може да бъде променено, за да реагира, например % ширини и височини и т.н.

person Michael    schedule 01.03.2013
comment
това е хубав начин за позициониране И изрязване с един етикет. - person rlemon; 02.03.2013
comment
Обърнете внимание също, че при печат мастните браузъри деактивират фоновите изображения, за да не се показват. - person j08691; 02.03.2013
comment
Може да обработва и състояния :hover. Ако div трябва да се свърже някъде, просто добавете таг. Що се отнася до print, това може да се коригира с print.css? Поправете ме, ако греша? - person Michael; 02.03.2013
comment
Всъщност, ако трябва да бъда честен, в този случай с етикет A печатът ще има резервен вариант и във всеки случай бихте искали да добавите CSS стилове, за да коригирате това за печат така или иначе. - person Michael; 02.03.2013
comment
Наистина харесвам това решение, но не съм сигурен, че ще работи за responsive, нали? Опитах се да използвам % за ширина и височина и не работи. - person novicePrgrmr; 02.03.2013
comment
Няма значение, промених го на height: 460px; width: 100%; и работи като чар - person novicePrgrmr; 02.03.2013
comment
@Michael Мога да ви дам причина защо бихте искали да направите това: когато и правоъгълното изображение, и квадратното изображение са необходими на сайта в различни контексти. Ако искате да избегнете преоразмеряването на всички снимки във Photoshop, можете просто да качите една снимка, която да служи и за двете цели. - person Hendeca; 22.06.2014
comment
Можете също така да отбележите, че сега с HTML5 е възможно да обвиете <div> в <a> таг по този начин: <a href='#'><div>Hello</div></a>, което ще изчисти малко вашия CSS, тъй като няма да е необходимо да задавате размера и свойствата на дисплея! Не знам дали всички браузъри ще го компилират правилно (като IE). - person RaphBlanchet; 05.03.2015
comment
Всъщност това не е идеалното решение, защото напълно игнорира най-добрите практики за достъпност. Добре е само ако изображението наистина е фоново изображение. - person nydame; 07.01.2021

Чисто CSS решение без обвивка div или друг безполезен код:

img {
  object-fit: cover;
  width:230px;
  height:230px;
}
person Peter Kionga-Kamau    schedule 12.08.2016
comment
Имайте предвид, че това за съжаление не работи на IE и Edge atm. Вижте тук за повече подробности относно това: stackoverflow.com/a/37792830/1398056 - person baoutch; 18.08.2016
comment
какво е, ние не знаем височината, която искаме да направим квадратна с автоматична ширина - person Aravind Reddy; 08.02.2018
comment
Към юни 2018 г. изглежда само IE11 (2,71%) не поддържа приспособяване към обекти, достатъчно добро за мен. - person Ray; 18.06.2018
comment
Има ли начин да направите изображението еластично, докато браузърът преоразмерява? - person Ray; 18.06.2018
comment
@RayFan да, можете да използвате медийни заявки, за да посочите ширината/височината за вашите конкретни точки на прекъсване - person Peter Kionga-Kamau; 29.10.2018
comment
През 2019 г. поддръжката сега е доста добра. Само 2,3% все още използват IE 11. Това решение е толкова лесно, че не мога да не го използвам, защото другите са такава болка, че губих часове, опитвайки се да го накарам да работи с кода на бекенда. - person Paul Morris; 26.05.2019
comment
недостатък: страницата става бавна, когато има много изображения при използване на напасване на обект - person GorvGoyl; 12.11.2019
comment
Време е всички да забравим за IE - person iji; 04.02.2020

  1. Поставете вашето изображение в div.
  2. Дайте на вашия div изрични квадратни размери.
  3. Задайте свойството за препълване на CSS на div на скрито (overflow:hidden).
  4. Поставете въображението си в div.
  5. печалба.

Например:

<div style="width:200px;height:200px;overflow:hidden">
    <img src="foo.png" />
</div>
person j08691    schedule 01.03.2013
comment
Трябва да се уверите, че центрирате или поне да играете с позиционирането на изображението вътре. OP извадката изглежда центрирана (въпреки че просто споменах това и не очаквам изобщо да промените отговора си :P). - person rlemon; 02.03.2013
comment
@rlemon - тогава OP може да зададе позицията на div на относителна и позицията на изображението на абсолютна и да промени горните и левите атрибути. - person j08691; 02.03.2013
comment
Просто го споменавам, преди някой да е всичко; Но сега всичко е подравнено вляво! - :P - person rlemon; 02.03.2013
comment
Да, важно е да е центриран - person novicePrgrmr; 02.03.2013

Ако изображението е в контейнер с отзивчива ширина:

.rect-img-container {
  position: relative;
}

.rect-img-container::after {
  content: "";
  display: block;
  padding-bottom: 100%;
}

.rect-img {
  position: absolute;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
<div class="rect-img-container">
  <img class="rect-img" src="https://picsum.photos/id/0/367/267" alt="">
</div>

(редактиране: актуализиран от sass към обикновен css) (редактиране: Добавено фиктивно изображение за справка)

person JKL    schedule 03.05.2019
comment
Това наистина е хубаво. Освен това е невероятно гъвкав, тъй като след като изображението е поставено в квадрат, можете да го оградите в кръг и да правите други страхотни неща. - person Rocky Kev; 13.05.2020
comment
Не мога да ти кажа колко часа работа ми спести току-що. Много ти благодаря За всеки объркан, това вероятно е SASS/SCSS - Ако използвате чист CSS, тази публикация ви казва как да конвертирате: stackoverflow.com/questions/26760776/ - person Steve Allday; 13.09.2020
comment
Страхотен отговор. В моя случай имах anchor таг като контейнер, просто трябваше да добавя атрибут display: block, тъй като изображенията не се показваха първоначално. - person JCarlosR; 24.09.2020
comment
Конвертиране от SASS към CSS ` .img-container { position: relative; } .img-container::after { съдържание: ; дисплей: блок; подложка-отдолу: 100%; } .img-контейнер img { позиция: абсолютна; ширина: 100%; височина: 100%; обектно прилягане: покритие; ляво: 0; отгоре: 0; }` - person Captain Fantastic; 12.04.2021

Използване на background-size:cover - http://codepen.io/anon/pen/RNyKzB

CSS:

.image-container {
  background-image: url('http://i.stack.imgur.com/GA6bB.png');
  background-size:cover;
  background-repeat:no-repeat;
  width:250px;
  height:250px;
}  

Маркиране:

<div class="image-container"></div>
person Philip Nuzhnyy    schedule 23.02.2015
comment
Комбинирайки способността за центриране на отговора на mtronics, той работи добре дори в IE9. - person Faker; 16.02.2018

Всъщност наскоро се натъкнах на същия проблем и в крайна сметка използвах малко по-различен подход (не можах да използвам фонови изображения). Въпреки това изисква малко jQuery, за да се определи ориентацията на изображенията (сигурен съм, че вместо това можете да използвате обикновен JS).

Написах публикация в блог за това, ако се интересувате в повече обяснения, но кодът е доста прост:

HTML:

<ul class="cropped-images">
  <li><img src="http://fredparke.com/sites/default/files/cat-portrait.jpg" /></li>
  <li><img src="http://fredparke.com/sites/default/files/cat-landscape.jpg" /></li>
</ul>

CSS:

li {
  width: 150px; // Or whatever you want.
  height: 150px; // Or whatever you want.
  overflow: hidden;
  margin: 10px;
  display: inline-block;
  vertical-align: top;
}
li img {
  max-width: 100%;
  height: auto;
  width: auto;
}
li img.landscape {
  max-width: none;
  max-height: 100%;
}

jQuery:

$( document ).ready(function() {

    $('.cropped-images img').each(function() {
      if ($(this).width() > $(this).height()) {
        $(this).addClass('landscape');        
      }
    });

});
person FreddyBushBoy    schedule 25.02.2014
comment
Мисля, че това е по-добро от алтернативата на фона на CSS, защото изображенията са съдържание, а не стил, така че трябва да се съхраняват на HTML слоя. Освен това разполагането им в CSS вместо в HTML ще има ефект върху SEO на вашата уеб страница. Благодаря! - person Jose Florido; 06.11.2018
comment
Добра идея да подобрите това е да добавите $(this).load(function(){... във всеки цикъл, така че jQuery изчаква малко, докато изображението се зареди и получи реални размери на изображението. - person Jose Florido; 06.11.2018

object-fit: cover ще направи точно това, от което се нуждаете.

Но може да не работи на IE/Edge. Следвайте както е показано по-долу, за да го коригирате с само CSS, за да работи на всички браузъри.

Подходът, който предприех, беше да позиционирам изображението вътре в контейнера с absolute и след това да го поставя точно в центъра с помощта на комбинацията:

position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);

След като е в центъра, давам на изображението,

// For vertical blocks (i.e., where height is greater than width)
height: 100%;
width: auto;

// For Horizontal blocks (i.e., where width is greater than height)
height: auto;
width: 100%;

Това прави изображението да получи ефекта на Object-fit:cover.


Ето една демонстрация на горната логика.

https://jsfiddle.net/furqan_694/s3xLe1gp/

Тази логика работи във всички браузъри.


Оригинално изображение
Оригинално изображение

Вертикално изрязано
Вертикално изрязано изображение

Хоризонтално изрязано
Хоризонтално изрязано изображение


person Furqan Rahamath    schedule 06.03.2020

Имах подобен проблем и не можах да направя "компромис" с фонови изображения. Измислих това.

<div class="container">
    <img src="http://lorempixel.com/800x600/nature">
</div>

.container {
    position: relative;
    width: 25%; /* whatever width you want. I was implementing this in a 4 tile grid pattern. I used javascript to set height equal to width */
    border: 2px solid #fff; /* just to separate the images */
    overflow: hidden; /* "crop" the image */
    background: #000; /* incase the image is wider than tall/taller than wide */
}

.container img {
    position: absolute;
    display: block;
    height: 100%; /* all images at least fill the height */
    top: 50%; /* top, left, transform trick to vertically and horizontally center image */
    left: 50%;
    transform: translate3d(-50%,-50%,0);
}

//assuming you're using jQuery
var h = $('.container').outerWidth();
$('.container').css({height: h + 'px'});

Надявам се това да помогне!

Пример: https://jsfiddle.net/cfbuwxmr/1/

person Zach Botterman    schedule 06.04.2016

Използвайте CSS: препълване:

.thumb {
   width:230px;
   height:230px;
   overflow:hidden
}
person Diodeus - James MacFarlane    schedule 01.03.2013
comment
Тези размери не са много квадратни. :-) - person isherwood; 02.03.2013
comment
Не, прав си. да Просто повдигах съществуващата височина от размера на изображението на OP, като някой изгорял робот в петък следобед. - person Diodeus - James MacFarlane; 02.03.2013
comment
Той Х. Аз съм с теб там. :-) - person isherwood; 02.03.2013

Вижте CSS aspect-ratio

https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio

.square-image{
  width: 50%;
  background-image: url('https://picsum.photos/id/0/367/267');
  background-size: cover;
  background-position: center;
  aspect-ratio: 1/1;
}
<div class="square-image"></div>

NB: ВСЕ ОЩЕ НЕ СЕ ПОДДЪРЖА В MOZILLA FIREFOX (КЪМ 13 април 2021 г.)

person Ajith Gopi    schedule 13.04.2021
comment
това трябва да е правилният отговор - person Houcine; 21.04.2021

Или използвайте div с квадратни размери с изображението вътре с класа .testimg:

.test {
width: 307px;
height: 307px;
overflow:hidden
}

.testimg {
    margin-left: -76px

}

или квадратен div с фон на изображението.

.test2 {
width: 307px;
height: 307px;
    background: url(http://i.stack.imgur.com/GA6bB.png) 50% 50%
}

Ето няколко примера: http://jsfiddle.net/QqCLC/1/

АКТУАЛИЗИРАНО ТАКА, ЧЕ ЦЕНТРОВЕТЕ НА ИЗОБРАЖЕНИЕТО

.test {
  width: 307px;
  height: 307px;
  overflow: hidden
}

.testimg {
  margin-left: -76px
}

.test2 {
  width: 307px;
  height: 307px;
  background: url(http://i.stack.imgur.com/GA6bB.png) 50% 50%
}
<div class="test"><img src="http://i.stack.imgur.com/GA6bB.png" width="460" height="307" class="testimg" /></div>

<div class="test2"></div>

person tech292    schedule 01.03.2013