Come ritagliare e centrare automaticamente un'immagine


159

Dato qualsiasi immagine arbitraria, voglio ritagliare un quadrato dal centro dell'immagine e visualizzarlo all'interno di un dato quadrato.

Questa domanda è simile a questa: CSS Visualizza un'immagine ridimensionata e ritagliata , ma non conosco la dimensione dell'immagine, quindi non posso usare i margini impostati.


1
L'elemento deve essere un tag di immagine o può essere un div con una proprietà di immagine di sfondo?
Russ Ferri,

fintanto che posso impostare l'immagine attraverso il mio sistema di template, non importa. un po 'brutto, ma immagino che gli stili in linea funzioneranno.
Jonathan Ong,

Risposte:


319

Una soluzione consiste nell'utilizzare un'immagine di sfondo centrata all'interno di un elemento dimensionato in base alle dimensioni ritagliate.


Esempio di base

.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>


Esempio con img tag

Questa versione mantiene il imgtag in modo da non perdere la possibilità di trascinare o fare clic con il tasto destro per salvare l'immagine. Ringraziamo Parker Bennett per il trucco dell'opacità.

.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

Vedi i browser supportati .

La specifica CSS3 Images definisce le proprietà object-fite object-positionche insieme consentono un maggiore controllo sulla scala e sulla posizione del contenuto dell'immagine di un imgelemento. Con questi, sarà possibile ottenere l'effetto desiderato:

.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
È possibile utilizzare background-size: cover;per ridurre l'immagine o riempire il div in modo appropriato mantenendo le proporzioni originali.
Nick,

7
Quando si utilizza l'immagine di sfondo è necessario aggiungere la dimensione dello sfondo: copertina per ridimensionare correttamente l'immagine ritagliata: vedere jsfiddle.net/bw6ct
Kris Erickson,

2
Mi è stato detto che oggigiorno Google è a conoscenza di immagini trasparenti e nascoste, quindi imggli attributi di altformica titleandranno persi per il tuo SEO.
Victor Sergienko,

6
nel webkit puoi anche usare object-fit: cover;direttamente sul tag img che sembra un po 'più semantico.
Ben

2
Ho usato l'adattamento all'oggetto: copertina per ottenere l'effetto desiderato di non perdere le proporzioni, coprire il quadrato e ritagliare se necessario
Daniel Handojo

79

Stavo cercando una soluzione CSS pura utilizzando img tag (non il modo dell'immagine di sfondo).

Ho trovato questo modo geniale per raggiungere l'obiettivo sulle miniature delle colture con 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;
}

È simile alla risposta di @Nathan Redblur ma consente anche le immagini di ritratti.

Funziona come un incanto per me. L'unica cosa che devi sapere sull'immagine è se è orizzontale o verticale per impostare la .portraitclasse, quindi ho dovuto usare un po 'di Javascript per questa parte.


3
Basta essere consapevoli del fatto che le trasformazioni CSS sono disponibili solo in IE 9 e versioni successive.
Simon East,

5
Questa dovrebbe essere la risposta.
Modalità Wes,

OP ha detto "immagine arbitraria", quindi non saprei in anticipo se l'immagine fosse più alta di quanto fosse larga.
opyate,

11
Se inserisci altezza minima: 100%; larghezza minima: 100%; anziché altezza: 100%; larghezza: auto; non hai bisogno della classe img.portrait.
user570605

1
migliore soluzione combinata con il suggerimento @ user570605
albanx

45

Prova questo: imposta le dimensioni del ritaglio dell'immagine e usa questa linea nel tuo CSS:

object-fit: cover;

3
non molto ben supportato: caniuse.com/#feat=object-fit EDIT: in realtà, come al solito, solo i browser MS non riescono in questo ... tuttavia rappresenta un bel po 'di utilizzo: /
Brian H.

1
Questo fa esattamente quello che mi serve :)
hcarreras

1
Gli unici browser ampiamente utilizzati che non supportano questo sono Internet Explorer 11 e Edge. A seconda del pubblico, il supporto in questo momento è probabilmente intorno all'85-90%, il che potrebbe renderlo praticabile per alcuni scenari.
Husky,

re! soluzione fantastica !!
Itzhar

1
c'è un buon tutorial a riguardo: medium.com/@chrisnager/…
Pietro La Grotta

23

Esempio con imgtag ma senzabackground-image

Questa soluzione mantiene il imgtag in modo da non perdere la possibilità di trascinare o fare clic con il pulsante destro del mouse per salvare l'immagine, ma senza background-imagesolo centrare e ritagliare con CSS.

Mantieni bene le proporzioni, tranne che nelle immagini molto alte. (controlla il link)

(visualizza in azione)

markup

<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%);
}

Prova questo ... se l'immagine è più piccola del contenitore centrerà
KnF

8

Ho creato una direttiva angularjs usando le risposte di @ Russ e @ Alex

Potrebbe essere interessante nel 2014 e oltre: 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 + "')");
          }
      }
  });

link a violino


3
I downvoter Hiya. Si prega di lasciare un commento in modo da poter aggiornare la mia risposta in caso di errore. Non mi piace dare informazioni false. Saluti.
mraaroncruz,

Non un downvoter, ma questa non è una domanda angolare e la tua risposta è irrilevante. @pferdefleisch
mawburn

1
@mburn ha senso. Sono passati 3 anni e probabilmente questo sembra un po 'fuori posto o odioso ora. Lo lascerò comunque perché i voti sul mio commento mi dicono che almeno un paio di persone potrebbero trovarlo utile (o semplicemente non gradiscono i voti bassi senza commenti).
mraaroncruz,

2

Prova questo:

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

Tieni presente che widthe heightfunzionerà solo se il tuo elemento DOM ha un layout (un elemento visualizzato a blocchi, come a divo an img). In caso contrario (un intervallo, ad esempio), aggiungere display: block;alle regole CSS. Se non si ha accesso ai file CSS, rilasciare gli stili in linea nell'elemento.


nella maggior parte dei casi, questo CSS viene utilizzato ripetutamente con immagini diverse. pertanto, è inevitabile impostare l'immagine di sfondo in linea.
Raptor

0

Esiste un altro modo per ritagliare l'immagine centrata:

.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;}

L'unica cosa di cui avrai bisogno è aggiungere la classe "verticale" alle immagini verticali, puoi farlo con questo codice:

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();
    });
});

Nota: "! Important" è usato per sovrascrivere possibili attributi di larghezza, altezza sul tag img.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.