Jak automatycznie przyciąć i wyśrodkować obraz


158

Biorąc pod uwagę dowolny obraz, chcę wyciąć kwadrat ze środka obrazu i wyświetlić go w danym kwadracie.

To pytanie jest podobne do tego: CSS wyświetla obraz o zmienionym rozmiarze i przyciętym , ale nie znam rozmiaru obrazu, więc nie mogę użyć ustawionych marginesów.


1
Czy element musi być tagiem obrazu, czy może to być element div z właściwością background-image?
Russ Ferri,

tak długo, jak mogę ustawić obraz przez mój system szablonów, nie ma to znaczenia. trochę brzydkie, ale myślę, że style inline będą działać.
Jonathan Ong,

Odpowiedzi:


318

Jednym z rozwiązań jest użycie obrazu tła wyśrodkowanego w elemencie o rozmiarze odpowiadającym przyciętym wymiarom.


Podstawowy przykład

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


Przykład z imgtagiem

Ta wersja zachowuje imgtag, dzięki czemu nie tracimy możliwości przeciągania lub klikania prawym przyciskiem myszy, aby zapisać obraz. Podziękowania dla Parkera Bennetta za sztuczkę nieprzezroczystości.

.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

Zobacz obsługiwane przeglądarki .

Specyfikacja CSS3 Images definiuje właściwości object-fiti object-position, które razem pozwalają na większą kontrolę nad skalą i położeniem zawartości obrazu imgelementu. Dzięki nim możliwe będzie osiągnięcie pożądanego efektu:

.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
Możesz użyć, background-size: cover;aby odpowiednio zmniejszyć lub wypełnić obraz div z zachowaniem oryginalnych proporcji.
Nick

7
Używając obrazu tła, należy dodać background-size: cover, aby odpowiednio dopasować
Kris Erickson,

2
Powiedziano mi, że Google wie o dzisiejszych czasach przejrzystych i ukrytych obrazów, więc img„s altant titleatrybuty zostaną utracone na pozycjonowanie SEO.
Victor Sergienko,

6
w webkicie możesz też użyć object-fit: cover;bezpośrednio w tagu img, który wydaje się nieco bardziej semantyczny.
Ben

2
Użyłem Object-Fit: Cover, aby uzyskać pożądany efekt, nie tracąc proporcji, zakrywając kwadrat i przycinając w razie potrzeby
Daniel Handojo

79

Szukałem czystego rozwiązania CSS przy użyciu imgtagów (a nie sposobu na obraz tła).

Znalazłem genialny sposób na osiągnięcie celu na miniaturach przycinania za pomocą 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;
}

Jest podobny do odpowiedzi @Nathana Redblura, ale pozwala również na zdjęcia portretowe.

U mnie działa jak urok. Jedyne, co musisz wiedzieć o obrazie, to czy jest to portret, czy krajobraz, aby ustawić .portraitklasę, więc musiałem użyć trochę JavaScript w tej części.


3
Należy tylko pamiętać, że transformacje CSS są dostępne tylko w przeglądarce IE 9 i nowszych.
Simon East

5
To powinna być odpowiedź.
Wes Modes

OP powiedział „dowolny obraz”, więc nie wiedziałby z góry, gdyby obraz był wyższy niż szeroki.
opyate

11
Jeśli wpiszesz min-height: 100%; min-width: 100%; zamiast wysokości: 100%; szerokość: auto; nie potrzebujesz klasy img.portrait.
user570605

1
najlepsze rozwiązanie w połączeniu z sugestią @ user570605
albanx,

45

Spróbuj tego: ustaw wymiary przycięcia obrazu i użyj tej linii w swoim CSS:

object-fit: cover;

3
niezbyt dobrze obsługiwane: caniuse.com/#feat=object-fit EDYCJA: właściwie, jak zwykle, tylko przeglądarki MS zawodzą ... chociaż reprezentuje całkiem sporą część użycia: /
Brian H.

1
Robi dokładnie to, czego potrzebuję :)
hcarreras

1
Jedynymi szeroko używanymi przeglądarkami, które tego nie obsługują, są Internet Explorer 11 i Edge. W zależności od odbiorców, obecnie wsparcie wynosi prawdopodobnie około 85-90%, co może sprawić, że będzie to opłacalne w niektórych scenariuszach.
Husky

król! super rozwiązanie !!
itzhar

1
jest dobry poradnik na ten temat: medium.com/@chrisnager/…
Pietro La Grotta

23

Przykład z imgtagiem, ale bezbackground-image

To rozwiązanie zachowuje imgtag, dzięki czemu nie tracimy możliwości przeciągania lub klikania prawym przyciskiem myszy, aby zapisać obraz, ale bez background-imagetylko wyśrodkowania i przycięcia za pomocą css.

Utrzymuj proporcje dobrze, z wyjątkiem bardzo dużych obrazów. (sprawdź link)

(zobacz w akcji)

Narzut

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

Wypróbuj ten ... jeśli obraz jest mniejszy niż kontener, który będzie wyśrodkowany, w przeciwnym razie zostanie przycięty jsfiddle.net/3ts4rm24/1
KnF

8

Stworzyłem dyrektywę angularjs, używając odpowiedzi @ Russa i @ Alexa

Może być ciekawie w 2014 roku i później: 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 skrzypcowy


3
Hiya downvoters. Proszę zostaw komentarz, abym mógł zaktualizować moją odpowiedź, jeśli jest błąd. Nie lubię podawać fałszywych informacji. Twoje zdrowie.
mraaroncruz

Nie jest zwolennikiem przeciwnika, ale to nie jest pytanie Angulara, a Twoja odpowiedź jest nieistotna. @pferdefleisch
mawburn

1
@mburn to ma sens. Minęły 3 lata i to prawdopodobnie wygląda teraz trochę nie na miejscu lub okropnie. Zostawię to jednak, ponieważ głosy za moim komentarzem mówią mi, że przynajmniej kilka osób może uznać to za przydatne (lub po prostu nie lubią głosów przeciw bez komentarzy).
mraaroncruz

2

Spróbuj tego:

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

Pamiętaj o tym widthi heightbędzie działać tylko wtedy, gdy Twój element DOM ma układ (blok wyświetlany element, taki jak a divlub an img). Jeśli tak nie jest (na przykład rozpiętość), dodaj display: block;do reguł CSS. Jeśli nie masz dostępu do plików CSS, upuść style w elemencie.


w większości przypadków ten kod CSS jest używany wielokrotnie z różnymi obrazami. dlatego nieuniknione jest ustawienie wbudowanego obrazu tła.
Raptor

0

Istnieje inny sposób przycięcia obrazu w środku:

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

Jedyne, czego będziesz potrzebować, to dodać klasę „vertical” do obrazów pionowych, możesz to zrobić za pomocą tego kodu:

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

Uwaga: „! Important” jest używany do nadpisania możliwych atrybutów width i height w znaczniku img.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.