CSS Circular Cropping des Rechteckbildes

72

Ich möchte ein zentriertes kreisförmiges Bild aus einem Rechteckfoto machen. Die Abmessungen des Fotos sind unbekannt. Normalerweise ist es eine Rechteckform. Ich habe viele Methoden ausprobiert:

CSS:

.image-cropper {
    max-width: 100px;
    height: auto;
    position: relative;
    overflow: hidden;
}

.image-cropper img{
    display: block;
    margin: 0 auto;
    height: auto;
    width: 150%; 
    margin: 0 0 0 -20%;
    -webkit-border-radius: 50%;
    -moz-border-radius: 50%;
    -ms-border-radius: 50%;
    -o-border-radius: 50%;
    border-radius: 50%;  
}

HTML:

<div class="image-cropper">
    <img src="http://www.electricvelocity.com.au/Upload/Blogs/smart-e-bike-side_2.jpg" class="rounded" />
</div>
49volro
quelle
ich sitze gut ??? jsfiddle.net/7c9wjLy6/3
Manjunath Siddappa
Gibt es einen Grund, warum Sie den Rand zweimal mit unterschiedlichen Werten angegeben haben?
Gleenn
Vielleicht möchten Sie die Frage mit dem Entfernen von "Normalerweise" korrigieren, wenn dies der Fall ist, wird sie von keiner der CSS-Lösungen nicht abgeschnitten.
Dejan.S

Antworten:

103

Der Ansatz ist falsch, Sie müssen das border-radiusauf den Container divanstatt auf das eigentliche Bild anwenden .

Das würde funktionieren:

.image-cropper {
  width: 100px;
  height: 100px;
  position: relative;
  overflow: hidden;
  border-radius: 50%;
}

img {
  display: inline;
  margin: 0 auto;
  height: 100%;
  width: auto;
}
<div class="image-cropper">
  <img src="https://via.placeholder.com/150" class="rounded" />
</div>

Johnny Kutnowski
quelle
8
Verstanden. Aber warum ist das Bild nicht im Kreis zentriert?
49volro
1
Wahr. Ich denke, Hirals Lösung passt besser zu Ihren Anforderungen, und das Hintergrundbild kann von Wordpress problemlos dynamisch eingespeist werden. Aus irgendeinem Grund kann ich meine Lösung nicht mit Textausrichtung lösen: Mitte; Daher kann ich Ihnen im Moment nicht wirklich bei der Zentrierung helfen :(
Johnny Kutnowski
1
Diese Lösung funktioniert nicht mit Bildern im Querformat.
Wolfgang Ziegler
1
@ 49volro Wenn Sie möchten, dass das Bild zentriert wird, reicht ein linker Rand von -25% aus.
Cameron637
das macht das Bild schief
Peter der Russe
41

Die object-fitEigenschaft bietet hierfür eine nicht hackige Möglichkeit (mit Bildzentrierung). Es wird seit einigen Jahren in gängigen Browsern (Chrome / Safari seit 2013, Firefox seit 2015 und Edge seit 2015) mit Ausnahme von Internet Explorer unterstützt.

img.rounded {
  object-fit: cover;
  border-radius: 50%;
  height: 100px;
  width: 100px;
}
<img src="http://www.electricvelocity.com.au/Upload/Blogs/smart-e-bike-side_2.jpg" class="rounded">

Spender
quelle
1
Brillant! Ich liebe diese einfache Lösung in einem Schritt. Ich muss das imgaus dem von Ihnen bereitgestellten CSS entfernen und es als Klasse zum Bild hinzufügen, aber es hat wie ein Zauber funktioniert! Vielen Dank!
jord8on
23

Wenn Sie ohne das <img>Tag leben können , empfehle ich Ihnen, das Foto als Hintergrundbild zu verwenden.

.cropcircle{
    width: 250px;
    height: 250px;
    border-radius: 100%;
    background: #eee no-repeat center;
    background-size: cover;
}

#image1{
    background-image: url(http://www.voont.com/files/images/edit/7-ridiculous-ways-boost-self-esteem/happy.jpg);
}
<div id="image1" class="cropcircle"></div>

Tom
quelle
10

Versuche dies:

img {
    height: auto;
    width: 100%;
    -webkit-border-radius: 50%;
    -moz-border-radius: 50%;
    -ms-border-radius: 50%;
    -o-border-radius: 50%;
    border-radius: 50%;
}

DEMO hier.

ODER:

.rounded {
    height: 100px;
    width: 100px;
    -webkit-border-radius: 50%;
    -moz-border-radius: 50%;
    -ms-border-radius: 50%;
    -o-border-radius: 50%;
    border-radius: 50%;
    background:url("http://www.electricvelocity.com.au/Upload/Blogs/smart-e-bike-side_2.jpg") center no-repeat;
    background-size:cover;
}

DEMO hier.

Hiral
quelle
2
Ihre Demo ist nicht kreisförmig.
Paulie_D
Schön, aber ich kann es nicht verwenden, background-imageda die URL des Bildes Wordpress generiert. Kann ich schreiben : <div class="image-cropper"> <img class="rounded" style="background:url('http://www.electricvelocity.com.au/Upload/Blogs/smart-e-bike-side_2.jpg') center no-repeat; background-size:cover;" /> </div>?
49volro
@ 49volro In einem solchen Fall können Sie Folgendes schreiben: <div class = " round " style = "background-image: url ('image url')"> </ div> , entfernen Sie die Bild-URL aus css
Hiral
Das Beispiel hat bei mir funktioniert, außer dass es mein Bild in die Luft gesprengt hat. Es hat funktioniert, wenn ich das Bild in ein div-Tag eingefügt und die Bildabmessungen im div angegeben habe.
John D. Cook
Was ist, wenn Sie nicht als Hintergrundbild verwenden können, obwohl Ihr Beispiel nicht kreisförmig ist, ist es oval
Aravind Reddy
2

Johnnys Lösung ist gut. Ich fand, dass das Hinzufügen von min-width: 100% wirklich dazu beiträgt, dass Bilder den gesamten Kreis ausfüllen. Sie können dies mit einer Kombination aus JavaScript tun, um optimale Ergebnisse zu erzielen, oder ImageMagick - http://www.imagemagick.org/script/index.php verwenden, wenn Sie es wirklich ernst meinen.

.image-cropper {

  width: 35px;

  height: 35px;

  position: relative;

  overflow: hidden;

  border-radius: 50%;

}

.image-cropper__image {

  display: inline;

  margin: 0 auto;

  height: 100%;

  min-width: 100%;

}
<div class="image-cropper">
  <img src="#" class="image-cropper__image">
</div>

evanjmg
quelle
0

Ich weiß, dass viele der oben genannten Lösungen funktionieren. Sie können auch Flex ausprobieren.

Aber mein Bild war rechteckig und passte nicht richtig. Das habe ich also getan.

.parentDivClass {
    position: relative;
    height: 100px;
    width: 100px;
    overflow: hidden;
    border-radius: 50%;
    margin: 20px;
    display: flex;
    justify-content: center;
}

und für das Bild im Inneren können Sie verwenden,

child Img {
    display: block;
    margin: 0 auto;
    height: 100%;
    width: auto;
}

Dies ist hilfreich, wenn Sie Bootstrap 4-Klassen verwenden.

Akshay L.
quelle
0

Der beste Weg, dies zu tun, ist die Verwendung der neuen css object-fit(1) -Eigenschaft und des padding-bottom(2) -Hacks.

Sie benötigen ein Wrapper-Element um das Bild. Sie können verwenden, was Sie wollen, aber ich verwende gerne das neue HTML- pictureTag.

.rounded {
  display: block;
  width: 100%;
  height: 0;
  padding-bottom: 100%;
  border-radius: 50%;
  overflow: hidden;
}

.rounded img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}


/* These classes just used for demo */
.w25 {
  width: 25%;
}

.w50 {
  width: 50%;
}
<div class="w25">
<picture class="rounded">
  <img src="https://i.imgur.com/A8eQsll.jpg">
</picture>
</div>

<!-- example using a div -->
<div class="w50">
<div class="rounded">
  <img src="https://i.imgur.com/A8eQsll.jpg">
</div>
</div>

<picture class="rounded">
  <img src="https://i.imgur.com/A8eQsll.jpg">
</picture>

Verweise

  1. CSS Bildgröße, wie füllen, nicht dehnen?

  2. Pflegen Sie das Seitenverhältnis eines Div mit CSS

stldoug
quelle
-1

Fügen Sie das Bild und dann die Rückhand ein. Alles, was Sie brauchen, ist:

<style>
img {
  border-radius: 50%;
}
</style>

** Der Bildcode wird automatisch hier angezeigt **

Megan Rawls
quelle
Das OP wollte einen "Kreis", Ihr Beispiel rundet nur die Kanten ab. Wenn das Bild rechteckig ist, ist das Ergebnis ein Oval.
stldoug
-2

Sie müssen dazu jQuery verwenden. Dieser Ansatz gibt Ihnen die Möglichkeit, dynamische Bilder zu erstellen und diese unabhängig von der Größe zu erstellen.

Meine Demo hat momentan einen Fehler. Ich zentriere das Bild nicht im Container, sondern kehre in einer Minute zurück (ich muss ein Skript fertigstellen, an dem ich arbeite).

DEMO

<div class="container">
    <img src="" class="image" alt="lambo" />
</div>

//script
var container = $('.container'),
    image = container.find('img');

container.width(image.height());


//css    
.container {
    height: auto;
    overflow: hidden;
    border-radius: 50%;    
}

.image {
    height: 100%;    
    display: block;    
}
Dejan.S
quelle
1
Ich brauche jQuery definitiv nicht. Siehe akzeptierte Antwort oder @ Tom's
abettermap
@abettermap Diese Lösung hat keine dynamische Höhe, wenn Sie die Frage "Normalerweise ist es eine Rechteckform" lesen. Das heißt nicht immer, dafür bekomme ich die Bildhöhe mit Javascript. Der Seo-Wert geht mit der Toms-Lösung verloren. Lesen und denken Sie also am besten, bevor Sie abstimmen.
Dejan.S
Die Antworten mit background-imagehaben eine dynamische Höhe in dem Sinne, dass das Bild den kreisförmigen Raum unabhängig von der Höhe ausfüllt, was meiner Meinung nach das Ziel des OP war. Betreff: Best Practices, ich denke, einige könnten argumentieren, dass es Best Practice wäre, JS nicht für das Styling zu verwenden. Sie haben jedoch einen Punkt mit SEO, also werde ich Ihre Antwort bearbeiten. Fühlen Sie sich frei, weiter zu bearbeiten.
Abettermap